af5fb4702feea7043246038267bc3d30c2e2158b
1 from nmigen
import Module
, Signal
2 from nmigen
.sim
import Simulator
, Delay
, Settle
3 from nmutil
.formaltest
import FHDLTestCase
5 from openpower
.decoder
.isa
.caller
import ISACaller
6 from openpower
.decoder
.power_decoder
import (create_pdecode
)
7 from openpower
.decoder
.power_decoder2
import (PowerDecode2
)
8 from openpower
.simulator
.program
import Program
9 from openpower
.decoder
.isa
.caller
import ISACaller
, SVP64State
10 from openpower
.decoder
.selectable_int
import SelectableInt
11 from openpower
.decoder
.orderedset
import OrderedSet
12 from openpower
.decoder
.isa
.all
import ISA
13 from openpower
.decoder
.isa
.test_caller
import Register
, run_tst
14 from openpower
.sv
.trans
.svp64
import SVP64Asm
15 from openpower
.consts
import SVP64CROffs
16 from copy
import deepcopy
17 from openpower
.decoder
.helpers
import fp64toselectable
18 from functools
import reduce
22 class DecoderTestCase(FHDLTestCase
):
24 def _check_regs(self
, sim
, expected
):
26 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
28 def test_sv_addi_ffirst_le(self
):
29 lst
= SVP64Asm([ "sv.subf./ff=le *0,8,*0"
34 svstate
= SVP64State()
36 svstate
.maxvl
= 4 # MAXVL
37 print ("SVSTATE", bin(svstate
.asint()))
45 for i
, x
in enumerate(vec
):
48 with
Program(lst
, bigendian
=False) as program
:
49 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
52 val
= sim
.gpr(i
).value
55 # confirm that the results are as expected
56 expected
= deepcopy(vec
)
59 result
= expected
[i
] - gprs
[8]
63 # only write out if successful
65 for i
, v
in enumerate(res
):
66 self
.assertEqual(v
, expected
[i
])
68 self
.assertEqual(sim
.svstate
.vl
, expected_vl
)
69 self
.assertEqual(sim
.svstate
.maxvl
, 4)
70 self
.assertEqual(sim
.svstate
.srcstep
, 0)
71 self
.assertEqual(sim
.svstate
.dststep
, 0)
73 def test_sv_addi_ffirst(self
):
74 lst
= SVP64Asm([ "sv.subf./ff=eq *0,8,*0"
79 svstate
= SVP64State()
81 svstate
.maxvl
= 4 # MAXVL
82 print ("SVSTATE", bin(svstate
.asint()))
90 for i
, x
in enumerate(vec
):
93 with
Program(lst
, bigendian
=False) as program
:
94 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
97 val
= sim
.gpr(i
).value
100 # confirm that the results are as expected
101 expected
= deepcopy(vec
)
103 result
= expected
[i
] - gprs
[8]
107 for i
, v
in enumerate(res
):
108 self
.assertEqual(v
, expected
[i
])
110 self
.assertEqual(sim
.svstate
.vl
, 2)
111 self
.assertEqual(sim
.svstate
.maxvl
, 4)
112 self
.assertEqual(sim
.svstate
.srcstep
, 0)
113 self
.assertEqual(sim
.svstate
.dststep
, 0)
115 def test_sv_addi_ffirst_rc1(self
):
116 lst
= SVP64Asm([ "sv.subf/ff=RC1 *0,8,*0" # RC1 auto-sets EQ (and Rc=1)
121 svstate
= SVP64State()
123 svstate
.maxvl
= 4 # MAXVL
124 print ("SVSTATE", bin(svstate
.asint()))
132 for i
, x
in enumerate(vec
):
135 with
Program(lst
, bigendian
=False) as program
:
136 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
139 val
= sim
.gpr(i
).value
142 # confirm that the results are as expected
143 expected
= deepcopy(vec
)
145 result
= expected
[i
] - gprs
[8]
149 for i
, v
in enumerate(res
):
150 self
.assertEqual(v
, expected
[i
])
152 self
.assertEqual(sim
.svstate
.vl
, 2)
153 self
.assertEqual(sim
.svstate
.maxvl
, 4)
154 self
.assertEqual(sim
.svstate
.srcstep
, 0)
155 self
.assertEqual(sim
.svstate
.dststep
, 0)
157 def test_sv_addi_ffirst_vli(self
):
158 lst
= SVP64Asm([ "sv.subf/ff=RC1/vli *0,8,*0"
163 svstate
= SVP64State()
165 svstate
.maxvl
= 4 # MAXVL
166 print ("SVSTATE", bin(svstate
.asint()))
174 for i
, x
in enumerate(vec
):
177 with
Program(lst
, bigendian
=False) as program
:
178 sim
= self
.run_tst_program(program
, initial_regs
=gprs
,
181 val
= sim
.gpr(i
).value
184 # confirm that the results are as expected
185 expected
= deepcopy(vec
)
187 expected
[i
] -= gprs
[8]
190 for i
, v
in enumerate(res
):
191 self
.assertEqual(v
, expected
[i
])
193 self
.assertEqual(sim
.svstate
.vl
, 3)
194 self
.assertEqual(sim
.svstate
.maxvl
, 4)
195 self
.assertEqual(sim
.svstate
.srcstep
, 0)
196 self
.assertEqual(sim
.svstate
.dststep
, 0)
198 def run_tst_program(self
, prog
, initial_regs
=None,
202 if initial_regs
is None:
203 initial_regs
= [0] * 32
204 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
205 initial_fprs
=initial_fprs
,
216 if __name__
== "__main__":