50e9d133dfa19dc2fda828456a6d23598f39a140
[soc.git] / src / soc / fu / compunits / test / test_cr_compunit.py
1 import unittest
2 from soc.decoder.power_enums import (XER_bits, Function)
3
4 # XXX bad practice: use of global variables
5 from soc.fu.cr.test.test_pipe_caller import get_cu_inputs
6 from soc.fu.cr.test.test_pipe_caller import CRTestCase
7
8 from soc.fu.compunits.compunits import CRFunctionUnit
9 from soc.fu.compunits.test.test_compunit import TestRunner
10 from soc.config.endian import bigendian
11
12
13 class CRTestRunner(TestRunner):
14 def __init__(self, test_data):
15 super().__init__(test_data, CRFunctionUnit, self,
16 Function.CR, bigendian)
17
18 def get_cu_inputs(self, dec2, sim):
19 """naming (res) must conform to CRFunctionUnit input regspec
20 """
21 res = yield from get_cu_inputs(dec2, sim)
22 return res
23
24 def check_cu_outputs(self, res, dec2, sim, alu, code):
25 """naming (res) must conform to CRFunctionUnit output regspec
26 """
27
28 print ("check extra output", repr(code), res)
29
30 # full CR
31 whole_reg = yield dec2.e.do.write_cr_whole
32 cr_en = yield dec2.e.write_cr.ok
33 if whole_reg:
34 full_cr = res['full_cr']
35 expected_cr = sim.cr.get_range().value
36 print(f"expected cr {expected_cr:x}, actual: {full_cr:x}")
37 self.assertEqual(expected_cr, full_cr, code)
38
39 # part-CR
40 if cr_en:
41 cr_sel = yield dec2.e.write_cr.data
42 expected_cr = sim.crl[cr_sel].get_range().value
43 real_cr = res['cr_a']
44 self.assertEqual(expected_cr, real_cr, code)
45
46 # RT
47 out_reg_valid = yield dec2.e.write_reg.ok
48 if out_reg_valid:
49 alu_out = res['o']
50 write_reg_idx = yield dec2.e.write_reg.data
51 expected = sim.gpr(write_reg_idx).value
52 print(f"expected {expected:x}, actual: {alu_out:x}")
53 self.assertEqual(expected, alu_out, code)
54
55
56 if __name__ == "__main__":
57 unittest.main(exit=False)
58 suite = unittest.TestSuite()
59 suite.addTest(CRTestRunner(CRTestCase.test_data))
60
61 runner = unittest.TextTestRunner()
62 runner.run(suite)