2 from soc
.decoder
.power_enums
import (XER_bits
, Function
, spr_dict
, SPR
)
4 # XXX bad practice: use of global variables
5 from soc
.fu
.branch
.test
.test_pipe_caller
import BranchTestCase
6 from soc
.fu
.branch
.test
.test_pipe_caller
import test_data
8 from soc
.fu
.compunits
.compunits
import BranchFunctionUnit
9 from soc
.fu
.compunits
.test
.test_compunit
import TestRunner
11 from soc
.regfile
.regfiles
import FastRegs
14 def assert_outputs(self, branch, dec2, sim, prev_nia, code):
17 def fast_reg_to_spr(spr_num
):
18 if spr_num
== FastRegs
.CTR
:
20 elif spr_num
== FastRegs
.LR
:
22 elif spr_num
== FastRegs
.TAR
:
26 class BranchTestRunner(TestRunner
):
27 def __init__(self
, test_data
):
28 super().__init
__(test_data
, BranchFunctionUnit
, self
,
31 def get_cu_inputs(self
, dec2
, sim
):
32 """naming (res) must conform to BranchFunctionUnit input regspec
35 full_reg
= yield dec2
.e
.read_cr_whole
38 res
['cia'] = sim
.pc
.CIA
.value
40 cr1_en
= yield dec2
.e
.read_cr1
.ok
42 cr1_sel
= yield dec2
.e
.read_cr1
.data
43 res
['cr_a'] = sim
.crl
[cr1_sel
].get_range().value
46 spr_ok
= yield dec2
.e
.read_spr1
.ok
47 spr_num
= yield dec2
.e
.read_spr1
.data
49 spr_num
= fast_reg_to_spr(spr_num
)
51 res
['spr1'] = sim
.spr
[spr_dict
[spr_num
].SPR
].value
54 spr_ok
= yield dec2
.e
.read_spr2
.ok
55 spr_num
= yield dec2
.e
.read_spr2
.data
57 spr_num
= fast_reg_to_spr(spr_num
)
59 res
['spr2'] = sim
.spr
[spr_dict
[spr_num
].SPR
].value
61 print ("get inputs", res
)
64 def check_cu_outputs(self
, res
, dec2
, sim
, code
):
65 """naming (res) must conform to BranchFunctionUnit output regspec
68 print ("check extra output", repr(code
), res
)
70 # NIA (next instruction address aka PC)
71 branch_taken
= 'nia' in res
72 # TODO - get the old PC, use it to check if the branch was taken
73 # sim_branch_taken = prev_nia != sim.pc.CIA
74 # self.assertEqual(branch_taken, sim_branch_taken, code)
76 branch_addr
= res
['nia']
77 self
.assertEqual(branch_addr
, sim
.pc
.CIA
.value
, code
)
81 branch_lk
= 'spr2' in res
82 self
.assertEqual(lk
, branch_lk
, code
)
84 branch_lr
= res
['spr2']
85 self
.assertEqual(sim
.spr
['LR'], branch_lr
, code
)
88 ctr_ok
= 'spr1' in res
91 self
.assertEqual(sim
.spr
['CTR'], ctr
, code
)
94 if __name__
== "__main__":
95 unittest
.main(exit
=False)
96 suite
= unittest
.TestSuite()
97 suite
.addTest(BranchTestRunner(test_data
))
99 runner
= unittest
.TextTestRunner()