Annotation of ADD_ver_10/AnalizadorDependencias.c, revision 1.2

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

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