1 from nmigen
import Module
, Signal
2 from nmigen
.back
.pysim
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 copy
import deepcopy
15 from openpower
.sv
.trans
.svp64
import SVP64Asm
16 from openpower
.decoder
.helpers
import fp64toselectable
17 from openpower
.decoder
.isafunctions
.double2single
import DOUBLE2SINGLE
21 class FPTranscendentalsTestCase(FHDLTestCase
):
23 def _check_regs(self
, sim
, expected_int
, expected_fpr
):
25 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
27 self
.assertEqual(sim
.fpr(i
), SelectableInt(expected_fpr
[i
], 64))
29 def tst_fp_sins_coss(self
):
30 """>>> lst = ["fsins 1, 2",
34 lst
= SVP64Asm(["fsins 1, 2",
39 with
Program(lst
, bigendian
=False) as program
:
41 for i
in range(-8, 9):
42 a
= math
.pi
* (i
/ 8.0) * 2.0
43 fprs
[2] = fp64toselectable(a
)
46 a1
= fp64toselectable(a
) # convert to Power single
47 t
= DOUBLE2SINGLE(fp64toselectable(t
)) # convert to Power single
48 u
= DOUBLE2SINGLE(fp64toselectable(u
)) # convert to Power single
51 sim
= self
.run_tst_program(program
, initial_fprs
=fprs
)
52 print("FPR 1", sim
.fpr(1))
53 print("FPR 2", sim
.fpr(2))
54 print("FPR 3", sim
.fpr(3))
55 self
.assertEqual(sim
.fpr(2), SelectableInt(a1
, 64))
56 self
.assertEqual(sim
.fpr(1), SelectableInt(t
, 64))
57 self
.assertEqual(sim
.fpr(3), SelectableInt(u
, 64))
59 def test_fp_coss_cvt(self
):
64 lst
= SVP64Asm(["stw 1, 0(0)",
67 "fadds 0, 0, 3", # plus 0.5
68 "fmuls 0, 0, 1", # times PI
69 "fdivs 0, 0, 2", # div 4.0
74 with
Program(lst
, bigendian
=False) as program
:
78 fprs
[3] = fp64toselectable(0.5) # 0.5
79 fprs
[1] = fp64toselectable(math
.pi
) # pi
80 fprs
[2] = fp64toselectable(4.0) # 4.0
81 #for i in range(-8, 9):
83 a
= math
.pi
* ((i
+0.5) / 4.0)
85 a1
= DOUBLE2SINGLE(fp64toselectable(a
)) # to Power single
88 u
= DOUBLE2SINGLE(fp64toselectable(u
)) # convert to Power single
91 sim
= self
.run_tst_program(program
, gprs
, initial_fprs
=fprs
)
92 print("FPR 0", sim
.fpr(0), float(sim
.fpr(0)))
93 print("FPR 1", sim
.fpr(1), float(sim
.fpr(1)))
94 print("FPR 2", sim
.fpr(2), float(sim
.fpr(2)))
95 print("FPR 3", sim
.fpr(3), float(sim
.fpr(3)))
96 print("FPR 4", sim
.fpr(4), float(sim
.fpr(4)))
97 # sign should not do this, but hey
98 actual_r
= float(sim
.fpr(0))
99 expected_r
= float(a1
)
100 err
= abs(actual_r
- expected_r
) / expected_r
101 self
.assertTrue(err
< 1e-6)
102 actual_r
= float(sim
.fpr(4))
103 expected_r
= float(u
)
104 err
= abs(actual_r
- expected_r
) / expected_r
105 self
.assertTrue(err
< 1e-6)
107 def run_tst_program(self
, prog
, initial_regs
=None,
110 if initial_regs
is None:
111 initial_regs
= [0] * 32
112 simulator
= run_tst(prog
, initial_regs
, mem
=initial_mem
,
113 initial_fprs
=initial_fprs
)
121 if __name__
== "__main__":