change Op/Ty/SSAVal reprs to be easier to read
[bigint-presentation-code.git] / src / bigint_presentation_code / _tests / test_compiler_ir2.py
1 import unittest
2
3 from bigint_presentation_code.compiler_ir2 import (GPR_SIZE_IN_BYTES, Fn,
4 OpKind, PreRASimState,
5 SSAVal)
6
7
8 class TestCompilerIR(unittest.TestCase):
9 maxDiff = None
10
11 def make_add_fn(self):
12 # type: () -> tuple[Fn, SSAVal]
13 fn = Fn()
14 op0 = fn.append_new_op(OpKind.FuncArgR3, name="arg")
15 arg = op0.outputs[0]
16 MAXVL = 32
17 op1 = fn.append_new_op(OpKind.SetVLI, immediates=[MAXVL], name="vl")
18 vl = op1.outputs[0]
19 op2 = fn.append_new_op(
20 OpKind.SvLd, inputs=[arg, vl], immediates=[0], maxvl=MAXVL,
21 name="ld")
22 a = op2.outputs[0]
23 op3 = fn.append_new_op(
24 OpKind.SvLI, inputs=[vl], immediates=[0], maxvl=MAXVL, name="li")
25 b = op3.outputs[0]
26 op4 = fn.append_new_op(OpKind.SetCA, name="ca")
27 ca = op4.outputs[0]
28 op5 = fn.append_new_op(
29 OpKind.SvAddE, inputs=[a, b, ca, vl], maxvl=MAXVL, name="add")
30 s = op5.outputs[0]
31 fn.append_new_op(
32 OpKind.SvStd, inputs=[s, arg, vl], immediates=[0], maxvl=MAXVL,
33 name="st")
34 return fn, arg
35
36 def test_repr(self):
37 fn, _arg = self.make_add_fn()
38 self.assertEqual([repr(i) for i in fn.ops], [
39 "Op(kind=OpKind.FuncArgR3, "
40 "inputs=[], "
41 "immediates=[], "
42 "outputs=(<arg#0: <I64>>,), name='arg')",
43 "Op(kind=OpKind.SetVLI, "
44 "inputs=[], "
45 "immediates=[32], "
46 "outputs=(<vl#0: <VL_MAXVL>>,), name='vl')",
47 "Op(kind=OpKind.SvLd, "
48 "inputs=[<arg#0: <I64>>, <vl#0: <VL_MAXVL>>], "
49 "immediates=[0], "
50 "outputs=(<ld#0: <I64*32>>,), name='ld')",
51 "Op(kind=OpKind.SvLI, "
52 "inputs=[<vl#0: <VL_MAXVL>>], "
53 "immediates=[0], "
54 "outputs=(<li#0: <I64*32>>,), name='li')",
55 "Op(kind=OpKind.SetCA, "
56 "inputs=[], "
57 "immediates=[], "
58 "outputs=(<ca#0: <CA>>,), name='ca')",
59 "Op(kind=OpKind.SvAddE, "
60 "inputs=[<ld#0: <I64*32>>, <li#0: <I64*32>>, <ca#0: <CA>>, <vl#0: <VL_MAXVL>>], "
61 "immediates=[], "
62 "outputs=(<add#0: <I64*32>>, <add#1: <CA>>), name='add')",
63 "Op(kind=OpKind.SvStd, "
64 "inputs=[<add#0: <I64*32>>, <arg#0: <I64>>, <vl#0: <VL_MAXVL>>], "
65 "immediates=[0], "
66 "outputs=(), name='st')",
67 ])
68
69 def test_sim(self):
70 fn, arg = self.make_add_fn()
71 addr = 0x100
72 state = PreRASimState(ssa_vals={arg: (addr,)}, memory={})
73 state.store(addr=addr, value=0xffffffff_ffffffff,
74 size_in_bytes=GPR_SIZE_IN_BYTES)
75 state.store(addr=addr + GPR_SIZE_IN_BYTES, value=0xabcdef01_23456789,
76 size_in_bytes=GPR_SIZE_IN_BYTES)
77 self.assertEqual(
78 repr(state),
79 "PreRASimState(ssa_vals={<arg#0: <I64>>: (0x100,)}, memory={\n"
80 "0x00100: <0xffffffffffffffff>,\n"
81 "0x00108: <0xabcdef0123456789>})")
82 fn.pre_ra_sim(state)
83 self.assertEqual(
84 repr(state),
85 "PreRASimState(ssa_vals={\n"
86 "<arg#0: <I64>>: (0x100,),\n"
87 "<vl#0: <VL_MAXVL>>: (0x20,),\n"
88 "<ld#0: <I64*32>>: (\n"
89 " 0xffffffffffffffff, 0xabcdef0123456789, 0x0, 0x0,\n"
90 " 0x0, 0x0, 0x0, 0x0,\n"
91 " 0x0, 0x0, 0x0, 0x0,\n"
92 " 0x0, 0x0, 0x0, 0x0,\n"
93 " 0x0, 0x0, 0x0, 0x0,\n"
94 " 0x0, 0x0, 0x0, 0x0,\n"
95 " 0x0, 0x0, 0x0, 0x0,\n"
96 " 0x0, 0x0, 0x0, 0x0),\n"
97 "<li#0: <I64*32>>: (\n"
98 " 0x0, 0x0, 0x0, 0x0,\n"
99 " 0x0, 0x0, 0x0, 0x0,\n"
100 " 0x0, 0x0, 0x0, 0x0,\n"
101 " 0x0, 0x0, 0x0, 0x0,\n"
102 " 0x0, 0x0, 0x0, 0x0,\n"
103 " 0x0, 0x0, 0x0, 0x0,\n"
104 " 0x0, 0x0, 0x0, 0x0,\n"
105 " 0x0, 0x0, 0x0, 0x0),\n"
106 "<ca#0: <CA>>: (0x1,),\n"
107 "<add#0: <I64*32>>: (\n"
108 " 0x0, 0xabcdef012345678a, 0x0, 0x0,\n"
109 " 0x0, 0x0, 0x0, 0x0,\n"
110 " 0x0, 0x0, 0x0, 0x0,\n"
111 " 0x0, 0x0, 0x0, 0x0,\n"
112 " 0x0, 0x0, 0x0, 0x0,\n"
113 " 0x0, 0x0, 0x0, 0x0,\n"
114 " 0x0, 0x0, 0x0, 0x0,\n"
115 " 0x0, 0x0, 0x0, 0x0),\n"
116 "<add#1: <CA>>: (0x0,),\n"
117 "}, memory={\n"
118 "0x00100: <0x0000000000000000>,\n"
119 "0x00108: <0xabcdef012345678a>,\n"
120 "0x00110: <0x0000000000000000>,\n"
121 "0x00118: <0x0000000000000000>,\n"
122 "0x00120: <0x0000000000000000>,\n"
123 "0x00128: <0x0000000000000000>,\n"
124 "0x00130: <0x0000000000000000>,\n"
125 "0x00138: <0x0000000000000000>,\n"
126 "0x00140: <0x0000000000000000>,\n"
127 "0x00148: <0x0000000000000000>,\n"
128 "0x00150: <0x0000000000000000>,\n"
129 "0x00158: <0x0000000000000000>,\n"
130 "0x00160: <0x0000000000000000>,\n"
131 "0x00168: <0x0000000000000000>,\n"
132 "0x00170: <0x0000000000000000>,\n"
133 "0x00178: <0x0000000000000000>,\n"
134 "0x00180: <0x0000000000000000>,\n"
135 "0x00188: <0x0000000000000000>,\n"
136 "0x00190: <0x0000000000000000>,\n"
137 "0x00198: <0x0000000000000000>,\n"
138 "0x001a0: <0x0000000000000000>,\n"
139 "0x001a8: <0x0000000000000000>,\n"
140 "0x001b0: <0x0000000000000000>,\n"
141 "0x001b8: <0x0000000000000000>,\n"
142 "0x001c0: <0x0000000000000000>,\n"
143 "0x001c8: <0x0000000000000000>,\n"
144 "0x001d0: <0x0000000000000000>,\n"
145 "0x001d8: <0x0000000000000000>,\n"
146 "0x001e0: <0x0000000000000000>,\n"
147 "0x001e8: <0x0000000000000000>,\n"
148 "0x001f0: <0x0000000000000000>,\n"
149 "0x001f8: <0x0000000000000000>})")
150
151
152 if __name__ == "__main__":
153 unittest.main()