Annotation of ADD_ver_10/Source Code/Source Files/AnalizadorDependencias.c, revision 1.3

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>