Exemplo n.º 1
0
def main():
    listRegisters, memoriaDados, memoriaInstrucoes, ufAddSub, ufMulDiv, ufLoadStore, rsAddSub, rsMulDiv, rsLoadStore, BufferLoadStore = Helpers.getStructures(
    )
    clock = 0
    ## PC aponta para a próxima instrução da Busca
    PC = 0
    ## DC aponta para a próxima instrução do Despacho
    DC = 0  ## "despacho control"
    IR = ""

    flagOcorreuDespacho = True  ## inicializada com True para a primeira instrução poder ser despachada

    ## fila de Load e Store para controlar a sequência despachada
    loadStoreQueue = []

    ## abertura do arquivo de instrucoes
    fileName = input("Nome do arquivo de entrada: ")
    instructionFile = open(fileName, "r")
    listInstrucoes = instructionFile.readlines()
    for ins in listInstrucoes:
        index = listInstrucoes.index(ins)
        ins = ins.replace('\n', '')
        listInstrucoes[index] = ins
    instrucaoDespacho = ''  ## Instrucao a ser despachada
    acabouDespacho = False
    ocorreuDesvio = False
    instrucaoDesvio = False
    tamanhoListaInstrucoes = len(listInstrucoes) - 1
    tamanhoMemoriaInstrucoes = len(memoriaInstrucoes) - 1

    imprimirEstruturas(rsAddSub, rsMulDiv, rsLoadStore, ufAddSub, ufMulDiv,
                       ufLoadStore, listRegisters, memoriaDados, clock,
                       memoriaInstrucoes)

    clock = clock + 1

    while (not terminou(rsAddSub, rsMulDiv, rsLoadStore, ocorreuDesvio,
                        acabouDespacho)):

        ## Escrita
        ufAddSub, ufMulDiv, ufLoadStore, rsAddSub, rsMulDiv, rsLoadStore, listRegisters, memoriaDados, PC, ocorreuDesvio, instrucaoDesvio = Pipeline.Escrita(
            ufAddSub, ufMulDiv, ufLoadStore, rsAddSub, rsMulDiv, rsLoadStore,
            listRegisters, PC, memoriaDados, instrucaoDesvio)

        if (not ocorreuDesvio):
            ## Execucao
            ufAddSub, ufMulDiv, ufLoadStore, LoadStoreQueue = Pipeline.Execucao(
                rsAddSub, rsMulDiv, rsLoadStore, ufAddSub, ufMulDiv,
                ufLoadStore, PC, memoriaDados, loadStoreQueue)

            ## Despacho da instrucao
            if (flagOcorreuDespacho and not acabouDespacho
                    and not instrucaoDesvio and memoriaInstrucoes != []):
                instrucaoDespacho = memoriaInstrucoes[DC]
                ## Verifica se o despacho atual é o último na lista de instrucoes
                if (DC == tamanhoListaInstrucoes
                        or (PC == tamanhoListaInstrucoes + 1
                            and DC == tamanhoMemoriaInstrucoes)):
                    acabouDespacho = True
                else:
                    DC = DC + 1

                rsMulDiv, rsAddSub, rsLoadStore, listRegisters, flagOcorreuDespacho, instrucaoDesvio = Pipeline.Despacho(
                    instrucaoDespacho, rsAddSub, rsMulDiv, rsLoadStore,
                    listRegisters, flagOcorreuDespacho, loadStoreQueue)

            ## Busca da instrucao
            if (PC <= tamanhoListaInstrucoes):
                IR, PC = Pipeline.BuscaInstrucoes(IR, listInstrucoes, PC)
                memoriaInstrucoes.append(IR)
                tamanhoMemoriaInstrucoes = len(memoriaInstrucoes) - 1

        else:
            memoriaInstrucoes = []
            DC = 0
            flagOcorreuDespacho = True
            acabouDespacho = False
            ocorreuDesvio = False
            instrucaoDesvio = False
            IR = ""
            instrucaoDespacho = ''

        imprimirEstruturas(rsAddSub, rsMulDiv, rsLoadStore, ufAddSub, ufMulDiv,
                           ufLoadStore, listRegisters, memoriaDados, clock,
                           memoriaInstrucoes)

        clock = clock + 1