def test_beq_jump(self): """ LABEL: addi R1,R0,2 add R2,R1,R3 beq R1,R2,LABEL """ text = """00100000000000010000000000000010 ; I1: addi R1,R0,2 00000000001000110001000000100000 ; I2: add R2,R1,R3 00010100001000101111111111111000 ; I3: beq R1,R2,-8""" mips = Mips(text) for i in range(11): mips.execute_pipeline() self.assertTrue(isinstance(mips.pipeline[2].instruction, BeqInstruction)) mips.execute_pipeline() print [i.instruction for i in mips.pipeline]
class TestMipsPipelineSteps(unittest.TestCase): def setUp(self): self.mips = Mips() self.add = Instruction('00000000001001110100100000100000 ; I1: add R9,R1,R7') self.addi = Instruction('00100000000010100000000001100100 ; I2: addi R10,R0,100') def test_an_intermediary_step(self): self.add.instruction_decode(self.mips) self.add.execute(self.mips) self.addi.instruction_decode(self.mips) self.mips.pipeline[2].instruction = self.addi self.mips.pipeline[3].instruction = self.add self.mips.execute_pipeline() self.assertEqual(self.mips.pipeline[2].instruction, self.addi) self.assertTrue(self.mips.pipeline[2].done) self.assertEqual(self.mips.pipeline[3].instruction, self.add) self.assertTrue(self.mips.pipeline[3].done)
class TestMips(unittest.TestCase): def setUp(self): text = """00000000001001110100100000100000 ; I1: add R9,R1,R7 00000000000000010001000000011000 ; I2: mul R2,R0,R1 00100000000010100000000001100100 ; I3: addi R10,R0,100""" self.mips = Mips(text) def test_first_step(self): self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[0].instruction, AddInstruction)) def test_mul_blocking(self): self.mips.execute_pipeline() self.mips.execute_pipeline() self.mips.execute_pipeline() self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[2].instruction, MulInstruction)) self.assertTrue(isinstance(self.mips.pipeline[3].instruction, AddInstruction)) self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[2].instruction, MulInstruction)) self.assertTrue(isinstance(self.mips.pipeline[4].instruction, AddInstruction))
class TestDataForwarding(unittest.TestCase): def setUp(self): text = """00100000000000010000000000000011 ; I1: addi R1,R0,3 00100000001000100000000000000010 ; I2: addi R2,R1,2""" self.mips = Mips(text) def test_without_data_forwarding(self): self.mips.data_forwarding = False self.mips.execute_pipeline() self.mips.execute_pipeline() self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[2].instruction, AddiInstruction)) self.mips.execute_pipeline() self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[4].instruction, AddiInstruction)) self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[2].instruction, AddiInstruction)) def test_without_data_forwarding(self): self.mips.data_forwarding = True self.mips.execute_pipeline() self.mips.execute_pipeline() self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[2].instruction, AddiInstruction)) self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[1].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[3].instruction, AddiInstruction)) self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[2].instruction, AddiInstruction)) self.assertTrue(isinstance(self.mips.pipeline[4].instruction, AddiInstruction)) self.mips.execute_pipeline() self.assertTrue(isinstance(self.mips.pipeline[3].instruction, AddiInstruction))