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 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){
for(int i=0; i<tamanho; i++){
BlocoMemoria aux = new BlocoMemoria();
//for�ando cache estar vazia
aux.
setEndBloco(Integer.
MIN_VALUE);
int[] palavras = new int[qdePalavrasBloco];
for(int j=0;j<qdePalavrasBloco; j++){
palavras[j] = r.nextInt(1000000);
}
aux.setPalavras(palavras);
if (tipoCache==1) cache1[i] = aux;
else cache2[i] = aux;
}
}
private void montarCacheVazia(int tamanho, BlocoMemoria[] qqCache){
for(int i=0; i<tamanho; i++){
BlocoMemoria aux = new BlocoMemoria();
//for�ando cache estar vazia
aux.
setEndBloco(Integer.
MIN_VALUE);
qqCache[i] = aux;
}
}
private void montarRam(){
for(int i=0; i<tamanhoRam; i++){
BlocoMemoria aux = new BlocoMemoria();
aux.setEndBloco(i);
int[] palavras = new int[qdePalavrasBloco];
for(int j=0;j<qdePalavrasBloco; j++){
palavras[j] = r.nextInt(1000000);
}
aux.setPalavras(palavras);
RAM[i] = aux;
}
}
private void montarInstrucaoGerador() {
//ler do arquivo uma linha
try{
File f =
new File ("c:/etc/gororoba.txt");
while ((linha = br.readLine())!=null){
String [] linhaPicada = linha.
split(":");
Instrucao i = new Instrucao();
i.
setOpcode(Integer.
parseInt(linhaPicada
[0]));
Endereco e1 = new Endereco();
//e1.setEndBloco(endBloco);
//e1.setEndPalavra(endPalavra);
}
}
}
private void montarInstrucoesProgramaAleatorio(){
//0 => salvar na mem�ria
//1 => opcode => somar
//2 => opcode => subtrair
//-1 => halt
memoriaInstrucoes= new Instrucao[tamanhoPrograma];
Instrucao umaInstrucao;
for (int i=0; i<tamanhoPrograma-1; i++){
umaInstrucao = new Instrucao();
umaInstrucao.setOpcode(r.nextInt(3));
Endereco add1 = new Endereco();
add1.setEndBloco(r.nextInt(tamanhoRam));
add1.setEndPalavra(r.nextInt(qdePalavrasBloco));
umaInstrucao.setAdd1(add1);
Endereco add2 = new Endereco();
add2.setEndBloco(r.nextInt(tamanhoRam));
add2.setEndPalavra(r.nextInt(qdePalavrasBloco));
umaInstrucao.setAdd2(add2);
Endereco add3 = new Endereco();
add3.setEndBloco(r.nextInt(tamanhoRam));
add3.setEndPalavra(r.nextInt(qdePalavrasBloco));
umaInstrucao.setAdd3(add3);
memoriaInstrucoes[i] = umaInstrucao;
}
//inserindo a ultima instrucao do programa que faz o halt
umaInstrucao = new Instrucao();
umaInstrucao.setOpcode(-1);
memoriaInstrucoes[tamanhoPrograma-1] = umaInstrucao;
}
}