/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package cache; /** * * @author Juninho Carlos */ public class Redundancia { private ConjuntoRedundancia[] conjuntos; public Redundancia(){ this.conjuntos = new ConjuntoRedundancia[4]; for(int i = 0; i < 4; i++){ this.conjuntos[i] = new ConjuntoRedundancia(); } } public void leituraEspecial(int tag, int conjunto, int bloco){ this.conjuntos[conjunto].getBlocos()[bloco].leituraEspecialNoBloco(tag); } public void inserirErro(int conjunto, int bloco, int palavra){ this.conjuntos[conjunto].getBlocos()[bloco].getPalavras()[palavra].inserirErro(); } /** * QUANDO TEM MISS, É SABIDO QUE, SE TIVER PALAVRA VALIDA, ISSO RESULTARA EM UM WB-FORÇADO OU LE * * @param address endereço para escrever na redundancia * @param bloco número do bloco que a palavra está mapeada dentro do conjunto * @return retorna NULL se escreveu sem a necessidade de sobrescrita, * caso contrário, retorna o endereço para sofrer o write-back ou leitura especial */ public Integer escreverPalavraNaRedMiss(Requisicao address,int bloco){ int conjunto = address.conjunto%4; Integer enderecoToWB = null; if(this.conjuntos[conjunto].hasErroInPalavra(bloco, address.palavra)){ return -1; } if(this.conjuntos[conjunto].isPalavraValida(bloco, address.palavra)){ enderecoToWB = this.conjuntos[conjunto].getTagFromPalavra(bloco, address.palavra); } //Escreve a palavra na redundancia this.conjuntos[conjunto].writeAWord(address.conjunto, bloco, address.palavra); return enderecoToWB; } @Override public String toString() { String s = ""; BlocoRedundancia[] b; int i = 0; for (ConjuntoRedundancia conjunto : conjuntos) { s += "Conjunto "+i+"\n"; //s += conjunto; b = conjunto.getBlocos(); int j = 0; for (BlocoRedundancia bloco : b) { s += "Bloco " + j + "\n"; s += bloco + "\n"; j++; } s += "\n\n\n"; i++; } return s; //To change body of generated methods, choose Tools | Templates. } }