def decode(self, registers: Registers, *args, **kwargs) -> str: if self.rd_number == 0 and self.rs_number == 0: return NopInstruction()(self.word).decode(registers) rd_name = registers.get_register_name(self.rd_number) rt_name = registers.get_register_name(self.rt_number) return (f"{self.instruction_name} " f"{rd_name}, {rt_name}, {self.shamt_value}")
def decode(self, registers: Registers, coprocessor: COProcessor, *args, **kwargs) -> str: ft_name = coprocessor.registers.get_register_name(self.ft_number) rs_number = self.base rs_name = registers.get_register_name(rs_number) offset = self.offset return f"{self.instruction_name} {ft_name}, {offset}({rs_name})"
def execute(self, registers: Registers, program_counter, memory: Memory, *args, **kwargs): rs_register = registers.get_register(self.rs_number) new_pc = rs_register.to_unsigned_int() branch_delayed_word = memory.load(program_counter + 4) branch_delayed_instruction = kwargs['instruction_factory'].factory( branch_delayed_word) delayed_registers, delayed_pc, delayed_memory, coproc = branch_delayed_instruction.execute( registers=registers, program_counter=program_counter + 4, memory=memory, *args, **kwargs) return delayed_registers, new_pc, delayed_memory, kwargs[ 'coprocessor'].registers
def decode(self, registers: Registers, coprocessor: COProcessor, *args, **kwargs) -> str: fs_name = coprocessor.registers.get_register_name(self.fs_number) rt_name = registers.get_register_name(self.rt_number) return f"{self.instruction_name} {rt_name}, {fs_name}"
def decode(self, registers: Registers, *args, **kwargs) -> str: rs_name = registers.get_register_name(self.rs_number) rt_name = registers.get_register_name(self.rt_number) return f"{self.instruction_name} {rs_name}, {rt_name}"
def decode(self, registers: Registers, *args, **kwargs) -> str: rs_name = registers.get_register_name(self.rs_number) rt_name = registers.get_register_name(self.rt_number) immediate_value = self.imediate return f"{self.instruction_name} {rt_name}, {rs_name}, {immediate_value}" # noqa: E501
def decode(self, registers: Registers, *args, **kwargs) -> str: rs_name = registers.get_register_name(self.rs_number) rt_name = registers.get_register_name(self.rt_number) immediate_value = (((1 << 16) - 1) & (self.word.data >> (0))) return f"{self.instruction_name} {rt_name}, {rs_name}, {immediate_value}" # noqa: E501
def decode(self, registers: Registers, *args, **kwargs) -> str: rd_name = registers.get_register_name(self.rd_number) rt_name = registers.get_register_name(self.rt_number) return (f"{self.instruction_name} " f"{rd_name}, {rt_name}, {self.shamt_value}")
def test_get_all_valid_registers(self): registers = Registers() for x in range(32): register = registers.get_register(x) assert isinstance(register, Register)
def test_register_name(self): register_name = "$a0" register_number = 4 registers = Registers() assert register_name == registers.get_register_name(register_number)
def test_modify_register_value(self): new_value = 42 registers = Registers() # register No 4 is register a0 registers.set_register_value(4, new_value) assert new_value == registers.get_register_value(4)
def test_get_invalid_register(self): registers = Registers() with pytest.raises(InvalidRegister): registers.get_register(-1) registers.registers(100)
def test_all_registers_initialized_with_zero(self): registers = Registers() for x in range(32): register_value = registers.get_register_value(x) assert register_value == 0