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

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.2     ! rico       31: /*  $Id$                                                            */
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: 
                    239: /* iniciar la pizarra de lecturas */
                    240: 
                    241: void IniciarPizarraLecturas()
                    242: {
                    243:     unsigned int i, j;
                    244: 
                    245:     /* relleno con FFFF...FFF (-1) */
                    246: 
                    247:     for(i=0; i<num_ubicaciones; i++)
                    248:     {
                    249:         for(j=0; j<configuracion.ventana; j++) pizarra_lecturas[i][j] = -1;
                    250:     }
                    251: 
                    252:     /*for(i=0; i<num_ubicaciones; i++)
                    253:     {
                    254:         printf("%s\t", datos[i].nombre);
                    255:         for(j=0; j<configuracion.ventana; j++) printf("%d ", pizarra_lecturas[i][j]);
                    256:         printf("\n");
                    257:     }*/
                    258: }
                    259: 
                    260: 
                    261: /* crea las pizarras en las que se anotan las dependencias de datos de cada ventana */
                    262: 
                    263: void CrearPizarras()
                    264: {
                    265:     /* las pizarras se crean de acuerdo a un listado de ubicaciones */
                    266:     CrearListadoUbicaciones();
                    267:         
                    268:     CrearPizarraEscrituras();
                    269:     CrearPizarraLecturas();
                    270: }
                    271: 
                    272: 
                    273: /* inicia las pizarras */
                    274: 
                    275: void IniciarPizarras()
                    276: {
                    277:         IniciarPizarraEscrituras();
                    278:         IniciarPizarraLecturas();
                    279: }
                    280: 
                    281: 
                    282: /* libera la memoria reservada para las pizarras */
                    283: 
                    284: void LiberarMemoriaPizarras()
                    285: {
                    286:     unsigned int i;
                    287:     
                    288:     /* libero el listado de ubicaciones con el que se han construido las pizarras */
                    289:     LiberarMemoriaListadoUbicaciones();
                    290: 
                    291:     free(pizarra_escrituras);
                    292:             
                    293:     for (i=0; i<num_ubicaciones; i++) free(pizarra_lecturas[i]);
                    294:     free(pizarra_lecturas);
                    295: }
                    296: 
                    297: 
                    298: /* crear el vector de dependencias */
                    299: 
                    300: void CrearVectorDependencias()
                    301: {
                    302:     char mensaje[MAX_LINE];
                    303: 
                    304:     vector = calloc(configuracion.ventana, sizeof (unsigned char));
                    305:     if (vector == NULL)
                    306:     {
                    307:         sprintf(mensaje, "[CrearVectorDependencias] Memoria insuficiente");
                    308:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    309:         /* el programa finaliza si no hay memoria suficiente */
                    310:     }
                    311: }
                    312: 
                    313: 
                    314: /* limpiar vector de dependencias */
                    315: 
                    316: void IniciarVectorDependencias()
                    317: {
                    318:     unsigned int i;
                    319: 
                    320:     for(i=0; i<configuracion.ventana; i++) vector[i] = 0;
                    321: }
                    322: 
                    323: 
                    324: /* liberar memoria del vector de dependencias */
                    325: 
                    326: void LiberarMemoriaVectorDependencias()
                    327: {
                    328:     free(vector);
                    329: }
                    330: 
                    331: 
                    332: 
                    333: /* genera un vector de dependencias para un tipo de dependencia y tipo de datos */
                    334: /* el resultado representa la SUMA con los valores previos del vector */
                    335: 
                    336: void GenerarVector(fichainstruccion *tarjetaoperandos, char iddepen, char idfuente)
                    337: {
                    338:     char mensaje[MAX_LINE];
                    339:     char listado[MAX_LISTA];
                    340:     char *elemento;
                    341:     int indice_ubi;
                    342:     unsigned int j;
                    343: 
                    344:     switch(idfuente)
                    345:     {
                    346:         case DATOSEXP:        /* datos explícitos */
                    347:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexpldatos);
                    348:         else strcpy(listado, tarjetaoperandos->escritoexpldatos);
                    349:         break;
                    350: 
                    351:         case DATOSIMP:        /* datos implícitos */
                    352:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimpldatos);
                    353:         else strcpy(listado, tarjetaoperandos->escritoimpldatos);
                    354:         break;
                    355: 
                    356:         case DIREXP:        /* direcciones explícitos */
                    357:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexpldir);
                    358:         else strcpy(listado, tarjetaoperandos->escritoexpldir);
                    359:         break;
                    360: 
                    361:         case DIRIMP:        /* direcciones implícitos */
                    362:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimpldir);
                    363:         else strcpy(listado, tarjetaoperandos->escritoimpldir);
                    364:         break;
                    365: 
                    366:         case PILAEXP:        /* pila explícitos */
                    367:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexplpila);
                    368:         else strcpy(listado, tarjetaoperandos->escritoexplpila);
                    369:         break;
                    370: 
                    371:         case PILAIMP:        /* pila implícitos */
                    372:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimplpila);
                    373:         else strcpy(listado, tarjetaoperandos->escritoimplpila);
                    374:         break;
                    375: 
                    376:         case CCEXP:         /* códigos de condición explícitos */
                    377:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoexplestado);
                    378:         else strcpy(listado, tarjetaoperandos->escritoexplestado);
                    379:         break;
                    380: 
                    381:         case CCIMP:         /* códigos de condición implícitos */
                    382:         if (iddepen == RW) strcpy(listado, tarjetaoperandos->leidoimplestado);
                    383:         else strcpy(listado, tarjetaoperandos->escritoimplestado);
                    384:         break;
                    385:     }
                    386: 
                    387:     elemento = strtok(listado, ":");    /* el separador de elementos de la lista es ':' */
                    388:     while(elemento != NULL)
                    389:     {
                    390:         indice_ubi = BDBuscarCadena(TABLA_UBICACIONES, CAMPO_NOMBRE, elemento);
                    391: 
                    392:         if(indice_ubi == -1)
                    393:         {
                    394:             /* emito un error al fichero de log */ 
                    395:             sprintf(mensaje, "[GenerarVector] La cadena '%s' no se ha encontrado en Tabla Ubicaciones", elemento);
                    396:             Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    397:         }
                    398: 
                    399:         switch(iddepen)
                    400:         {
                    401:             case RW:    /* verdadera o lectura después de escritura */
                    402:             if(pizarra_escrituras[indice_ubi] != -1)
                    403:             {
                    404:                 vector[pizarra_escrituras[indice_ubi]] += 1;
                    405:                 if(vector[pizarra_escrituras[indice_ubi]] == 0)
                    406:                 {
                    407:                     sprintf(mensaje, "[GenerarVector] La componente del vector de dependencias ha excedido el valor 255");
                    408:                     Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    409:                 }
                    410:             }
                    411:             break;
                    412: 
                    413:             case WR:    /* antidependencia o escritura después de lectura */
                    414:             /* pizarra_lecturas[i][j] -> i: ubicaciones; j: instrucciones */
                    415:             for(j=0; j<configuracion.ventana; j++)
                    416:             {
                    417:                 if(pizarra_lecturas[indice_ubi][j] == 1)
                    418:                 {
                    419:                     vector[j] += 1;
                    420:                     if(vector[j] == 0)
                    421:                     {
                    422:                         sprintf(mensaje, "[GenerarVector] La componente del vector de dependencias ha excedido el valor 255");
                    423:                         Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    424:                     }
                    425:                 }
                    426:             }
                    427:             break;
                    428: 
                    429:             case WW:    /* salida o escritura después de escritura */
                    430:             if(pizarra_escrituras[indice_ubi] != -1)
                    431:             {
                    432:                 vector[pizarra_escrituras[indice_ubi]] += 1;
                    433:                 if(vector[pizarra_escrituras[indice_ubi]] == 0)
                    434:                 {
                    435:                     sprintf(mensaje, "[GenerarVector] La componente del vector de dependencias ha excedido el valor 255");
                    436:                     Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    437:                 }
                    438:             }
                    439:             break;
                    440:         }
                    441:         /* capturo el siguiente campo */
                    442:         elemento = strtok(NULL, ":");
                    443:     }
                    444: }
                    445: 
                    446: 
                    447: /* traslada un vector de dependencias a la matriz indicada como parámetro */
                    448: /* en la posición indicada por el número de instrucción (índice) en la ventana */
                    449: 
                    450: void Vector2Matriz(unsigned char **matriz, unsigned int indice)
                    451: {
                    452:     char mensaje[MAX_LINE];
                    453:     unsigned int i;
                    454: 
                    455:     if(matriz == NULL)
                    456:     {
                    457:         sprintf(mensaje, "[Vector2Matriz] La matriz indicada no existe");
                    458:         Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    459:     }
                    460:     
                    461:     for(i=0; i<configuracion.ventana; i++) matriz[indice][i] = vector[i];
                    462: }
                    463: 
                    464: 
                    465: /* analiza todas las posibles dependencias de datos generando su vector */
                    466: /* de dependencias y almacenándolo en la matriz adecuada */
                    467: 
                    468: void AnalizarDependencias(fichainstruccion *tarjetaoperandos, unsigned int indice)
                    469: {
                    470:     /* evalúo las dependencias en el siguiente orden: verdaderas, anti y salida */
                    471:     /* dentro de cada fuente: explícitas y luego implícitas */
                    472:     /* dentro de cada origen por tipos: datos, direcciones, pila y estado */
                    473:     /* si no limpio el vector de dependencias éste lleva la SUMA de los precedentes */
                    474: 
                    475:     /* mapa de posibles matrices */
                    476:     /* tipo        origen    fuente */
                    477:     /*   SI          SI     SI     */
                    478:     /*   SI          SI     NO     */
                    479:     /*   SI          NO     NO     */
                    480:     /*   NO          NO     NO     */    /* -> por defecto no se desacopla nada */
                    481: 
                    482: 
                    483:     /* VERDADERAS */
                    484:     if(configuracion.verdaderas == SI)
                    485:     {
                    486:         if(configuracion.explicitos == SI)
                    487:         {
                    488:             if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, RW, DATOSEXP);
                    489:             /* for(i=0; i<configuracion.ventana; i++) printf("%d ", vector[i]); printf("\n"); */
                    490:             if(configuracion.desacoplartipos == SI && configuracion.datos == SI)
                    491:             {
                    492:                 Vector2Matriz(matriz.Ddatoexp, indice);
                    493:                 IniciarVectorDependencias();
                    494:             }
                    495:             if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, RW, DIREXP);
                    496:             if(configuracion.desacoplartipos == SI && configuracion.direcciones == SI)
                    497:             {
                    498:                 Vector2Matriz(matriz.Ddir_exp, indice);
                    499:                 IniciarVectorDependencias();
                    500:             }
                    501:             if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, RW, PILAEXP);
                    502:             if(configuracion.desacoplartipos == SI && configuracion.pila == SI)
                    503:             {
                    504:                 Vector2Matriz(matriz.Dpilaexp, indice);
                    505:                 IniciarVectorDependencias();
                    506:             }
                    507:             if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, RW, CCEXP);
                    508:             if(configuracion.desacoplartipos == SI && configuracion.cc == SI)
                    509:             {
                    510:                 Vector2Matriz(matriz.Destadoexp, indice);
                    511:                 IniciarVectorDependencias();
                    512:             }
                    513:         }
                    514:         if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
                    515:         {
                    516:             Vector2Matriz(matriz.Ddatoexp, indice);
                    517:             IniciarVectorDependencias();
                    518:         }
                    519:         if(configuracion.implicitos == SI)
                    520:         {
                    521:             if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, RW, DATOSIMP);
                    522:             if(configuracion.desacoplartipos == SI && configuracion.datos == SI)
                    523:             {
                    524:                 Vector2Matriz(matriz.Ddatoimp, indice);
                    525:                 IniciarVectorDependencias();
                    526:             }
                    527:             if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, RW, DIRIMP);
                    528:             if(configuracion.desacoplartipos == SI && configuracion.direcciones == SI)
                    529:             {
                    530:                 Vector2Matriz(matriz.Ddir_imp, indice);
                    531:                 IniciarVectorDependencias();
                    532:             }
                    533:             if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, RW, PILAIMP);
                    534:             if(configuracion.desacoplartipos == SI && configuracion.pila == SI)
                    535:             {
                    536:                 Vector2Matriz(matriz.Dpilaimp, indice);
                    537:                 IniciarVectorDependencias();
                    538:             }
                    539:             if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, RW, CCIMP);
                    540:             if(configuracion.desacoplartipos == SI && configuracion.cc == SI)
                    541:             {
                    542:                 Vector2Matriz(matriz.Destadoimp, indice);
                    543:                 IniciarVectorDependencias();
                    544:             }
                    545:         }
                    546:         if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
                    547:         {
                    548:             Vector2Matriz(matriz.Ddatoimp, indice);
                    549:             IniciarVectorDependencias();
                    550:         }
                    551:     }
                    552:     if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == SI)
                    553:     {
                    554:         Vector2Matriz(matriz.Ddatoexp, indice);
                    555:         IniciarVectorDependencias();
                    556:     }
                    557: 
                    558: 
                    559:     /* ANTIDEPENDENCIAS */
                    560:     if(configuracion.antidependencias == SI)
                    561:     {
                    562:         if(configuracion.explicitos == SI)
                    563:         {
                    564:             if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WR, DATOSEXP);
                    565:             if(configuracion.desacoplartipos == SI && configuracion.datos == SI)
                    566:             {
                    567:                 Vector2Matriz(matriz.ADdatoexp, indice);
                    568:                 IniciarVectorDependencias();
                    569:             }
                    570:             if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WR, DIREXP);
                    571:             if(configuracion.desacoplartipos == SI && configuracion.direcciones == SI)
                    572:             {
                    573:                 Vector2Matriz(matriz.ADdir_exp, indice);
                    574:                 IniciarVectorDependencias();
                    575:             }
                    576:             if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WR, PILAEXP);
                    577:             if(configuracion.desacoplartipos == SI && configuracion.pila == SI)
                    578:             {
                    579:                 Vector2Matriz(matriz.ADpilaexp, indice);
                    580:                 IniciarVectorDependencias();
                    581:             }
                    582: 
                    583:             if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WR, CCEXP);
                    584:             if(configuracion.desacoplartipos == SI && configuracion.cc == SI)
                    585:             {
                    586:                 Vector2Matriz(matriz.ADestadoexp, indice);
                    587:                 IniciarVectorDependencias();
                    588:             }
                    589:         }
                    590:         if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
                    591:         {
                    592:             Vector2Matriz(matriz.ADdatoexp, indice);
                    593:             IniciarVectorDependencias();
                    594:         }
                    595:         if(configuracion.implicitos == SI)
                    596:         {
                    597:             if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WR, DATOSIMP);
                    598:             if(configuracion.desacoplartipos == SI && configuracion.datos == SI)
                    599:             {
                    600:                 Vector2Matriz(matriz.ADdatoimp, indice);
                    601:                 IniciarVectorDependencias();
                    602:             }
                    603:             if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WR, DIRIMP);
                    604:             if(configuracion.desacoplartipos == SI && configuracion.direcciones == SI)
                    605:             {
                    606:                 Vector2Matriz(matriz.ADdir_imp, indice);
                    607:                 IniciarVectorDependencias();
                    608:             }
                    609:             if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WR, PILAIMP);
                    610:             if(configuracion.desacoplartipos == SI && configuracion.pila == SI)
                    611:             {
                    612:                 Vector2Matriz(matriz.ADpilaimp, indice);
                    613:                 IniciarVectorDependencias();
                    614:             }
                    615:             if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WR, CCIMP);
                    616:             if(configuracion.desacoplartipos == SI && configuracion.cc == SI)
                    617:             {
                    618:                 Vector2Matriz(matriz.ADestadoimp, indice);
                    619:                 IniciarVectorDependencias();
                    620:             }
                    621:         }                        
                    622:         if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
                    623:         {
                    624:             Vector2Matriz(matriz.ADdatoimp, indice);
                    625:             IniciarVectorDependencias();
                    626:         }
                    627:     }
                    628:     if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == SI)
                    629:     {
                    630:         Vector2Matriz(matriz.ADdatoexp, indice);
                    631:         IniciarVectorDependencias();
                    632:     }
                    633: 
                    634: 
                    635:     /* SALIDA */
                    636:     if(configuracion.salida == SI)
                    637:     {
                    638:         if(configuracion.explicitos == SI)
                    639:         {
                    640:             if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WW, DATOSEXP);
                    641:             if(configuracion.desacoplartipos == SI && configuracion.datos == SI)
                    642:             {
                    643:                 Vector2Matriz(matriz.Sdatoexp, indice);
                    644:                 IniciarVectorDependencias();
                    645:             }
                    646:             if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WW, DIREXP);
                    647:             if(configuracion.desacoplartipos == SI && configuracion.direcciones == SI)
                    648:             {
                    649:                 Vector2Matriz(matriz.Sdir_exp, indice);
                    650:                 IniciarVectorDependencias();
                    651:             }
                    652:             if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WW, PILAEXP);
                    653:             if(configuracion.desacoplartipos == SI && configuracion.pila == SI)
                    654:             {
                    655:                 Vector2Matriz(matriz.Spilaexp, indice);
                    656:                 IniciarVectorDependencias();
                    657:             }
                    658:             if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WW, CCEXP);
                    659:             if(configuracion.desacoplartipos == SI && configuracion.cc == SI)
                    660:             {
                    661:                 Vector2Matriz(matriz.Sestadoexp, indice);
                    662:                 IniciarVectorDependencias();
                    663:             }
                    664:         }
                    665:         if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
                    666:         {
                    667:             Vector2Matriz(matriz.Sdatoexp, indice);
                    668:             IniciarVectorDependencias();
                    669:         }
                    670:         if(configuracion.implicitos == SI)
                    671:         {
                    672:             if(configuracion.datos == SI) GenerarVector(tarjetaoperandos, WW, DATOSIMP);
                    673:             if(configuracion.desacoplartipos == SI && configuracion.datos == SI)
                    674:             {
                    675:                 Vector2Matriz(matriz.Sdatoimp, indice);
                    676:                 IniciarVectorDependencias();
                    677:             }
                    678:             if(configuracion.direcciones == SI) GenerarVector(tarjetaoperandos, WW, DIRIMP);
                    679:             if(configuracion.desacoplartipos == SI && configuracion.direcciones == SI)
                    680:             {
                    681:                 Vector2Matriz(matriz.Sdir_imp, indice);
                    682:                 IniciarVectorDependencias();
                    683:             }
                    684:             if(configuracion.pila == SI) GenerarVector(tarjetaoperandos, WW, PILAIMP);
                    685:             if(configuracion.desacoplartipos == SI && configuracion.pila == SI)
                    686:             {
                    687:                 Vector2Matriz(matriz.Spilaimp, indice);
                    688:                 IniciarVectorDependencias();
                    689:             }
                    690:             if(configuracion.cc == SI) GenerarVector(tarjetaoperandos, WW, CCIMP);
                    691:             if(configuracion.desacoplartipos == SI && configuracion.cc == SI)
                    692:             {
                    693:                 Vector2Matriz(matriz.Sestadoimp, indice);
                    694:                 IniciarVectorDependencias();
                    695:             }
                    696:         }                        
                    697:         if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == SI)
                    698:         {
                    699:             Vector2Matriz(matriz.Sdatoimp, indice);
                    700:             IniciarVectorDependencias();
                    701:         }
                    702:     }
                    703:     if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == SI)
                    704:     {
                    705:         Vector2Matriz(matriz.Sdatoexp, indice);
                    706:         IniciarVectorDependencias();
                    707:     }
                    708: 
                    709:     /* si no desacoplo por ningún concepto todo va a la matriz D */
                    710:     if(configuracion.desacoplartipos == NO && configuracion.desacoplarorigen == NO && configuracion.desacoplarfuentes == NO)
                    711:     {
                    712:         Vector2Matriz(matriz.D, indice);
                    713:         IniciarVectorDependencias();
                    714:     }
                    715: }
                    716: 
                    717: 
                    718: 
                    719: /* genera la matriz D a partir de las desacopladas */
                    720: 
                    721: void GenerarMatrizD()
                    722: {
                    723:     unsigned int i, j, dim;
                    724:     unsigned char suma;
                    725: 
                    726:     dim = configuracion.ventana;
                    727: 
                    728:     /* si no desacoplo por ningún concepto ya tengo la matriz D */
                    729:     /* en caso de que haya desacoplos debo SUMAR las matrices parciales para generar D */
                    730:     if(configuracion.desacoplartipos != NO || configuracion.desacoplarorigen != NO || configuracion.desacoplarfuentes != NO)
                    731:     {
                    732:         for(i=0; i<dim; i++)
                    733:         {
                    734:             for(j=0; j<dim; j++)
                    735:             {
                    736:                 suma = 0;
                    737:                 if(matriz.Ddatoexp != NULL) suma = suma + matriz.Ddatoexp[i][j];
                    738:                 if(matriz.Ddir_exp != NULL) suma = suma + matriz.Ddir_exp[i][j];
                    739:                 if(matriz.Dpilaexp != NULL) suma = suma + matriz.Dpilaexp[i][j];
                    740:                 if(matriz.Destadoexp != NULL) suma = suma + matriz.Destadoexp[i][j];
                    741:         
                    742:                 if(matriz.Ddatoimp != NULL) suma = suma + matriz.Ddatoimp[i][j];
                    743:                 if(matriz.Ddir_imp != NULL) suma = suma + matriz.Ddir_imp[i][j];
                    744:                 if(matriz.Dpilaimp != NULL) suma = suma + matriz.Dpilaimp[i][j];
                    745:                 if(matriz.Destadoimp != NULL) suma = suma + matriz.Destadoimp[i][j];
                    746: 
                    747:                 if(matriz.ADdatoexp != NULL) suma = suma + matriz.ADdatoexp[i][j];
                    748:                 if(matriz.ADdir_exp != NULL) suma = suma + matriz.ADdir_exp[i][j];
                    749:                 if(matriz.ADpilaexp != NULL) suma = suma + matriz.ADpilaexp[i][j];
                    750:                 if(matriz.ADestadoexp != NULL) suma = suma + matriz.ADestadoexp[i][j];
                    751:         
                    752:                 if(matriz.ADdatoimp != NULL) suma = suma + matriz.ADdatoimp[i][j];
                    753:                 if(matriz.ADdir_imp != NULL) suma = suma + matriz.ADdir_imp[i][j];
                    754:                 if(matriz.ADpilaimp != NULL) suma = suma + matriz.ADpilaimp[i][j];
                    755:                 if(matriz.ADestadoimp != NULL) suma = suma + matriz.ADestadoimp[i][j];
                    756: 
                    757:                 if(matriz.Sdatoexp != NULL) suma = suma + matriz.Sdatoexp[i][j];
                    758:                 if(matriz.Sdir_exp != NULL) suma = suma + matriz.Sdir_exp[i][j];
                    759:                 if(matriz.Spilaexp != NULL) suma = suma + matriz.Spilaexp[i][j];
                    760:                 if(matriz.Sestadoexp != NULL) suma = suma + matriz.Sestadoexp[i][j];
                    761:         
                    762:                 if(matriz.Sdatoimp != NULL) suma = suma + matriz.Sdatoimp[i][j];
                    763:                 if(matriz.Sdir_imp != NULL) suma = suma + matriz.Sdir_imp[i][j];
                    764:                 if(matriz.Spilaimp != NULL) suma = suma + matriz.Spilaimp[i][j];
                    765:                 if(matriz.Sestadoimp != NULL) suma = suma + matriz.Sestadoimp[i][j];
                    766: 
                    767:                 matriz.D[i][j] = suma;
                    768:             }
                    769:         }
                    770:     }
                    771: }
                    772: 
                    773: 
                    774: /* anota en la pizarra de escrituras las que realiza una instrucción */
                    775: /* en una lista de ubicaciones */
                    776: 
                    777: void AnotarListaEscrituras(char *listado, unsigned int indice)
                    778: {
                    779:     char mensaje[MAX_LINE];
                    780:     char *elemento;    
                    781:     int indice_ubi;
                    782:     
                    783:     elemento = strtok(listado, ":");    /* el separador de elementos de la lista es ':' */
                    784:     while(elemento != NULL)
                    785:     {
                    786:         indice_ubi = BDBuscarCadena(TABLA_UBICACIONES, CAMPO_NOMBRE, elemento);
                    787: 
                    788:         if(indice_ubi == -1)
                    789:         {
                    790:             /* emito un error al fichero de log */ 
                    791:             sprintf(mensaje, "[AnotarListaEscrituras] La cadena '%s' no se ha encontrado en Tabla Ubicaciones", elemento);
                    792:             Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    793:         }
                    794: 
                    795:         pizarra_escrituras[indice_ubi] = indice;
                    796:         
                    797:         /* capturo el siguiente campo */
                    798:         elemento = strtok(NULL, ":");
                    799:     }
                    800: }
                    801: 
                    802: /* anota en la pizarra de escrituras aquellas que realiza */
                    803: /* la instrucción, de todos los tipos y de todos los orígenes */
                    804: 
                    805: void AnotarEscrituras(fichainstruccion *tarjetaoperandos, unsigned int indice)
                    806: {
                    807:     char listado[MAX_LISTA];
                    808: 
                    809:     strcpy(listado, tarjetaoperandos->escritoexpldatos);
                    810:     AnotarListaEscrituras(listado, indice);
                    811: 
                    812:     strcpy(listado, tarjetaoperandos->escritoimpldatos);
                    813:     AnotarListaEscrituras(listado, indice);
                    814: 
                    815:     strcpy(listado, tarjetaoperandos->escritoexpldir);
                    816:     AnotarListaEscrituras(listado, indice);
                    817: 
                    818:     strcpy(listado, tarjetaoperandos->escritoimpldir);
                    819:     AnotarListaEscrituras(listado, indice);
                    820: 
                    821:     strcpy(listado, tarjetaoperandos->escritoexplpila);
                    822:     AnotarListaEscrituras(listado, indice);
                    823: 
                    824:     strcpy(listado, tarjetaoperandos->escritoimplpila);
                    825:     AnotarListaEscrituras(listado, indice);
                    826: 
                    827:     strcpy(listado, tarjetaoperandos->escritoexplestado);
                    828:     AnotarListaEscrituras(listado, indice);
                    829: 
                    830:     strcpy(listado, tarjetaoperandos->escritoimplestado);
                    831:     AnotarListaEscrituras(listado, indice);
                    832: }
                    833: 
                    834: 
                    835: /* anota en la pizarra de lecturas las que realiza una instrucción */
                    836: /* en una lista de ubicaciones */
                    837: 
                    838: void AnotarListaLecturas(char *listado, unsigned int indice)
                    839: {
                    840:     char mensaje[MAX_LINE];
                    841:     char *elemento;    
                    842:     int indice_ubi;
                    843:     
                    844:     elemento = strtok(listado, ":");    /* el separador de elementos de la lista es ':' */
                    845:     while(elemento != NULL)
                    846:     {
                    847:         indice_ubi = BDBuscarCadena(TABLA_UBICACIONES, CAMPO_NOMBRE, elemento);
                    848: 
                    849:         if(indice_ubi == -1)
                    850:         {
                    851:             /* emito un error al fichero de log */ 
                    852:             sprintf(mensaje, "[AnotarListaLecturas] La cadena '%s' no se ha encontrado en Tabla Ubicaciones", elemento);
                    853:             Notificar(mensaje, ERROR_SALIR, ECO_NO);
                    854:         }
                    855: 
                    856:         pizarra_lecturas[indice_ubi][indice] = 1;
                    857:         
                    858:         /* capturo el siguiente campo */
                    859:         elemento = strtok(NULL, ":");
                    860:     }
                    861: }
                    862: 
                    863: /* anota en la pizarra de lecturas aquellas que realiza */
                    864: /* la instrucción, de todos los tipos y de todos los orígenes */
                    865: 
                    866: void AnotarLecturas(fichainstruccion *tarjetaoperandos, unsigned int indice)
                    867: {
                    868:     char listado[MAX_LISTA];
                    869: 
                    870:     strcpy(listado, tarjetaoperandos->leidoexpldatos);
                    871:     AnotarListaLecturas(listado, indice);
                    872: 
                    873:     strcpy(listado, tarjetaoperandos->leidoimpldatos);
                    874:     AnotarListaLecturas(listado, indice);
                    875: 
                    876:     strcpy(listado, tarjetaoperandos->leidoexpldir);
                    877:     AnotarListaLecturas(listado, indice);
                    878: 
                    879:     strcpy(listado, tarjetaoperandos->leidoimpldir);
                    880:     AnotarListaLecturas(listado, indice);
                    881: 
                    882:     strcpy(listado, tarjetaoperandos->leidoexplpila);
                    883:     AnotarListaLecturas(listado, indice);
                    884: 
                    885:     strcpy(listado, tarjetaoperandos->leidoimplpila);
                    886:     AnotarListaLecturas(listado, indice);
                    887: 
                    888:     strcpy(listado, tarjetaoperandos->leidoexplestado);
                    889:     AnotarListaLecturas(listado, indice);
                    890: 
                    891:     strcpy(listado, tarjetaoperandos->leidoimplestado);
                    892:     AnotarListaLecturas(listado, indice);
                    893: }
                    894: 

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