Annotation of ADD_ver_10/AnalizadorDependencias.c, revision 1.1
1.1 ! rico 1: /********************************************************************/
! 2: /* AnalizadorDependencias.c */
! 3: /* */
! 4: /* Copyright (c) 1997-2006 Rafael Rico (rafael.rico@uah.es) */
! 5: /* */
! 6: /* This file is part of ADD version 5.10. */
! 7: /* */
! 8: /* ADD is free software; you can redistribute it and/or modify */
! 9: /* it under the terms of the GNU General Public License as */
! 10: /* published by the Free Software Foundation; either version 2 of */
! 11: /* the License, or (at your option) any later version. */
! 12: /* */
! 13: /* ADD is distributed in the hope that it will be useful, */
! 14: /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
! 15: /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
! 16: /* GNU General Public License for more details. */
! 17: /* */
! 18: /* You should have received a copy of the GNU General Public */
! 19: /* License along with ADD; if not, write to the Free Software */
! 20: /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA */
! 21: /* 02111-1307 USA */
! 22: /* */
! 23: /* --------------------------- History --------------------------- */
! 24: /* */
! 25: /* Revision 1.2. 01/2006 */
! 26: /* Added GPL License and JavaDoc style documentation */
! 27: /* */
! 28: /* Revision 1.1. 09/2005 */
! 29: /* Initial Revision */
! 30: /* */
! 31: /********************************************************************/
! 32:
! 33: /******************************************************************************/
! 34: /** MÓDULO: AnalizadorDependencias.c */
! 35: /** */
! 36: /** Este módulo contiene las funciones que permiten analizar dependencias */
! 37: /** de datos entre instrucciones. */
! 38: /******************************************************************************/
! 39: /** Fecha: 23 de septiembre de 2005 */
! 40: /******************************************************************************/
! 41:
! 42: /**@file AnalizadosDependencias.c
! 43: Este módulo contiene las funciones que permiten analizar dependencias
! 44: de datos entre instrucciones
! 45: */
! 46:
! 47: /**@author Sergio Alvarez Moreno
! 48: */
! 49:
! 50:
! 51:
! 52: #include <stdio.h>
! 53: #include <stdlib.h>
! 54: #include <string.h>
! 55:
! 56: #include "defines.h"
! 57: #include "tipos.h"
! 58:
! 59: #include "analizadordependencias.h"
! 60:
! 61:
! 62: /* configuracion */
! 63: extern struct argumentos configuracion;
! 64:
! 65: /* bases de datos */
! 66: extern unsigned int num_simbolos;
! 67: extern operando *simbolos;
! 68:
! 69: /* posibles ubicaciones de datos */
! 70: extern unsigned int num_ubicaciones;
! 71: extern ubicacion *datos;
! 72:
! 73: /* análisis de dependencias de datos */
! 74: extern int *pizarra_escrituras;
! 75: extern int **pizarra_lecturas;
! 76:
! 77: extern unsigned char *vector;
! 78:
! 79: extern struct punterosD matriz;
! 80:
! 81:
! 82:
! 83: /** ver relación de ContarUbicaciones y CrearListadoUbicaciones con NormalizarUbicacion
! 84:
! 85: @brief Cuento el número de posibles ubicaciones que cumplen con lo exigido en la
! 86: configuración (tipos admitidos)
! 87:
! 88: @return r como el valor de ubicaciones encontradas
! 89: */
! 90:
! 91: int ContarUbicaciones()
! 92: {
! 93: unsigned int i; /* los registros de las bases de datos comienzan en el índice 0 */
! 94: unsigned int r = 0; /* recuento de ubicaciones */
! 95: char listado[MAX_LISTA];
! 96: char *elemento; /* es un puntero a char para la función strtok */
! 97: char tipo;
! 98:
! 99: strcpy(listado, configuracion.listaubis);
! 100:
! 101: elemento = strtok(listado, ":"); /* el separador de elementos de la lista es ':' */
! 102: while(elemento != NULL)
! 103: {
! 104: tipo = atoi(elemento);
! 105: i = 0;
! 106: while(i<num_simbolos)
! 107: {
! 108: if (simbolos[i].tipo == tipo) r++;
! 109: i++;
! 110: }
! 111: /* capturo el siguiente campo */
! 112: elemento = strtok(NULL, ":");
! 113: }
! 114: return r;
! 115: }
! 116:
! 117:
! 118: /**
! 119:
! 120: @brief Construyo el listado de posibles ubicaciones sobre una tabla nueva
! 121: */
! 122:
! 123: void CrearListadoUbicaciones()
! 124: {
! 125: unsigned int i, r;
! 126: char mensaje[MAX_LINE];
! 127: char listado[MAX_LISTA];
! 128: char *elemento; /* es un puntero a char para la función strtok */
! 129: char tipo;
! 130:
! 131: /* doy valor a la variable global número total de ubicaciones */
! 132: num_ubicaciones = ContarUbicaciones();
! 133:
! 134: /* creo un listado de posibles ubicaciones */
! 135: datos = calloc(num_ubicaciones, sizeof (ubicacion));
! 136: if (datos == NULL)
! 137: {
! 138: sprintf(mensaje, "Memoria insuficiente");
! 139: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 140: /* el programa finaliza si no hay memoria suficiente */
! 141: }
! 142:
! 143: strcpy(listado, configuracion.listaubis);
! 144:
! 145: r = 0;
! 146: elemento = strtok(listado, ":"); /* el separador de elementos de la lista es ':' */
! 147: while(elemento != NULL)
! 148: {
! 149: tipo = atoi(elemento);
! 150: i = 0;
! 151: while(i<num_simbolos)
! 152: {
! 153: if (simbolos[i].tipo == tipo)
! 154: {
! 155: strcpy(datos[r].nombre, simbolos[i].simbolo);
! 156: r++;
! 157: }
! 158: i++;
! 159: }
! 160: /* capturo el siguiente campo */
! 161: elemento = strtok(NULL, ":");
! 162: }
! 163:
! 164: /* for(i=0; i<num_ubicaciones; i++) printf("%d\t%s\n", i, datos[i].nombre); */
! 165: }
! 166:
! 167:
! 168: /**
! 169:
! 170: @brief Libera la memoria reservada para el listado de ubicaciones
! 171: */
! 172:
! 173: void LiberarMemoriaListadoUbicaciones()
! 174: {
! 175: free(datos);
! 176: }
! 177:
! 178:
! 179:
! 180:
! 181:
! 182: /*@brief Busca una determinada ubicación de entre las que se dan en el listado de tipos
! 183: si no se encuentra devuelve el número total de posibles ubicaciones
! 184:
! 185: BDBuscarUbicacion(char *cadena) NO IMPLEMENTADA
! 186:
! 187: para buscar una determinada ubicación en el listado de posibles ubicaciones
! 188: utilizo la función int BDBuscarCadena(int idtabla, int idcampo, char *cadena)
! 189: con idtabla = TABLA_UBICACIONES e idcampo = CAMPO_NOMBRE */
! 190:
! 191:
! 192:
! 193:
! 194: /**
! 195: @brief Crear la pizarra de escrituras
! 196: */
! 197:
! 198: void CrearPizarraEscrituras()
! 199: {
! 200: char mensaje[MAX_LINE];
! 201:
! 202: pizarra_escrituras = calloc(num_ubicaciones, sizeof (int));
! 203: if (pizarra_escrituras == NULL)
! 204: {
! 205: sprintf(mensaje, "[CrearPizarraEscrituras] Memoria insuficiente");
! 206: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 207: /* el programa finaliza si no hay memoria suficiente */
! 208: }
! 209: }
! 210:
! 211:
! 212: /**
! 213: @brief Iniciar la pizarra de escrituras
! 214: */
! 215:
! 216: void IniciarPizarraEscrituras()
! 217: {
! 218: unsigned int i;
! 219:
! 220: /* relleno con FFFF...FFF (-1) */
! 221:
! 222: for(i=0; i<num_ubicaciones; i++) pizarra_escrituras[i] = -1;
! 223:
! 224: /*for(i=0; i<num_ubicaciones; i++) printf("%6s", datos[i].nombre); printf("\n");
! 225: for(i=0; i<num_ubicaciones; i++) printf("%6d", pizarra_escrituras[i]);*/
! 226: }
! 227:
! 228:
! 229: /**
! 230: @brief Crear la pizarra de lecturas
! 231: */
! 232:
! 233: void CrearPizarraLecturas()
! 234: {
! 235: char mensaje[MAX_LINE];
! 236: unsigned int i;
! 237:
! 238: /* 1º un puntero a entero por cada ubicación */
! 239: pizarra_lecturas = calloc(num_ubicaciones, sizeof(int *));
! 240: if (pizarra_lecturas == NULL)
! 241: {
! 242: sprintf(mensaje, "[CrearPizarraLecturas] Memoria insuficiente");
! 243: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 244: /* el programa finaliza si no hay memoria suficiente */
! 245: }
! 246: /* 2º un entero por cada instrucción en la ventana de instrucciones */
! 247: for(i=0; i<num_ubicaciones; i++)
! 248: {
! 249: pizarra_lecturas[i] = calloc(configuracion.ventana, sizeof(int));
! 250: if (pizarra_lecturas[i] == NULL)
! 251: {
! 252: sprintf(mensaje, "[CrearPizarraLecturas] Memoria insuficiente");
! 253: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 254: /* el programa finaliza si no hay memoria suficiente */
! 255: }
! 256: }
! 257: }
! 258:
! 259:
! 260: /**
! 261: @brief Iniciar la pizarra de lecturas
! 262: */
! 263:
! 264: void IniciarPizarraLecturas()
! 265: {
! 266: unsigned int i, j;
! 267:
! 268: /* relleno con FFFF...FFF (-1) */
! 269:
! 270: for(i=0; i<num_ubicaciones; i++)
! 271: {
! 272: for(j=0; j<configuracion.ventana; j++) pizarra_lecturas[i][j] = -1;
! 273: }
! 274:
! 275: /*for(i=0; i<num_ubicaciones; i++)
! 276: {
! 277: printf("%s\t", datos[i].nombre);
! 278: for(j=0; j<configuracion.ventana; j++) printf("%d ", pizarra_lecturas[i][j]);
! 279: printf("\n");
! 280: }*/
! 281: }
! 282:
! 283:
! 284: /**
! 285: @brief Crea las pizarras en las que se anotan las dependencias de datos de cada ventana
! 286: */
! 287:
! 288: void CrearPizarras()
! 289: {
! 290: /* las pizarras se crean de acuerdo a un listado de ubicaciones */
! 291: CrearListadoUbicaciones();
! 292:
! 293: CrearPizarraEscrituras();
! 294: CrearPizarraLecturas();
! 295: }
! 296:
! 297:
! 298: /**
! 299: @brief Inicia las pizarras
! 300: */
! 301:
! 302: void IniciarPizarras()
! 303: {
! 304: IniciarPizarraEscrituras();
! 305: IniciarPizarraLecturas();
! 306: }
! 307:
! 308:
! 309: /**
! 310: @brief Libera la memoria reservada para las pizarras
! 311: */
! 312:
! 313: void LiberarMemoriaPizarras()
! 314: {
! 315: unsigned int i;
! 316:
! 317: /* libero el listado de ubicaciones con el que se han construido las pizarras */
! 318: LiberarMemoriaListadoUbicaciones();
! 319:
! 320: free(pizarra_escrituras);
! 321:
! 322: for (i=0; i<num_ubicaciones; i++) free(pizarra_lecturas[i]);
! 323: free(pizarra_lecturas);
! 324: }
! 325:
! 326:
! 327: /**
! 328: @brief Crear el vector de dependencias
! 329: */
! 330:
! 331: void CrearVectorDependencias()
! 332: {
! 333: char mensaje[MAX_LINE];
! 334:
! 335: vector = calloc(configuracion.ventana, sizeof (unsigned char));
! 336: if (vector == NULL)
! 337: {
! 338: sprintf(mensaje, "[CrearVectorDependencias] Memoria insuficiente");
! 339: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 340: /* el programa finaliza si no hay memoria suficiente */
! 341: }
! 342: }
! 343:
! 344:
! 345: /**
! 346: @brief Limpiar vector de dependencias
! 347: */
! 348:
! 349: void IniciarVectorDependencias()
! 350: {
! 351: unsigned int i;
! 352:
! 353: for(i=0; i<configuracion.ventana; i++) vector[i] = 0;
! 354: }
! 355:
! 356:
! 357: /**
! 358: @brief Liberar memoria del vector de dependencias
! 359: */
! 360:
! 361: void LiberarMemoriaVectorDependencias()
! 362: {
! 363: free(vector);
! 364: }
! 365:
! 366:
! 367:
! 368: /**
! 369: @brief Genera un vector de dependencias para un tipo de dependencia y tipo de datos
! 370: el resultado representa la SUMA con los valores previos del vector
! 371: @param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion
! 372: @param iddepen: Cadena de caracteres que indica el identificador del tipo de dependencia que se quiere generar el vector (WW, WR. RW)
! 373: @param idfuente: Cadena de caracteres que indica el identificador del fuente del cual se quiere generar el vector (DATOSEXP,DATOSIMP,DIREXP,DIRIMP,PILAEXP,PILAIMP,CCEXP)
! 374: */
! 375:
! 376: void GenerarVector(fichainstruccion *tarjetaoperandos, char iddepen, char idfuente)
! 377: {
! 378: char mensaje[MAX_LINE];
! 379: char listado[MAX_LISTA];
! 380: char *elemento;
! 381: int indice_ubi;
! 382: unsigned int j;
! 383:
! 384: switch(idfuente)
! 385: {
! 386: case DATOSEXP: /* datos explícitos */
! 387: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexpldatos);
! 388: else strcpy(listado, tarjetaoperandos->escritoexpldatos);
! 389: break;
! 390:
! 391: case DATOSIMP: /* datos implícitos */
! 392: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimpldatos);
! 393: else strcpy(listado, tarjetaoperandos->escritoimpldatos);
! 394: break;
! 395:
! 396: case DIREXP: /* direcciones explícitos */
! 397: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexpldir);
! 398: else strcpy(listado, tarjetaoperandos->escritoexpldir);
! 399: break;
! 400:
! 401: case DIRIMP: /* direcciones implícitos */
! 402: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimpldir);
! 403: else strcpy(listado, tarjetaoperandos->escritoimpldir);
! 404: break;
! 405:
! 406: case PILAEXP: /* pila explícitos */
! 407: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexplpila);
! 408: else strcpy(listado, tarjetaoperandos->escritoexplpila);
! 409: break;
! 410:
! 411: case PILAIMP: /* pila implícitos */
! 412: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimplpila);
! 413: else strcpy(listado, tarjetaoperandos->escritoimplpila);
! 414: break;
! 415:
! 416: case CCEXP: /* códigos de condición explícitos */
! 417: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexplestado);
! 418: else strcpy(listado, tarjetaoperandos->escritoexplestado);
! 419: break;
! 420:
! 421: case CCIMP: /* códigos de condición implícitos */
! 422: if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimplestado);
! 423: else strcpy(listado, tarjetaoperandos->escritoimplestado);
! 424: break;
! 425: }
! 426:
! 427: elemento = strtok(listado, ":"); /* el separador de elementos de la lista es ':' */
! 428: while(elemento != NULL)
! 429: {
! 430: indice_ubi = BDBuscarCadena(TABLA_UBICACIONES, CAMPO_NOMBRE, elemento);
! 431:
! 432: if(indice_ubi == -1)
! 433: {
! 434: /* emito un error al fichero de log */
! 435: sprintf(mensaje, "[GenerarVector] La cadena '%s' no se ha encontrado en Tabla Ubicaciones", elemento);
! 436: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 437: }
! 438:
! 439: switch(iddepen)
! 440: {
! 441: case RW: /* verdadera o lectura después de escritura */
! 442: if(pizarra_escrituras[indice_ubi] != -1)
! 443: {
! 444: vector[pizarra_escrituras[indice_ubi]] += 1;
! 445: if(vector[pizarra_escrituras[indice_ubi]] == 0)
! 446: {
! 447: sprintf(mensaje, "[GenerarVector] La componente del vector de dependencias ha excedido el valor 255");
! 448: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 449: }
! 450: }
! 451: break;
! 452:
! 453: case WR: /* antidependencia o escritura después de lectura */
! 454: /* pizarra_lecturas[i][j] -> i: ubicaciones; j: instrucciones */
! 455: for(j=0; j<configuracion.ventana; j++)
! 456: {
! 457: if(pizarra_lecturas[indice_ubi][j] == 1)
! 458: {
! 459: vector[j] += 1;
! 460: if(vector[j] == 0)
! 461: {
! 462: sprintf(mensaje, "[GenerarVector] La componente del vector de dependencias ha excedido el valor 255");
! 463: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 464: }
! 465: }
! 466: }
! 467: break;
! 468:
! 469: case WW: /* salida o escritura después de escritura */
! 470: if(pizarra_escrituras[indice_ubi] != -1)
! 471: {
! 472: vector[pizarra_escrituras[indice_ubi]] += 1;
! 473: if(vector[pizarra_escrituras[indice_ubi]] == 0)
! 474: {
! 475: sprintf(mensaje, "[GenerarVector] La componente del vector de dependencias ha excedido el valor 255");
! 476: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 477: }
! 478: }
! 479: break;
! 480: }
! 481: /* capturo el siguiente campo */
! 482: elemento = strtok(NULL, ":");
! 483: }
! 484: }
! 485:
! 486:
! 487: /**
! 488: @brief Traslada un vector de dependencias a la matriz indicada como parámetro
! 489: en la posición indicada por el número de instrucción (índice) en la ventana
! 490:
! 491: @param **matriz: Matriz a la cual se le va a trasladar el vector
! 492: @param indice: Posición dentro de la matriz en la cual se va a trasladar el vector
! 493: */
! 494:
! 495: void Vector2Matriz(unsigned char **matriz, unsigned int indice)
! 496: {
! 497: char mensaje[MAX_LINE];
! 498: unsigned int i;
! 499:
! 500: if(matriz == NULL)
! 501: {
! 502: sprintf(mensaje, "[Vector2Matriz] La matriz indicada no existe");
! 503: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 504: }
! 505:
! 506: for(i=0; i<configuracion.ventana; i++) matriz[indice][i] = vector[i];
! 507: }
! 508:
! 509:
! 510: /**
! 511: @brief Analiza todas las posibles dependencias de datos generando su vector
! 512: de dependencias y almacenándolo en la matriz adecuada
! 513:
! 514: @param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion
! 515: @param indice: posición de la matriz en la cual se va a analizar la dependencia
! 516: */
! 517:
! 518: void AnalizarDependencias(fichainstruccion *tarjetaoperandos, unsigned int indice)
! 519: {
! 520: /* evalúo las dependencias en el siguiente orden: verdaderas, anti y salida */
! 521: /* dentro de cada fuente: explícitas y luego implícitas */
! 522: /* dentro de cada origen por tipos: datos, direcciones, pila y estado */
! 523: /* si no limpio el vector de dependencias éste lleva la SUMA de los precedentes */
! 524:
! 525: /* mapa de posibles matrices */
! 526: /* fuente origen tipo */
! 527: /* SI SI SI */
! 528: /* SI SI NO */
! 529: /* SI NO NO */
! 530: /* NO NO NO */
! 531:
! 532:
! 533: /* VERDADERAS */
! 534: if(configuracion.verdaderas == SI)
! 535: {
! 536: if(configuracion.explicitos == SI)
! 537: {
! 538: if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, RW, DATOSEXP);
! 539: /* for(i=0; i<configuracion.ventana; i++) printf("%d ", vector[i]); printf("\n"); */
! 540: if(configuracion.desacoplartipos == SI)
! 541: {
! 542: Vector2Matriz(matriz.Ddatoexp, indice);
! 543: IniciarVectorDependencias();
! 544: }
! 545: if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, RW, DIREXP);
! 546: if(configuracion.desacoplartipos == SI)
! 547: {
! 548: Vector2Matriz(matriz.Ddir_exp, indice);
! 549: IniciarVectorDependencias();
! 550: }
! 551: if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, RW, PILAEXP);
! 552: if(configuracion.desacoplartipos == SI)
! 553: {
! 554: Vector2Matriz(matriz.Dpilaexp, indice);
! 555: IniciarVectorDependencias();
! 556: }
! 557: if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, RW, CCEXP);
! 558: if(configuracion.desacoplartipos == SI)
! 559: {
! 560: Vector2Matriz(matriz.Destadoexp, indice);
! 561: IniciarVectorDependencias();
! 562: }
! 563: }
! 564: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
! 565: {
! 566: Vector2Matriz(matriz.Ddatoexp, indice);
! 567: IniciarVectorDependencias();
! 568: }
! 569: if(configuracion.implicitos == SI)
! 570: {
! 571: if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, RW, DATOSIMP);
! 572: if(configuracion.desacoplartipos == SI)
! 573: {
! 574: Vector2Matriz(matriz.Ddatoimp, indice);
! 575: IniciarVectorDependencias();
! 576: }
! 577: if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, RW, DIRIMP);
! 578: if(configuracion.desacoplartipos == SI)
! 579: {
! 580: Vector2Matriz(matriz.Ddir_imp, indice);
! 581: IniciarVectorDependencias();
! 582: }
! 583: if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, RW, PILAIMP);
! 584: if(configuracion.desacoplartipos == SI)
! 585: {
! 586: Vector2Matriz(matriz.Dpilaimp, indice);
! 587: IniciarVectorDependencias();
! 588: }
! 589: if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, RW, CCIMP);
! 590: if(configuracion.desacoplartipos == SI)
! 591: {
! 592: Vector2Matriz(matriz.Destadoimp, indice);
! 593: IniciarVectorDependencias();
! 594: }
! 595: }
! 596: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
! 597: {
! 598: Vector2Matriz(matriz.Ddatoimp, indice);
! 599: IniciarVectorDependencias();
! 600: }
! 601: }
! 602: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == SI)
! 603: {
! 604: Vector2Matriz(matriz.Ddatoexp, indice);
! 605: IniciarVectorDependencias();
! 606: }
! 607:
! 608:
! 609: /* ANTIDEPENDENCIAS */
! 610: if(configuracion.antidependencias == SI)
! 611: {
! 612: if(configuracion.explicitos == SI)
! 613: {
! 614: if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WR, DATOSEXP);
! 615: if(configuracion.desacoplartipos == SI)
! 616: {
! 617: Vector2Matriz(matriz.ADdatoexp, indice);
! 618: IniciarVectorDependencias();
! 619: }
! 620: if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WR, DIREXP);
! 621: if(configuracion.desacoplartipos == SI)
! 622: {
! 623: Vector2Matriz(matriz.ADdir_exp, indice);
! 624: IniciarVectorDependencias();
! 625: }
! 626: if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WR, PILAEXP);
! 627: if(configuracion.desacoplartipos == SI)
! 628: {
! 629: Vector2Matriz(matriz.ADpilaexp, indice);
! 630: IniciarVectorDependencias();
! 631: }
! 632:
! 633: if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WR, CCEXP);
! 634: if(configuracion.desacoplartipos == SI)
! 635: {
! 636: Vector2Matriz(matriz.ADestadoexp, indice);
! 637: IniciarVectorDependencias();
! 638: }
! 639: }
! 640: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
! 641: {
! 642: Vector2Matriz(matriz.ADdatoexp, indice);
! 643: IniciarVectorDependencias();
! 644: }
! 645: if(configuracion.implicitos == SI)
! 646: {
! 647: if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WR, DATOSIMP);
! 648: if(configuracion.desacoplartipos == SI)
! 649: {
! 650: Vector2Matriz(matriz.ADdatoimp, indice);
! 651: IniciarVectorDependencias();
! 652: }
! 653: if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WR, DIRIMP);
! 654: if(configuracion.desacoplartipos == SI)
! 655: {
! 656: Vector2Matriz(matriz.ADdir_imp, indice);
! 657: IniciarVectorDependencias();
! 658: }
! 659: if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WR, PILAIMP);
! 660: if(configuracion.desacoplartipos == SI)
! 661: {
! 662: Vector2Matriz(matriz.ADpilaimp, indice);
! 663: IniciarVectorDependencias();
! 664: }
! 665: if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WR, CCIMP);
! 666: if(configuracion.desacoplartipos == SI)
! 667: {
! 668: Vector2Matriz(matriz.ADestadoimp, indice);
! 669: IniciarVectorDependencias();
! 670: }
! 671: }
! 672: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
! 673: {
! 674: Vector2Matriz(matriz.ADdatoimp, indice);
! 675: IniciarVectorDependencias();
! 676: }
! 677: }
! 678: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == SI)
! 679: {
! 680: Vector2Matriz(matriz.ADdatoexp, indice);
! 681: IniciarVectorDependencias();
! 682: }
! 683:
! 684:
! 685: /* SALIDA */
! 686: if(configuracion.salida == SI)
! 687: {
! 688: if(configuracion.explicitos == SI)
! 689: {
! 690: if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WW, DATOSEXP);
! 691: if(configuracion.desacoplartipos == SI)
! 692: {
! 693: Vector2Matriz(matriz.Sdatoexp, indice);
! 694: IniciarVectorDependencias();
! 695: }
! 696: if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WW, DIREXP);
! 697: if(configuracion.desacoplartipos == SI)
! 698: {
! 699: Vector2Matriz(matriz.Sdir_exp, indice);
! 700: IniciarVectorDependencias();
! 701: }
! 702: if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WW, PILAEXP);
! 703: if(configuracion.desacoplartipos == SI)
! 704: {
! 705: Vector2Matriz(matriz.Spilaexp, indice);
! 706: IniciarVectorDependencias();
! 707: }
! 708: if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WW, CCEXP);
! 709: if(configuracion.desacoplartipos == SI)
! 710: {
! 711: Vector2Matriz(matriz.Sestadoexp, indice);
! 712: IniciarVectorDependencias();
! 713: }
! 714: }
! 715: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
! 716: {
! 717: Vector2Matriz(matriz.Sdatoexp, indice);
! 718: IniciarVectorDependencias();
! 719: }
! 720: if(configuracion.implicitos == SI)
! 721: {
! 722: if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WW, DATOSIMP);
! 723: if(configuracion.desacoplartipos == SI)
! 724: {
! 725: Vector2Matriz(matriz.Sdatoimp, indice);
! 726: IniciarVectorDependencias();
! 727: }
! 728: if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WW, DIRIMP);
! 729: if(configuracion.desacoplartipos == SI)
! 730: {
! 731: Vector2Matriz(matriz.Sdir_imp, indice);
! 732: IniciarVectorDependencias();
! 733: }
! 734: if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WW, PILAIMP);
! 735: if(configuracion.desacoplartipos == SI)
! 736: {
! 737: Vector2Matriz(matriz.Spilaimp, indice);
! 738: IniciarVectorDependencias();
! 739: }
! 740: if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WW, CCIMP);
! 741: if(configuracion.desacoplartipos == SI)
! 742: {
! 743: Vector2Matriz(matriz.Sestadoimp, indice);
! 744: IniciarVectorDependencias();
! 745: }
! 746: }
! 747: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
! 748: {
! 749: Vector2Matriz(matriz.Sdatoimp, indice);
! 750: IniciarVectorDependencias();
! 751: }
! 752: }
! 753: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == SI)
! 754: {
! 755: Vector2Matriz(matriz.Sdatoexp, indice);
! 756: IniciarVectorDependencias();
! 757: }
! 758:
! 759: /* si no desacoplo por ningún concepto todo va a la matriz D */
! 760: if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == NO)
! 761: {
! 762: Vector2Matriz(matriz.D, indice);
! 763: IniciarVectorDependencias();
! 764: }
! 765: }
! 766:
! 767:
! 768:
! 769: /**
! 770: @brief Genera la matriz D a partir de las desacopladas
! 771: */
! 772:
! 773: void GenerarMatrizD()
! 774: {
! 775: unsigned int i, j, dim;
! 776: unsigned char suma;
! 777:
! 778: dim = configuracion.ventana;
! 779:
! 780: /* si no desacoplo por ningún concepto ya tengo la matriz D */
! 781: /* en caso de que haya desacoplos debo SUMAR las matrices parciales para generar D */
! 782: if(configuracion.desacoplartipos != NO || configuracion.desacoplarorigen != NO || configuracion.desacoplarfuentes != NO)
! 783: {
! 784: for(i=0; i<dim; i++)
! 785: {
! 786: for(j=0; j<dim; j++)
! 787: {
! 788: suma = 0;
! 789: if(matriz.Ddatoexp != NULL) suma = suma + matriz.Ddatoexp[i][j];
! 790: if(matriz.Ddir_exp != NULL) suma = suma + matriz.Ddir_exp[i][j];
! 791: if(matriz.Dpilaexp != NULL) suma = suma + matriz.Dpilaexp[i][j];
! 792: if(matriz.Destadoexp != NULL) suma = suma + matriz.Destadoexp[i][j];
! 793:
! 794: if(matriz.Ddatoimp != NULL) suma = suma + matriz.Ddatoimp[i][j];
! 795: if(matriz.Ddir_imp != NULL) suma = suma + matriz.Ddir_imp[i][j];
! 796: if(matriz.Dpilaimp != NULL) suma = suma + matriz.Dpilaimp[i][j];
! 797: if(matriz.Destadoimp != NULL) suma = suma + matriz.Destadoimp[i][j];
! 798:
! 799: if(matriz.ADdatoexp != NULL) suma = suma + matriz.ADdatoexp[i][j];
! 800: if(matriz.ADdir_exp != NULL) suma = suma + matriz.ADdir_exp[i][j];
! 801: if(matriz.ADpilaexp != NULL) suma = suma + matriz.ADpilaexp[i][j];
! 802: if(matriz.ADestadoexp != NULL) suma = suma + matriz.ADestadoexp[i][j];
! 803:
! 804: if(matriz.ADdatoimp != NULL) suma = suma + matriz.ADdatoimp[i][j];
! 805: if(matriz.ADdir_imp != NULL) suma = suma + matriz.ADdir_imp[i][j];
! 806: if(matriz.ADpilaimp != NULL) suma = suma + matriz.ADpilaimp[i][j];
! 807: if(matriz.ADestadoimp != NULL) suma = suma + matriz.ADestadoimp[i][j];
! 808:
! 809: if(matriz.Sdatoexp != NULL) suma = suma + matriz.Sdatoexp[i][j];
! 810: if(matriz.Sdir_exp != NULL) suma = suma + matriz.Sdir_exp[i][j];
! 811: if(matriz.Spilaexp != NULL) suma = suma + matriz.Spilaexp[i][j];
! 812: if(matriz.Sestadoexp != NULL) suma = suma + matriz.Sestadoexp[i][j];
! 813:
! 814: if(matriz.Sdatoimp != NULL) suma = suma + matriz.Sdatoimp[i][j];
! 815: if(matriz.Sdir_imp != NULL) suma = suma + matriz.Sdir_imp[i][j];
! 816: if(matriz.Spilaimp != NULL) suma = suma + matriz.Spilaimp[i][j];
! 817: if(matriz.Sestadoimp != NULL) suma = suma + matriz.Sestadoimp[i][j];
! 818:
! 819: matriz.D[i][j] = suma;
! 820: }
! 821: }
! 822: }
! 823: }
! 824:
! 825:
! 826: /**
! 827: @brief Anota en la pizarra de escrituras las que realiza una instrucción
! 828: en una lista de ubicaciones
! 829:
! 830: @param *listado: Cadena de caracteres que indican las operaciones que hace la instruccion
! 831: @param indice: Posición dentro de la matriz que ocupa dicha operaciones con su dependencia correspondiente
! 832: */
! 833:
! 834: void AnotarListaEscrituras(char *listado, unsigned int indice)
! 835: {
! 836: char mensaje[MAX_LINE];
! 837: char *elemento;
! 838: int indice_ubi;
! 839:
! 840: elemento = strtok(listado, ":"); /* el separador de elementos de la lista es ':' */
! 841: while(elemento != NULL)
! 842: {
! 843: indice_ubi = BDBuscarCadena(TABLA_UBICACIONES, CAMPO_NOMBRE, elemento);
! 844:
! 845: if(indice_ubi == -1)
! 846: {
! 847: /* emito un error al fichero de log */
! 848: sprintf(mensaje, "[AnotarListaEscrituras] La cadena '%s' no se ha encontrado en Tabla Ubicaciones", elemento);
! 849: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 850: }
! 851:
! 852: pizarra_escrituras[indice_ubi] = indice;
! 853:
! 854: /* capturo el siguiente campo */
! 855: elemento = strtok(NULL, ":");
! 856: }
! 857: }
! 858:
! 859: /**
! 860: @brief Anota en la pizarra de escrituras aquellas que realiza
! 861: la instrucción, de todos los tipos y de todos los orígenes
! 862:
! 863: @param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion
! 864: @param indice: Posición dentro de la matriz
! 865: */
! 866:
! 867: void AnotarEscrituras(fichainstruccion *tarjetaoperandos, unsigned int indice)
! 868: {
! 869: char listado[MAX_LISTA];
! 870:
! 871: strcpy(listado, tarjetaoperandos->escritoexpldatos);
! 872: AnotarListaEscrituras(listado, indice);
! 873:
! 874: strcpy(listado, tarjetaoperandos->escritoimpldatos);
! 875: AnotarListaEscrituras(listado, indice);
! 876:
! 877: strcpy(listado, tarjetaoperandos->escritoexpldir);
! 878: AnotarListaEscrituras(listado, indice);
! 879:
! 880: strcpy(listado, tarjetaoperandos->escritoimpldir);
! 881: AnotarListaEscrituras(listado, indice);
! 882:
! 883: strcpy(listado, tarjetaoperandos->escritoexplpila);
! 884: AnotarListaEscrituras(listado, indice);
! 885:
! 886: strcpy(listado, tarjetaoperandos->escritoimplpila);
! 887: AnotarListaEscrituras(listado, indice);
! 888:
! 889: strcpy(listado, tarjetaoperandos->escritoexplestado);
! 890: AnotarListaEscrituras(listado, indice);
! 891:
! 892: strcpy(listado, tarjetaoperandos->escritoimplestado);
! 893: AnotarListaEscrituras(listado, indice);
! 894: }
! 895:
! 896:
! 897: /**
! 898: @brief Anota en la pizarra de lecturas las que realiza una instrucción
! 899: en una lista de ubicaciones
! 900:
! 901: @param *listado: Cadena de caracteres que indican las operaciones que hace la instruccion
! 902: @param indice: Posición dentro de la matriz que ocupa dicha operaciones con su dependencia correspondiente
! 903:
! 904: */
! 905:
! 906: void AnotarListaLecturas(char *listado, unsigned int indice)
! 907: {
! 908: char mensaje[MAX_LINE];
! 909: char *elemento;
! 910: int indice_ubi;
! 911:
! 912: elemento = strtok(listado, ":"); /* el separador de elementos de la lista es ':' */
! 913: while(elemento != NULL)
! 914: {
! 915: indice_ubi = BDBuscarCadena(TABLA_UBICACIONES, CAMPO_NOMBRE, elemento);
! 916:
! 917: if(indice_ubi == -1)
! 918: {
! 919: /* emito un error al fichero de log */
! 920: sprintf(mensaje, "[AnotarListaLecturas] La cadena '%s' no se ha encontrado en Tabla Ubicaciones", elemento);
! 921: Notificar(mensaje, ERROR_SALIR, ECO_NO);
! 922: }
! 923:
! 924: pizarra_lecturas[indice_ubi][indice] = 1;
! 925:
! 926: /* capturo el siguiente campo */
! 927: elemento = strtok(NULL, ":");
! 928: }
! 929: }
! 930:
! 931: /**
! 932: @brief Anota en la pizarra de lecturas aquellas que realiza
! 933: la instrucción, de todos los tipos y de todos los orígenes
! 934:
! 935: @param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion
! 936: @param indice: Posición dentro de la matriz
! 937: */
! 938:
! 939: void AnotarLecturas(fichainstruccion *tarjetaoperandos, unsigned int indice)
! 940: {
! 941: char listado[MAX_LISTA];
! 942:
! 943: strcpy(listado, tarjetaoperandos->leidoexpldatos);
! 944: AnotarListaLecturas(listado, indice);
! 945:
! 946: strcpy(listado, tarjetaoperandos->leidoimpldatos);
! 947: AnotarListaLecturas(listado, indice);
! 948:
! 949: strcpy(listado, tarjetaoperandos->leidoexpldir);
! 950: AnotarListaLecturas(listado, indice);
! 951:
! 952: strcpy(listado, tarjetaoperandos->leidoimpldir);
! 953: AnotarListaLecturas(listado, indice);
! 954:
! 955: strcpy(listado, tarjetaoperandos->leidoexplpila);
! 956: AnotarListaLecturas(listado, indice);
! 957:
! 958: strcpy(listado, tarjetaoperandos->leidoimplpila);
! 959: AnotarListaLecturas(listado, indice);
! 960:
! 961: strcpy(listado, tarjetaoperandos->leidoexplestado);
! 962: AnotarListaLecturas(listado, indice);
! 963:
! 964: strcpy(listado, tarjetaoperandos->leidoimplestado);
! 965: AnotarListaLecturas(listado, indice);
! 966: }
! 967:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>