2 from copy
import deepcopy
4 from nmutil
.formaltest
import FHDLTestCase
5 from openpower
.decoder
.isa
.caller
import SVP64State
6 from openpower
.decoder
.isa
.test_caller
import run_tst
7 from openpower
.decoder
.selectable_int
import SelectableInt
8 from openpower
.simulator
.program
import Program
9 from openpower
.sv
.trans
.svp64
import SVP64Asm
12 class DecoderTestCase(FHDLTestCase
):
14 def _check_regs(self
, sim
, expected
):
16 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
18 def test_sv_addi_ffirst_le(self
):
19 lst
= SVP64Asm(["sv.subf./ff=le *0,8,*0"
24 svstate
= SVP64State()
26 svstate
.maxvl
= 4 # MAXVL
27 print("SVSTATE", bin(svstate
.asint()))
35 for i
, x
in enumerate(vec
):
38 with
Program(lst
, bigendian
=False) as program
:
39 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
42 val
= sim
.gpr(i
).value
45 # confirm that the results are as expected
46 expected
= deepcopy(vec
)
49 result
= expected
[i
] - gprs
[8]
52 # VLi=0 - test comes FIRST!
54 # only write out if successful
56 for i
, v
in enumerate(res
):
57 self
.assertEqual(v
, expected
[i
])
59 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
60 self
.assertEqual(sim
.svstate
.maxvl
, 4)
61 self
.assertEqual(sim
.svstate
.srcstep
, 0)
62 self
.assertEqual(sim
.svstate
.dststep
, 0)
64 def test_sv_addi_ffirst(self
):
65 lst
= SVP64Asm(["sv.subf./ff=eq *0,8,*0"
70 svstate
= SVP64State()
72 svstate
.maxvl
= 4 # MAXVL
73 print("SVSTATE", bin(svstate
.asint()))
81 for i
, x
in enumerate(vec
):
84 with
Program(lst
, bigendian
=False) as program
:
85 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
88 val
= sim
.gpr(i
).value
91 # confirm that the results are as expected
92 expected
= deepcopy(vec
)
94 result
= expected
[i
] - gprs
[8]
97 # VLi=0 - test comes FIRST!
99 for i
, v
in enumerate(res
):
100 self
.assertEqual(v
, expected
[i
])
102 self
.assertEqual(sim
.svstate
.vl
, 2)
103 self
.assertEqual(sim
.svstate
.maxvl
, 4)
104 self
.assertEqual(sim
.svstate
.srcstep
, 0)
105 self
.assertEqual(sim
.svstate
.dststep
, 0)
107 def test_sv_addi_ffirst_rc1(self
):
108 lst
= SVP64Asm(["sv.subf/ff=RC1 *0,8,*0" # RC1 auto-sets EQ (and Rc=1)
113 svstate
= SVP64State()
115 svstate
.maxvl
= 4 # MAXVL
116 print("SVSTATE", bin(svstate
.asint()))
124 for i
, x
in enumerate(vec
):
127 with
Program(lst
, bigendian
=False) as program
:
128 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
131 val
= sim
.gpr(i
).value
134 # confirm that the results are as expected
135 expected
= deepcopy(vec
)
137 result
= expected
[i
] - gprs
[8]
140 # VLi=0 - test comes FIRST!
142 for i
, v
in enumerate(res
):
143 self
.assertEqual(v
, expected
[i
])
145 self
.assertEqual(sim
.svstate
.vl
, 2)
146 self
.assertEqual(sim
.svstate
.maxvl
, 4)
147 self
.assertEqual(sim
.svstate
.srcstep
, 0)
148 self
.assertEqual(sim
.svstate
.dststep
, 0)
150 def test_sv_addi_ffirst_vli(self
):
151 """data-dependent fail-first with VLi=1, the test comes *after* write
153 lst
= SVP64Asm(["sv.subf/ff=RC1/vli *0,8,*0"
158 svstate
= SVP64State()
160 svstate
.maxvl
= 4 # MAXVL
161 print("SVSTATE", bin(svstate
.asint()))
169 for i
, x
in enumerate(vec
):
172 with
Program(lst
, bigendian
=False) as program
:
173 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
176 val
= sim
.gpr(i
).value
179 # confirm that the results are as expected
180 expected
= deepcopy(vec
)
182 # VLi=1 - test comes AFTER write!
183 expected
[i
] -= gprs
[8]
186 for i
, v
in enumerate(res
):
187 self
.assertEqual(v
, expected
[i
])
189 self
.assertEqual(sim
.svstate
.vl
, 3)
190 self
.assertEqual(sim
.svstate
.maxvl
, 4)
191 self
.assertEqual(sim
.svstate
.srcstep
, 0)
192 self
.assertEqual(sim
.svstate
.dststep
, 0)
194 def run_tst_program(self
, prog
, initial_regs
=None,
198 if initial_regs
is None:
199 initial_regs
= [0] * 32
200 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
201 initial_fprs
=initial_fprs
,
212 if __name__
== "__main__":