package bcc266TP2.toy; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Random; public class TP2_sala_de_aula { final int tamanhoRam=1000; final int tamanhoCache1 = 8; final int tamanhoCache2 = 16; final int tamanhoPrograma = 1000;//qde de instru��es final int qdePalavrasBloco = 4; Instrucao[] memoriaInstrucoes; BlocoMemoria[] RAM = new BlocoMemoria[tamanhoRam]; BlocoMemoria[] cache1 = new BlocoMemoria[tamanhoCache1]; BlocoMemoria[] cache2 = new BlocoMemoria[tamanhoCache2]; public static void main(String[] args){ new TP2_sala_de_aula(); } public TP2_sala_de_aula(){ montarRam(); montarCacheVazia(tamanhoCache1, cache1); montarCacheVazia(tamanhoCache2, cache2); montarInstrucoesProgramaAleatorio(); maquina(); System.out.println("terminou"); } void maquina(){ //registradores int PC =0; int opcode = Integer.MAX_VALUE; int custo=0; //caches 1 e 2 Hit e miss int missC1 = 0; int hitC1 = 0; int missC2 = 0; int hitC2 = 0; while(opcode!=-1){ Instrucao umaInstrucao = memoriaInstrucoes[PC]; opcode = umaInstrucao.getOpcode(); //TP2 if(opcode!=-1){ BlocoMemoria dadoMemoriaAdd1 = MMU.buscarNasMemorias(umaInstrucao.getAdd1(), RAM, cache1, cache2); BlocoMemoria dadoMemoriaAdd2 = MMU.buscarNasMemorias(umaInstrucao.getAdd2(), RAM, cache1, cache2); BlocoMemoria dadoMemoriaAdd3 = MMU.buscarNasMemorias(umaInstrucao.getAdd3(), RAM, cache1, cache2); //incrementando custos custo += dadoMemoriaAdd1.getCusto(); custo += dadoMemoriaAdd2.getCusto(); custo += dadoMemoriaAdd3.getCusto(); //validando hits e misses if(dadoMemoriaAdd1.getCacheHit()==1){ hitC1++; }else if(dadoMemoriaAdd1.getCacheHit()==2){ missC1++; hitC2++; }else if(dadoMemoriaAdd1.getCacheHit()==3){ missC1++; missC2++; } if(dadoMemoriaAdd2.getCacheHit()==1){ hitC1++; }else if(dadoMemoriaAdd2.getCacheHit()==2){ missC1++; hitC2++; }else if(dadoMemoriaAdd2.getCacheHit()==3){ missC1++; missC2++; } if(dadoMemoriaAdd3.getCacheHit()==1){ hitC1++; }else if(dadoMemoriaAdd3.getCacheHit()==2){ missC1++; hitC2++; }else if(dadoMemoriaAdd3.getCacheHit()==3){ missC1++; missC2++; } System.out.println("Custo at� o momento do programa em execu��o: " + custo); System.out.println("Hits e Misses at� o momento - C1 hit | C1 miss | C2 hit | C2 miss: " + hitC1+ " | "+ missC1 + " | "+hitC2 + " | "+ missC2); switch (opcode){ //levar para cache1 dados externos case 0:{ System.out.println("N�o h� demanda por levar dados externos para as mem�rias. "); break; } case 1:{ //somar int conteudo1 = dadoMemoriaAdd1.getPalavras()[umaInstrucao.getAdd1().getEndPalavra()]; int conteudo2 = dadoMemoriaAdd2.getPalavras()[umaInstrucao.getAdd2().getEndPalavra()]; int soma = conteudo1+conteudo2; //salvando resultado na cache1 dadoMemoriaAdd3.getPalavras()[umaInstrucao.getAdd3().getEndPalavra()] = soma; System.out.println("somando "+ soma); break; } case 2:{ //subtrair int conteudo1 = dadoMemoriaAdd1.getPalavras()[umaInstrucao.getAdd1().getEndPalavra()]; int conteudo2 = dadoMemoriaAdd2.getPalavras()[umaInstrucao.getAdd2().getEndPalavra()]; int sub = conteudo1-conteudo2; //salvando resultado na cache1 dadoMemoriaAdd3.getPalavras()[umaInstrucao.getAdd3().getEndPalavra()] = sub; System.out.println("subtraindo "+ sub); break; } } PC++; }//end if }//end while System.out.println("Custo total do programa: " + custo); System.out.println("Hits e Misses do programa - C1 hit | C1 miss | C2 hit | C2 miss: " + hitC1+ " | "+ missC1 + " | "+hitC2 + " | "+ missC2); } private void montarCacheComDados(int tamanho, int tipoCache){ Random r = new Random(); for(int i=0; i salvar na mem�ria //1 => opcode => somar //2 => opcode => subtrair //-1 => halt memoriaInstrucoes= new Instrucao[tamanhoPrograma]; Instrucao umaInstrucao; Random r = new Random(); for (int i=0; i