Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2014
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.29 KB | None | 0 0
  1. #include "CacheSim.h"
  2.  
  3. /* Posa aqui les teves estructures de dades globals
  4.  * per mantenir la informacio necesaria de la cache
  5.  * */
  6.  
  7. unsigned int tags[128];
  8. unsigned int valid[128];
  9. unsigned int dirty[128];
  10. int miss_counter;
  11. int hit_counter;
  12.  
  13.  
  14. /* La rutina init_cache es cridada pel programa principal per
  15.  * inicialitzar la cache.
  16.  * La cache es inicialitzada al començar cada un dels tests.
  17.  * */
  18. void init_cache ()
  19. {
  20.     /* Escriu aqui el teu codi */
  21.     miss_counter=0;
  22.     hit_counter=0;
  23.     int i;
  24.     for (i = 0; i < 128; ++i) {
  25.         tags[i] = 0;
  26.         valid[i] = 0;
  27.         dirty[i] = 0;
  28.     }
  29. }
  30.  
  31. /* La rutina reference es cridada per cada referencia a simular */
  32. void reference (unsigned int address, unsigned int LE)
  33. {
  34.     unsigned int byte;
  35.     unsigned int linea_mp;
  36.     unsigned int linea_mc;
  37.     unsigned int tag;
  38.     unsigned int miss;
  39.     unsigned int lec_mp;
  40.     unsigned int mida_lec_mp;
  41.     unsigned int esc_mp;
  42.     unsigned int mida_esc_mp;
  43.     unsigned int replacement;
  44.     unsigned int tag_out;
  45.  
  46.     /* Escriu aqui el teu codi */
  47.    
  48.     //LE==0 --> Lectura;    LE==1 --> Escriptura.
  49.  
  50.     byte = address & 0x1F;
  51.     linea_mp = address & 0xFFFFFFE0;
  52.     linea_mp = linea_mp >> 5;
  53.     linea_mc = address & 0xFE0;
  54.     linea_mc = linea_mc >> 5;
  55.     tag = address & 0xFFFFF000;
  56.     tag = tag >> 12;
  57.    
  58.     //HIT:
  59.     if (tags[linea_mc]==tag&&valid[linea_mc]) {
  60.       ++hit_counter;
  61.       miss = 0;
  62.       replacement = 0;
  63.       /*LECTURA*/if(!LE) {
  64.           lec_mp = 0;
  65.           mida_lec_mp = 32;
  66.       }
  67.       /*ESCRIPTURA*/
  68.       else{
  69.         //Escriptura.
  70.         lec_mp = 0;
  71.         dirty[linea_mc] = 1;
  72.         mida_esc_mp = 0;
  73.         mida_lec_mp = 0;
  74.        
  75.       }
  76.     }
  77.     /*MISS*/
  78.     else{
  79.         ++miss_counter;
  80.         miss = 1;
  81.         tag_out = tags[linea_mc];
  82.         tags[linea_mc] = tag;
  83.         valid[linea_mc] = 1;
  84.         /*Dirty*/if(dirty[linea_mc]){
  85.         lec_mp = 0;
  86.         esc_mp = 1;
  87.         mida_esc_mp = 32;
  88.         mida_lec_mp = 0;
  89.         replacement = 1;
  90.         replacement = valid[linea_mc];
  91.         }
  92.         lec_mp = 1;
  93.         /*LECT*/if(!LE){
  94.         dirty[linea_mc] = 0;
  95.         lec_mp = 0;
  96.         mida_lec_mp = 32;
  97.         }
  98.         /*ESCR*/else{
  99.           dirty[linea_mc] = 1;
  100.         }
  101.     }
  102.    
  103.     /*
  104.     if (!LE) {
  105.         //Lectura
  106.         esc_mp = 0;
  107.         mida_esc_mp = 0;
  108.         lec_mp = 1;
  109.         mida_lec_mp = 32;
  110.         miss = 1;
  111.         replacement = 0;
  112.         if (tags[linea_mc]==tag&&valid[linea_mc]) {
  113.                 miss = 0;
  114.                 lec_mp = 0;
  115.                 mida_lec_mp = 0;
  116.         }
  117.         else {
  118.             replacement = valid[linea_mc];
  119.         }
  120.         if (miss) {
  121.             //Si s'ha fallat en llegir, renovem el tag i el bit de validesa.
  122.             tag_out = tags[linea_mc];
  123.             tags[linea_mc] = tag;
  124.             valid[linea_mc] = 1;
  125.         }
  126.     }
  127.     else {
  128.         //Escriptura. Write NO Allocate --> Només s'escriu a MP.
  129.         lec_mp = 0;
  130.         esc_mp = 1;
  131.         mida_esc_mp = 1;
  132.         mida_lec_mp = 0;
  133.         replacement = 0;
  134.         if(tags[linea_mc]==tag&&valid[linea_mc]) miss = 0;
  135.         else miss = 1;
  136.     }
  137.     if (miss) miss_counter++;
  138.     else hit_counter++;
  139.  
  140.  
  141.     /* La funcio test_and_print escriu el resultat de la teva simulacio
  142.      * per pantalla (si s'escau) i comproba si hi ha algun error
  143.      * per la referencia actual
  144.      * */
  145.     test_and_print (address, LE, byte, linea_mp, linea_mc, tag,
  146.             miss, lec_mp, mida_lec_mp, esc_mp, mida_esc_mp,
  147.             replacement, tag_out);
  148. }
  149.  
  150. /* La rutina final es cridada al final de la simulacio */
  151. void final ()
  152. {
  153.     /* Escriu aqui el teu codi */
  154.     printf("HIT: %d\n", hit_counter);
  155.     printf("MISS: %d\n", miss_counter);
  156.  
  157.  
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement