Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "CacheSim.h"
- /* Posa aqui les teves estructures de dades globals
- * per mantenir la informacio necesaria de la cache
- * */
- unsigned int tags[128];
- unsigned int valid[128];
- unsigned int dirty[128];
- int miss_counter;
- int hit_counter;
- /* La rutina init_cache es cridada pel programa principal per
- * inicialitzar la cache.
- * La cache es inicialitzada al començar cada un dels tests.
- * */
- void init_cache ()
- {
- /* Escriu aqui el teu codi */
- miss_counter=0;
- hit_counter=0;
- int i;
- for (i = 0; i < 128; ++i) {
- tags[i] = 0;
- valid[i] = 0;
- dirty[i] = 0;
- }
- }
- /* La rutina reference es cridada per cada referencia a simular */
- void reference (unsigned int address, unsigned int LE)
- {
- unsigned int byte;
- unsigned int linea_mp;
- unsigned int linea_mc;
- unsigned int tag;
- unsigned int miss;
- unsigned int lec_mp;
- unsigned int mida_lec_mp;
- unsigned int esc_mp;
- unsigned int mida_esc_mp;
- unsigned int replacement;
- unsigned int tag_out;
- /* Escriu aqui el teu codi */
- //LE==0 --> Lectura; LE==1 --> Escriptura.
- byte = address & 0x1F;
- linea_mp = address & 0xFFFFFFE0;
- linea_mp = linea_mp >> 5;
- linea_mc = address & 0xFE0;
- linea_mc = linea_mc >> 5;
- tag = address & 0xFFFFF000;
- tag = tag >> 12;
- //HIT:
- if (tags[linea_mc]==tag&&valid[linea_mc]) {
- ++hit_counter;
- miss = 0;
- replacement = 0;
- /*LECTURA*/if(!LE) {
- lec_mp = 0;
- mida_lec_mp = 32;
- }
- /*ESCRIPTURA*/
- else{
- //Escriptura.
- lec_mp = 0;
- dirty[linea_mc] = 1;
- mida_esc_mp = 0;
- mida_lec_mp = 0;
- }
- }
- /*MISS*/
- else{
- ++miss_counter;
- miss = 1;
- tag_out = tags[linea_mc];
- tags[linea_mc] = tag;
- valid[linea_mc] = 1;
- /*Dirty*/if(dirty[linea_mc]){
- lec_mp = 0;
- esc_mp = 1;
- mida_esc_mp = 32;
- mida_lec_mp = 0;
- replacement = 1;
- replacement = valid[linea_mc];
- }
- lec_mp = 1;
- /*LECT*/if(!LE){
- dirty[linea_mc] = 0;
- lec_mp = 0;
- mida_lec_mp = 32;
- }
- /*ESCR*/else{
- dirty[linea_mc] = 1;
- }
- }
- /*
- if (!LE) {
- //Lectura
- esc_mp = 0;
- mida_esc_mp = 0;
- lec_mp = 1;
- mida_lec_mp = 32;
- miss = 1;
- replacement = 0;
- if (tags[linea_mc]==tag&&valid[linea_mc]) {
- miss = 0;
- lec_mp = 0;
- mida_lec_mp = 0;
- }
- else {
- replacement = valid[linea_mc];
- }
- if (miss) {
- //Si s'ha fallat en llegir, renovem el tag i el bit de validesa.
- tag_out = tags[linea_mc];
- tags[linea_mc] = tag;
- valid[linea_mc] = 1;
- }
- }
- else {
- //Escriptura. Write NO Allocate --> Només s'escriu a MP.
- lec_mp = 0;
- esc_mp = 1;
- mida_esc_mp = 1;
- mida_lec_mp = 0;
- replacement = 0;
- if(tags[linea_mc]==tag&&valid[linea_mc]) miss = 0;
- else miss = 1;
- }
- if (miss) miss_counter++;
- else hit_counter++;
- /* La funcio test_and_print escriu el resultat de la teva simulacio
- * per pantalla (si s'escau) i comproba si hi ha algun error
- * per la referencia actual
- * */
- test_and_print (address, LE, byte, linea_mp, linea_mc, tag,
- miss, lec_mp, mida_lec_mp, esc_mp, mida_esc_mp,
- replacement, tag_out);
- }
- /* La rutina final es cridada al final de la simulacio */
- void final ()
- {
- /* Escriu aqui el teu codi */
- printf("HIT: %d\n", hit_counter);
- printf("MISS: %d\n", miss_counter);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement