Diff for /ADD_ver_10/Attic/CalcularCiclos.c between versions 1.1 and 1.2

version 1.1, 2006/01/19 17:16:29 version 1.2, 2006/02/15 13:00:30
Line 1 Line 1
 /********************************************************************/  
 /*  CalcularCiclos.c                                                */  
 /*                                                                  */  
 /*  Copyright (c) 1997-2006 Rafael Rico      (rafael.rico@uah.es)   */  
 /*                                                                  */  
 /*  This file is part of ADD version 5.10.                          */  
 /*                                                                  */  
 /*  ADD is free software; you can redistribute it and/or modify     */  
 /*  it under the terms of the GNU General Public License as         */  
 /*  published by the Free Software Foundation; either version 2 of  */  
 /*  the License, or (at your option) any later version.             */  
 /*                                                                  */  
 /*  ADD is distributed in the hope that it will be useful,          */  
 /*  but WITHOUT ANY WARRANTY; without even the implied warranty of  */  
 /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   */  
 /*  GNU General Public License for more details.                    */  
 /*                                                                  */  
 /*  You should have received a copy of the GNU General Public       */  
 /*  License along with ADD; if not, write to the Free Software      */  
 /*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA        */  
 /*  02111-1307  USA                                                 */  
 /*                                                                  */  
 /*  --------------------------- History --------------------------- */  
 /*                                                                  */  
 /*  Revision 1.2. 01/2006                                           */  
 /*  Added GPL License and JavaDoc style documentation               */  
 /*                                                                  */  
 /*  Revision 1.1. 09/2005                                           */  
 /*  Initial Revision                                                */  
 /*                                                                  */  
 /********************************************************************/  
   
 /******************************************************************************/  /******************************************************************************/
 /* MÓDULO: CalcularCiclos.c                                                   */  /* MÓDULO: CalcularCiclos.c                                                   */
 /*                                                                            */  /*                                                                            */
Line 70  extern double cpimedio; Line 38  extern double cpimedio;
 char ComputarDireccion(char *cadena)  char ComputarDireccion(char *cadena)
 {  {
     int id;      int id;
         char ciclos_tiempo;      char ciclos_tiempo;
         int desplazamiento = NO;      int desplazamiento = NO;
         char mensaje[MAX_LINE];      char mensaje[MAX_LINE];
   
         switch(cadena[0])      switch(cadena[0])
     {      {
         case '\0':    /* sin operando; aquí se supone que no debería entrar */          case '\0':    /* sin operando; aquí se supone que no debería entrar */
                 ciclos_tiempo = 0;          ciclos_tiempo = 0;
         break;          break;
   
         case '[':    /* operando memoria */          case '[':    /* operando memoria */
         if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]");    /* es un desplazamiento absoluto */          if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]");    /* es un desplazamiento absoluto */
                 else            /* ubicaciones de memoria basadas en registros */          else        /* ubicaciones de memoria basadas en registros */
         {          {
                         if(cadena[3]==']')              /* registro base o índice solamente */              if(cadena[3]==']')        /* registro base o índice solamente */
                         {              {
                                 if(cadena[4]=='\0') desplazamiento = NO;                  if(cadena[4]=='\0') desplazamiento = NO;
                                 else desplazamiento = SI;                  else desplazamiento = SI;
                                 cadena[4]='\0';         /* termino la cadena sin del posible desplazamiento */                  cadena[4]='\0';        /* termino la cadena sin del posible desplazamiento */
                         }              }
                         else              else
                         {              {
                                 if(cadena[6]=='\0') desplazamiento = NO;                  if(cadena[6]=='\0') desplazamiento = NO;
                                 else desplazamiento = SI;                  else desplazamiento = SI;
                                 cadena[6]='\0';         /* termino la cadena sin del posible desplazamiento */                  cadena[6]='\0';        /* termino la cadena sin del posible desplazamiento */
                         }              }
         }          }
   
                 id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, cadena);          id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, cadena);
           
                 if(id == -1)          if(id == -1)
             {          {
                         /* emito un error al fichero de log */               /* emito un error al fichero de log */ 
                         sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", cadena);              sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", cadena);
                         Notificar(mensaje, ERROR_SALIR, ECO_NO);              Notificar(mensaje, ERROR_SALIR, ECO_NO);
                 }          }
                 ciclos_tiempo = ciclos[id].ciclos;          ciclos_tiempo = ciclos[id].ciclos;
                           
                 if(desplazamiento == SI)        /* si hay desplzamiento añado su tiempo */          if(desplazamiento == SI)    /* si hay desplzamiento añado su tiempo */
                 {          {
                         id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "DESPLZ");              id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "DESPLZ");
           
                         if(id == -1)              if(id == -1)
                         {              {
                                 /* emito un error al fichero de log */                   /* emito un error al fichero de log */ 
                                 sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", "DESPLZ");                  sprintf(mensaje, "[ComputarDireccion] La cadena '%s' no se ha encontrado en Tabla Ciclos", "DESPLZ");
                                 Notificar(mensaje, ERROR_SALIR, ECO_NO);                  Notificar(mensaje, ERROR_SALIR, ECO_NO);
                         }              }
                         ciclos_tiempo += ciclos[id].ciclos;              ciclos_tiempo += ciclos[id].ciclos;
                 }          }
                 strcpy(cadena, "MEM");  /* cambio la cadena por la de acceso a MEMORIA */          strcpy(cadena, "MEM");    /* cambio la cadena por la de acceso a MEMORIA */
                 break;          break;
   
         default:    /* registros, inmediatos, o direcciones físicas */          default:    /* registros, inmediatos, o direcciones físicas */
         if(isxdigit(cadena[1]))    /* es un número hexadecimal */          if(isxdigit(cadena[1]))    /* es un número hexadecimal */
Line 141  char ComputarDireccion(char *cadena) Line 109  char ComputarDireccion(char *cadena)
                 break;                  break;
             }              }
         }          }
                 else          else
                 {          {
                         if(cadena[1]=='L' || cadena[1]=='H') strcpy(cadena, "REG8");              if(cadena[1]=='L' || cadena[1]=='H') strcpy(cadena, "REG8");
                         else strcpy(cadena, "REG16");              else strcpy(cadena, "REG16");
                 }          }
                 ciclos_tiempo = 0;          ciclos_tiempo = 0;
         break;          break;
     }      }
         return ciclos_tiempo;      return ciclos_tiempo;
 }  }
   
   
Line 159  char ComputarDireccion(char *cadena) Line 127  char ComputarDireccion(char *cadena)
 void CalcularCiclosInstruccion(fichainstruccion *tarjetaoperandos)  void CalcularCiclosInstruccion(fichainstruccion *tarjetaoperandos)
 {  {
     int id;      int id;
         char op1[MAX_OPE], op2[MAX_OPE];      char op1[MAX_OPE], op2[MAX_OPE];
         char pesa_inm = SI;             /* indico si un inmediato pesa en ciclos o no */      char pesa_inm = SI;        /* indico si un inmediato pesa en ciclos o no */
         char ciclos_tiempo;      char ciclos_tiempo;
         char mensaje[MAX_LINE];      char mensaje[MAX_LINE];
   
   
         /* TIEMPO DEBIDO A LA OPERACIÓN */      /* TIEMPO DEBIDO A LA OPERACIÓN */
   
         /* busco en la tabla de ciclos */      /* busco en la tabla de ciclos */
   
     id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->nemonico);      id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->nemonico);
           
         if(id == -1)      if(id == -1)
     {      {
         /* emito un error al fichero de log */           /* emito un error al fichero de log */ 
         sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->nemonico);          sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->nemonico);
                 Notificar(mensaje, ERROR_SALIR, ECO_NO);          Notificar(mensaje, ERROR_SALIR, ECO_NO);
     }      }
   
         tarjetaoperandos->ciclosALU = ciclos[id].ciclos;      tarjetaoperandos->ciclosALU = ciclos[id].ciclos;
   
         /* ahora busco en la tabla de nemónicos */      /* ahora busco en la tabla de nemónicos */
   
     id = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico);      id = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico);
           
         if(id == -1)      if(id == -1)
     {      {
         /* emito un error al fichero de log */           /* emito un error al fichero de log */ 
         sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico);          sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico);
                 Notificar(mensaje, ERROR_SALIR, ECO_NO);          Notificar(mensaje, ERROR_SALIR, ECO_NO);
     }      }
   
         /* TIEMPO DEBIDO AL CÓMPUTO DE DIRECCIONES */      /* TIEMPO DEBIDO AL CÓMPUTO DE DIRECCIONES */
         strcpy(op2, tarjetaoperandos->op2);      strcpy(op2, tarjetaoperandos->op2);
         ciclos_tiempo = ComputarDireccion(op2);       ciclos_tiempo = ComputarDireccion(op2); 
   
         strcpy(op1, tarjetaoperandos->op1);      strcpy(op1, tarjetaoperandos->op1);
         ciclos_tiempo += ComputarDireccion(op1);       ciclos_tiempo += ComputarDireccion(op1); 
   
         /* he obtenido los operandos normalizados */      /* he obtenido los operandos normalizados */
   
         /* TIEMPO DEBIDO AL TIPO DE OPERANDO Y TIPO DE ACCESO */      /* TIEMPO DEBIDO AL TIPO DE OPERANDO Y TIPO DE ACCESO */
   
         /* tamaño de acceso a memoria y tipo de acceso */      /* tamaño de acceso a memoria y tipo de acceso */
         if(!strcmp(op2, "MEM"))      if(!strcmp(op2, "MEM"))
         {             {    
                 if(strcmp(op1, "REG8") && strcmp(op1, "INM8")) strcat(op2, "16");          if(strcmp(op1, "REG8") && strcmp(op1, "INM8")) strcat(op2, "16");
                 else strcat(op2, "8");          else strcat(op2, "8");
                 /* tipo de acceso: lectura o escritura */          /* tipo de acceso: lectura o escritura */
         switch(nemonicos[id].modo_op2)          switch(nemonicos[id].modo_op2)
         {          {
             case LEIDO:    /* leido */              case LEIDO:    /* leido */
                         strcat(op2, "L");              strcat(op2, "L");
               break;
               
               case ESCRITO:    /* escrito */
               strcat(op2, "E");
             break;              break;
                           
                         case ESCRITO:    /* escrito */  
                         strcat(op2, "E");  
                         break;  
   
             case LEIDOYESCRITO:    /* leido y escrito */              case LEIDOYESCRITO:    /* leido y escrito */
                         strcat(op2, "LE");              strcat(op2, "LE");
             break;              break;
         }          }
         }      }
         if(!strcmp(op1, "MEM"))      if(!strcmp(op1, "MEM"))
         {             {    
                 if(strcmp(op2, "REG8") && strcmp(op2, "INM8")) strcat(op1, "16");          if(strcmp(op2, "REG8") && strcmp(op2, "INM8")) strcat(op1, "16");
                 else strcat(op1, "8");          else strcat(op1, "8");
                 /* tipo de acceso: lectura o escritura */          /* tipo de acceso: lectura o escritura */
         switch(nemonicos[id].modo_op1)          switch(nemonicos[id].modo_op1)
         {          {
             case LEIDO:    /* leido */              case LEIDO:    /* leido */
                         strcat(op1, "L");              strcat(op1, "L");
               break;
               
               case ESCRITO:    /* escrito */
               strcat(op1, "E");
             break;              break;
                           
                         case ESCRITO:    /* escrito */  
                         strcat(op1, "E");  
                         break;  
   
             case LEIDOYESCRITO:    /* leido y escrito */              case LEIDOYESCRITO:    /* leido y escrito */
                         strcat(op1, "LE");              strcat(op1, "LE");
             break;              break;
         }          }
         }      }
   
         /* indico si los inmediatos pesan o no en ciclos (los de los saltos, etc. no pesan) */      /* indico si los inmediatos pesan o no en ciclos (los de los saltos, etc. no pesan) */
         if(nemonicos[id].tipo < SALTO_INCONDICIONAL) pesa_inm = SI;      if(nemonicos[id].tipo < SALTO_INCONDICIONAL) pesa_inm = SI;
         else pesa_inm = NO;      else pesa_inm = NO;
   
         /* busco en la tabla de ciclos los operandos normalizados */      /* busco en la tabla de ciclos los operandos normalizados */
   
     if(op2[0]!='\0')            /* fuente */      if(op2[0]!='\0')        /* fuente */
         {      {
                 id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op2);          id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op2);
           
                 if(id == -1)          if(id == -1)
                 {          {
                         /* emito un error al fichero de log */               /* emito un error al fichero de log */ 
                         sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op2);              sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op2);
                         Notificar(mensaje, ERROR_SALIR, ECO_NO);              Notificar(mensaje, ERROR_SALIR, ECO_NO);
                 }          }
   
                 ciclos_tiempo += ciclos[id].ciclos;          ciclos_tiempo += ciclos[id].ciclos;
         }      }
   
         if(op1[0]!='\0')                /* destino */      if(op1[0]!='\0')        /* destino */
         {      {
                 id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op1);          id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, op1);
           
                 if(id == -1)          if(id == -1)
                 {          {
                         /* emito un error al fichero de log */               /* emito un error al fichero de log */ 
                         sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op1);              sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", op1);
                         Notificar(mensaje, ERROR_SALIR, ECO_NO);              Notificar(mensaje, ERROR_SALIR, ECO_NO);
                 }          }
   
                 /* los inmediatos que no pesan sólo pueden estar en el destino */          /* los inmediatos que no pesan sólo pueden estar en el destino */
                 if(pesa_inm == SI) ciclos_tiempo += ciclos[id].ciclos;          if(pesa_inm == SI) ciclos_tiempo += ciclos[id].ciclos;
         }      }
   
         /* TIEMPO DEBIDO A LOS PREFIJOS */      /* TIEMPO DEBIDO A LOS PREFIJOS */
   
         if(strcmp(tarjetaoperandos->prefijo, ""))      if(strcmp(tarjetaoperandos->prefijo, ""))
         {      {
                 id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->prefijo);          id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, tarjetaoperandos->prefijo);
           
                 if(id == -1)          if(id == -1)
                 {          {
                         /* emito un error al fichero de log */               /* emito un error al fichero de log */ 
                         sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->prefijo);              sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", tarjetaoperandos->prefijo);
                         Notificar(mensaje, ERROR_SALIR, ECO_NO);              Notificar(mensaje, ERROR_SALIR, ECO_NO);
                 }          }
   
                 ciclos_tiempo += ciclos[id].ciclos;          ciclos_tiempo += ciclos[id].ciclos;
         }      }
   
         tarjetaoperandos->ciclosBIU = ciclos_tiempo;      tarjetaoperandos->ciclosBIU = ciclos_tiempo;
   
         /* TIEMPO ASOCIADO A LOS SALTOS CONDICIONALES */      /* TIEMPO ASOCIADO A LOS SALTOS CONDICIONALES */
   
         if(tarjetaoperandos->salto == 2)        /* salto condicional TOMADO */      if(tarjetaoperandos->salto == 2)    /* salto condicional TOMADO */
         {      {
                 id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "TOMADO");          id = BDBuscarCadena(TABLA_CICLOS, CAMPO_IDENTIFICADOR, "TOMADO");
           
                 if(id == -1)          if(id == -1)
                 {          {
                         /* emito un error al fichero de log */               /* emito un error al fichero de log */ 
                         sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", "TOMADO");              sprintf(mensaje, "[CalcularCiclos] La cadena '%s' no se ha encontrado en Tabla Ciclos", "TOMADO");
                         Notificar(mensaje, ERROR_SALIR, ECO_NO);              Notificar(mensaje, ERROR_SALIR, ECO_NO);
                 }          }
   
                 tarjetaoperandos->ciclosALU += ciclos[id].ciclos;          tarjetaoperandos->ciclosALU += ciclos[id].ciclos;
         }      }
 }  }
   
   
Line 320  void CalcularCiclosInstruccion(fichainst Line 288  void CalcularCiclosInstruccion(fichainst
   
 void ActualizarCPImedio(unsigned short int ciclosALU, unsigned short int ciclosBIU)  void ActualizarCPImedio(unsigned short int ciclosALU, unsigned short int ciclosBIU)
 {  {
         unsigned int ciclos;      unsigned int ciclos;
   
         ciclos = ciclosALU + ciclosBIU;      ciclos = ciclosALU + ciclosBIU;
   
         cpimedio = CalcularNuevoPromedio (cpimedio, (double)ciclos, instruccion);      cpimedio = CalcularNuevoPromedio (cpimedio, (double)ciclos, instruccion);
 }  }
   
   

Removed from v.1.1  
changed lines
  Added in v.1.2


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