add Fn class rather than global for generating op ids
[bigint-presentation-code.git] / src / bigint_presentation_code / test_compiler_ir.py
1 import unittest
2
3 from bigint_presentation_code.compiler_ir import (FixedGPRRangeType, Fn, GPRRange, GPRType,
4 Op, OpAddSubE, OpClearCY, OpConcat, OpCopy, OpFuncArg, OpInputMem, OpLI, OpLoad, OpStore,
5 op_set_to_list)
6
7
8 class TestCompilerIR(unittest.TestCase):
9 maxDiff = None
10
11 def test_op_set_to_list(self):
12 fn = Fn()
13 op0 = OpFuncArg(fn, FixedGPRRangeType(GPRRange(3)))
14 op1 = OpCopy(fn, op0.out, GPRType())
15 arg = op1.dest
16 op2 = OpInputMem(fn)
17 mem = op2.out
18 op3 = OpLoad(fn, arg, offset=0, mem=mem, length=32)
19 a = op3.RT
20 op4 = OpLI(fn, 1)
21 b_0 = op4.out
22 op5 = OpLI(fn, 0, length=31)
23 b_rest = op5.out
24 op6 = OpConcat(fn, [b_0, b_rest])
25 b = op6.dest
26 op7 = OpClearCY(fn)
27 cy = op7.out
28 op8 = OpAddSubE(fn, a, b, cy, is_sub=False)
29 s = op8.RT
30 op9 = OpStore(fn, s, arg, offset=0, mem_in=mem)
31 mem = op9.mem_out
32
33 expected_ops = [
34 op7, # OpClearCY()
35 op5, # OpLI(0, length=31)
36 op4, # OpLI(1)
37 op2, # OpInputMem()
38 op0, # OpFuncArg(FixedGPRRangeType(GPRRange(3)))
39 op6, # OpConcat([b_0, b_rest])
40 op1, # OpCopy(op0.out, GPRType())
41 op3, # OpLoad(arg, offset=0, mem=mem, length=32)
42 op8, # OpAddSubE(a, b, cy, is_sub=False)
43 op9, # OpStore(s, arg, offset=0, mem_in=mem)
44 ]
45
46 ops = op_set_to_list(fn.ops[::-1])
47 if ops != expected_ops:
48 self.assertEqual(repr(ops), repr(expected_ops))
49
50
51 if __name__ == "__main__":
52 unittest.main()