Exemple #1
0
    def enviar_sinal(self):
        if self.registradores["CI"] != -1:
            # neste ponto vai buscar no cache, caso nao tenha, vai buscar na memoria( continua o processo normal)
            cacheresult = self.cache.get(self.registradores["CI"])

            if cacheresult is not None:
                # cacheresult sera uma tupla com proximo ci[0] e a informacao guardada[1]
                self.registradores["CI"] = cacheresult[0]
                self.dado = cacheresult[1]
                self.passo = Cpu.PASSO_PROCESSAMENTO
            else:
                sinalram = Consts.get_vetor_conexao(Consts.CPU, Consts.RAM,
                                                    self.registradores["CI"],
                                                    self.tipoSinal)

                self.barramento.enviar_sinal(sinalram)

                if self.tipoSinal == Consts.T_L_INSTRUCAO:
                    sinalentrada = Consts.get_vetor_conexao(
                        Consts.CPU, Consts.ENTRADA, self.registradores["CI"],
                        self.tipoSinal)
                    self.barramento.enviar_sinal(sinalentrada)

                self.passo = Cpu.PASSO_ENDERECO_DADO
                self.log.write_line('cpu => sinal enviado')
Exemple #2
0
    def processar_sinal(self, sinal):

        if sinal[Consts.T_ORIGEM] == Consts.CPU and sinal[
                Consts.T_TIPO] == Consts.T_L_INSTRUCAO:
            code = self.bufferReader.get_line().byte_array

            # enviar pra memoria
            sinal = Consts.get_vetor_conexao(Consts.ENTRADA, Consts.RAM,
                                             sinal[Consts.T_DADOS],
                                             Consts.T_E_INSTRUCAO)
            self.barramento.enviar_sinal(sinal)
            self.log.write_line('entrada => sinal enviado')

            # esperar confirmacao da memoria
            while not self.endereco:
                self.log.write_line("entrada => esperando endereco")
                pass
            self.endereco = None

            dado = Consts.get_vetor_conexao(Consts.ENTRADA, Consts.RAM, code,
                                            None)
            self.barramento.enviar_dado(dado)
        else:
            Consts.running = False
            raise Exception("sinal invalido")
Exemple #3
0
    def enviar_endereco_dado_cpu(self, posmem, tipo):
        proximoendereco = self.proximo_endereco(posmem)
        endereco = Consts.get_vetor_conexao(Consts.RAM, Consts.CPU,
                                            proximoendereco, tipo)
        self.barramento.enviar_endereco(endereco)

        instrucao = self.ler_instrucao(posmem)
        dado = Consts.get_vetor_conexao(Consts.RAM, Consts.CPU, instrucao,
                                        tipo)
        self.barramento.enviar_dado(dado)
Exemple #4
0
    def tratar_sinal_cpu(self, sinal):
        tipo = sinal[Consts.T_TIPO]
        if tipo == Consts.T_L_INSTRUCAO:
            # deve continuar rodando a memoria, porem deve esperar a entrada enviar dados para poder agir
            self.esperando_entrada = True
        elif tipo == Consts.T_RL_INSTRUCAO:
            # if tipo == Consts.T_L_INSTRUCAO:
            #     # pego na entrada e ponho na posicao do ci e fico esperando via loop
            #     self.get_instrucao_entrada(sinal[Consts.T_DADOS])

            self.enviar_endereco_dado_cpu(sinal[Consts.T_DADOS], tipo)

        elif tipo == Consts.T_L_VALOR:
            endereco = sinal[Consts.T_DADOS]
            endereco += self.code_slice

            if self.tamanho - 1 < endereco:
                raise MemoryError("Posicao de memoria inexistente")

            if self.tamanho - 1 < endereco:
                if (self.tamanho_total_valores + self.code_slice) < endereco:
                    raise MemoryError("Posicao de memoria " +
                                      str(endereco - self.code_slice) +
                                      " inexistente")

                dado = Consts.get_vetor_conexao(Consts.RAM, Consts.CPU, 0,
                                                tipo)

            else:
                dado = Consts.get_vetor_conexao(Consts.RAM, Consts.CPU,
                                                self.memoria[endereco], tipo)

            self.barramento.enviar_dado(dado)

        elif tipo == Consts.T_E_VALOR:
            endereco = sinal[Consts.T_DADOS]

            endereco += self.code_slice

            if self.tamanho - 1 < endereco:
                if (self.tamanho_total_valores + self.code_slice) < endereco:
                    Consts.running = False
                    raise MemoryError("Posicao de memoria " +
                                      str(endereco - self.code_slice) +
                                      " inexistente")
            else:
                self.memoria[endereco] = sinal[Consts.T_EVALOR_POS]

        else:
            raise Exception("sinal invalido")
Exemple #5
0
    def __init__(self, barramento, tamanho, log=LogNone()):
        super(Memoria, self).__init__(name="Memoria")
        self.log = log
        self.tamanho_informado = tamanho
        if tamanho > 35:
            MemoryError("limite de memoria excedido (32GB ou 32*2**30)")

        if tamanho < Consts.MEMORIA_X_MIN:
            tamanho = Consts.MEMORIA_X_MIN
            log.write_line(
                'tamanho de memoria muito pequeno, o tamanho minimo foi escolhido'
            )
        elif tamanho > Consts.MEMORIA_X_MAX:
            tamanho = Consts.MEMORIA_X_MAX
            # log.write_line('tamanho de memoria muito grande, o tamanho maximo foi escolhido')

        self.tamanho = 32 * (2**tamanho)
        codeslice = Consts.get_memoria_code_sliced(self.tamanho)
        self.code_slice = codeslice - (codeslice % Consts.CODE_SIZE)
        self.tamanho_total_valores = (
            32 * (2**self.tamanho_informado)) - self.code_slice
        self.memoria = [0 for i in range(self.tamanho)]
        self.sinais = Queue()
        self.dado = None
        self.barramento = barramento
        self.esperando_entrada = False
Exemple #6
0
 def atualizar(self, pos, valor):
     if not isinstance(valor, type(())):
         sinal = Consts.get_vetor_conexao(Consts.CPU,
                                          Consts.RAM,
                                          -pos,
                                          Consts.T_E_VALOR,
                                          len=Consts.T_EVLENGTH)
         sinal[Consts.T_EVALOR_POS] = valor
         self.barramento.enviar_sinal(sinal)
Exemple #7
0
 def get_valor_da_memoria(self, dado):
     # verificar cache antes
     cacheresult = self.cache.get(dado)
     self.dado = None
     if cacheresult is not None:
         return cacheresult
     else:
         sinal = Consts.get_vetor_conexao(Consts.CPU, Consts.RAM, -dado,
                                          Consts.T_L_VALOR)
         self.barramento.enviar_sinal(sinal)
         while self.dado is None:
             # self.log.write_line("cpu => esperando dado")
             pass
         self.cache.add(dado, self.dado[Consts.T_DADOS])
         return self.dado[Consts.T_DADOS]
Exemple #8
0
    def get_instrucao_entrada(self, sinal):
        pos = sinal[Consts.T_DADOS]
        endereco = Consts.get_vetor_conexao(Consts.RAM, Consts.ENTRADA, pos,
                                            Consts.T_E_INSTRUCAO)

        self.barramento.enviar_endereco(endereco)
        self.log.write_line('memoria => sinal enviado')

        while self.dado is None:
            # self.log.write_line("memoria =>> esperando dado")
            pass

        self.escrever_instrucao(pos, self.dado[Consts.T_DADOS])

        self.dado = None

        if self.esperando_entrada:
            self.esperando_entrada = False
            self.enviar_endereco_dado_cpu(pos, Consts.T_L_INSTRUCAO)
Exemple #9
0
    def processar(self, instrucao):
        if instrucao[0] == Consts.INSTRUCOES["end"].codigo:
            self.cache.atualizar_todos()

            Consts.running = False
            self.registradores["CI"] = -1
            self.barramento.exibir_dados()
        elif instrucao[0] == Consts.INSTRUCOES["inc"].codigo:
            val = instrucao[1]
            if self.is_registrador(val):
                self.registradores[chr(int(-val))] += 1
            elif self.is_pos_memoria(val):
                valor = self.get_valor(val)
                self.enviar_valor_memoria(val, valor + 1)
            else:
                Consts.running = False
                raise ValueError(
                    val +
                    " precisa ser posicao de memoria ou um registrador para a operacao 'inc'"
                )

        elif instrucao[0] == Consts.INSTRUCOES["dec"].codigo:
            val = instrucao[1]
            if self.is_registrador(val):
                self.registradores[chr(int(-val))] -= 1
            elif self.is_pos_memoria(val):
                valor = self.get_valor(val)
                self.enviar_valor_memoria(val, valor - 1)
            else:
                Consts.running = False
                raise ValueError(
                    val +
                    " precisa ser posicao de memoria ou um registrador para a operacao 'dec'"
                )

        elif instrucao[0] == Consts.INSTRUCOES["add"].codigo:
            val = self.get_valor(instrucao[1]) + self.get_valor(instrucao[2])
            if self.is_registrador(instrucao[1]):
                self.registradores[chr(int(-instrucao[1]))] = val
            elif self.is_pos_memoria(instrucao[1]):
                self.enviar_valor_memoria(instrucao[1], val)

        elif instrucao[0] == Consts.INSTRUCOES["mov"].codigo:
            pointer = bool(instrucao[1])
            val = self.get_valor(instrucao[3])
            if not pointer and self.is_registrador(instrucao[2]):
                self.registradores[chr(int(-instrucao[2]))] = val
            elif pointer or self.is_pos_memoria(instrucao[2]):
                if pointer:
                    if not self.is_registrador(instrucao[2]):
                        Consts.running = False
                        raise SyntaxError(
                            "Ponteiros devem ser acompanhados de um registrador"
                        )

                    self.enviar_valor_memoria(
                        -self.registradores[chr(int(-instrucao[2]))], val)
                else:
                    self.enviar_valor_memoria(instrucao[2], val)

        elif instrucao[0] == Consts.INSTRUCOES["imul"].codigo:
            val = self.get_valor(instrucao[3]) * self.get_valor(instrucao[2])
            if self.is_registrador(instrucao[1]):
                self.registradores[chr(int(-instrucao[1]))] = val
            elif self.is_pos_memoria(instrucao[1]):
                self.enviar_valor_memoria(instrucao[1], val)

        elif instrucao[0] == Consts.INSTRUCOES["label"].codigo:
            if not self.existe_label(instrucao[1]):
                self.loops.append(Loop(self.registradores["CI"], instrucao[1]))
            else:
                Consts.running = False
                raise Exception("a label " + str(instrucao[1]) + " ja existe")

        elif instrucao[0] == Consts.INSTRUCOES["condicao"].codigo:
            val1 = self.get_valor(instrucao[1])
            val2 = self.get_valor(instrucao[3])

            condicao = eval(
                str(val1) + Consts.get_condicao_string(instrucao[2]) +
                str(val2))

            if condicao:
                self.go_to_loop(instrucao[4])
            else:
                self.go_to_loop(instrucao[5])
        else:
            Consts.running = False
            raise Exception("instrucao invalida codigo:" + str(instrucao[0]))

        self.log.write_line(str(self.registradores))