2fb8265c2ee70fac830bd8708f24c515497fd73b
[soc.git] / src / soc / fu / mul / test / test_pipe_caller.py
1 import unittest
2 from soc.fu.mul.test.helper import MulTestHelper
3 from soc.simulator.program import Program
4 from soc.config.endian import bigendian
5 from soc.fu.test.common import (TestAccumulatorBase)
6 import random
7
8
9 class MulTestCases2Arg(TestAccumulatorBase):
10 def case_0_mullw(self):
11 lst = [f"mullw 3, 1, 2"]
12 initial_regs = [0] * 32
13 #initial_regs[1] = 0xffffffffffffffff
14 #initial_regs[2] = 0xffffffffffffffff
15 initial_regs[1] = 0x2ffffffff
16 initial_regs[2] = 0x2
17 self.add_case(Program(lst, bigendian), initial_regs)
18
19 def case_1_mullwo_(self):
20 lst = [f"mullwo. 3, 1, 2"]
21 initial_regs = [0] * 32
22 initial_regs[1] = 0x3b34b06f
23 initial_regs[2] = 0xfdeba998
24 self.add_case(Program(lst, bigendian), initial_regs)
25
26 def case_2_mullwo(self):
27 lst = [f"mullwo 3, 1, 2"]
28 initial_regs = [0] * 32
29 initial_regs[1] = 0xffffffffffffa988 # -5678
30 initial_regs[2] = 0xffffffffffffedcc # -1234
31 self.add_case(Program(lst, bigendian), initial_regs)
32
33 def case_3_mullw(self):
34 lst = ["mullw 3, 1, 2",
35 "mullw 3, 1, 2"]
36 initial_regs = [0] * 32
37 initial_regs[1] = 0x6
38 initial_regs[2] = 0xe
39 self.add_case(Program(lst, bigendian), initial_regs)
40
41 def case_4_mullw_rand(self):
42 for i in range(40):
43 lst = ["mullw 3, 1, 2"]
44 initial_regs = [0] * 32
45 initial_regs[1] = random.randint(0, (1 << 64)-1)
46 initial_regs[2] = random.randint(0, (1 << 64)-1)
47 self.add_case(Program(lst, bigendian), initial_regs)
48
49 def case_4_mullw_nonrand(self):
50 for i in range(40):
51 lst = ["mullw 3, 1, 2"]
52 initial_regs = [0] * 32
53 initial_regs[1] = i+1
54 initial_regs[2] = i+20
55 self.add_case(Program(lst, bigendian), initial_regs)
56
57 def case_mulhw__regression_1(self):
58 lst = ["mulhw. 3, 1, 2"
59 ]
60 initial_regs = [0] * 32
61 initial_regs[1] = 0x7745b36eca6646fa
62 initial_regs[2] = 0x47dfba3a63834ba2
63 self.add_case(Program(lst, bigendian), initial_regs)
64
65 def case_rand_mul_lh(self):
66 insns = ["mulhw", "mulhw.", "mulhwu", "mulhwu."]
67 for i in range(40):
68 choice = random.choice(insns)
69 lst = [f"{choice} 3, 1, 2"]
70 initial_regs = [0] * 32
71 initial_regs[1] = random.randint(0, (1 << 64)-1)
72 initial_regs[2] = random.randint(0, (1 << 64)-1)
73 self.add_case(Program(lst, bigendian), initial_regs)
74
75 def case_rand_mullw(self):
76 insns = ["mullw", "mullw.", "mullwo", "mullwo."]
77 for i in range(40):
78 choice = random.choice(insns)
79 lst = [f"{choice} 3, 1, 2"]
80 initial_regs = [0] * 32
81 initial_regs[1] = random.randint(0, (1 << 64)-1)
82 initial_regs[2] = random.randint(0, (1 << 64)-1)
83 self.add_case(Program(lst, bigendian), initial_regs)
84
85 def case_rand_mulld(self):
86 insns = ["mulld", "mulld.", "mulldo", "mulldo."]
87 for i in range(40):
88 choice = random.choice(insns)
89 lst = [f"{choice} 3, 1, 2"]
90 initial_regs = [0] * 32
91 initial_regs[1] = random.randint(0, (1 << 64)-1)
92 initial_regs[2] = random.randint(0, (1 << 64)-1)
93 self.add_case(Program(lst, bigendian), initial_regs)
94
95 def case_rand_mulhd(self):
96 insns = ["mulhd", "mulhd."]
97 for i in range(40):
98 choice = random.choice(insns)
99 lst = [f"{choice} 3, 1, 2"]
100 initial_regs = [0] * 32
101 initial_regs[1] = random.randint(0, (1 << 64)-1)
102 initial_regs[2] = random.randint(0, (1 << 64)-1)
103 self.add_case(Program(lst, bigendian), initial_regs)
104
105 def case_0_mullhw_regression(self):
106 lst = [f"mulhwu 3, 1, 2"]
107 initial_regs = [0] * 32
108 initial_regs[1] = 0x4000000000000000
109 initial_regs[2] = 0x0000000000000002
110 self.add_case(Program(lst, bigendian), initial_regs)
111
112
113 class MulTestCases3Arg(TestAccumulatorBase):
114 # TODO add test case for these 3 operand cases (madd
115 # needs to be implemented)
116 # "maddhd","maddhdu","maddld"
117 def case_maddld(self):
118 lst = ["maddld 1, 2, 3, 4"]
119 initial_regs = [0] * 32
120 initial_regs[2] = 0x3
121 initial_regs[3] = 0x4
122 initial_regs[4] = 0x5
123 self.add_case(Program(lst, bigendian), initial_regs)
124
125
126 class TestPipe(MulTestHelper):
127 def test_mul_pipe_2_arg(self):
128 self.run_all(MulTestCases2Arg().test_data, "mul_pipe_caller_2_arg",
129 has_third_input=False)
130
131 def test_mul_pipe_3_arg(self):
132 self.run_all(MulTestCases3Arg().test_data, "mul_pipe_caller_3_arg",
133 has_third_input=True)
134
135
136 if __name__ == "__main__":
137 unittest.main()