/*
Arquitetura e Organização de Computadores
Simulação de memória cache
Arquivos (cache.c, lib.c, lib.h, makefile)
Exemplo de saída: ./cache 512 direto 16 memEnd.txt
OUT/2011
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "lib.h"
/*
<tamanho da cache> <mapeamento> <tamanho do bloco> <arquivo>
*/
int main(int argc, char* argv[]){
if (argc != 5){
printf("\nNumero de parametros invalido!\n");
printf("./cache <tamanho da cache> <associatividade> <tamanho do bloco> <arquivo>\n\n");
exit(1);
}
Arquivo = fopen(argv[4], "r");
if(Arquivo == NULL){
printf("\nErro na leitura do arquivo!\n\n");
exit(1);
}
map = argv[2];
if(strcmp(map,"conjassoc") == 0){
printf("\nInforme o numero de vias: ");
scanf("%d",&vias);
}
tamCache = atoi(argv[1]);
tamBloco = atoi(argv[3]);
if(strcmp(map,"direto") == 0){
setnumber = (tamCache/tamBloco);
setbits = (round((log(setnumber))/(log(2))));
blockbits = log(tamBloco)/log(2);
printf("\nOffset: %.f bits\n", log(tamBloco)/log(2));
indice = log((setnumber+1)*1024)/log(2);
printf("Indice: %.f bits\n", log((setnumber+1)*1024)/log(2));
tagsize = 32 - (blockbits + indice);
printf("Tag: %d bits\n", tagsize);
}else if(strcmp(map,"associativo") == 0){
setnumber = (tamCache/tamBloco);
setbits = (round((log(setnumber))/(log(2))));
blockbits = log(tamBloco)/log(2);
printf("\nOffset: %.f bits\n", log(tamBloco)/log(2));
indice = log((setnumber+1)*1024)/log(2);
tagsize = 32 - (blockbits);
printf("Tag: %d bits\n", tagsize);
}else if(strcmp(map,"conjassoc") == 0){
setnumber = (tamCache/tamBloco);
setbits = (round((log(setnumber))/(log(2))));
blockbits = log(tamBloco)/log(2);
printf("\nOffset: %.f bits\n", log(tamBloco)/log(2));
indice = log(((setnumber+1)/vias)*1024)/log(2);
printf("Indice: %d bits\n", indice);
tagsize = 32 - (blockbits + indice);
printf("Tag: %d bits\n", tagsize);
}
HitMiss();
printf("\nHits: %d\n", cacheHit);
printf("Misses: %d\n", cacheMiss);
printf("Writes: %d\n", write);
printf("Reads: %d\n\n", read);
}