210fb18a9e0615364d1504a52c13bdf87ef2cf23
[Mograsim.git] / net.mograsim.logic.ui.am2900 / test / net / mograsim / logic / ui / am2900 / Am2901Test.java
1 package net.mograsim.logic.ui.am2900;\r
2 \r
3 import static net.mograsim.logic.ui.am2900.TestUtil.*;\r
4 import static net.mograsim.logic.ui.am2900.TestableAm2901.Am2901_Dest.*;\r
5 import static net.mograsim.logic.ui.am2900.TestableAm2901.Am2901_Func.*;\r
6 import static net.mograsim.logic.ui.am2900.TestableAm2901.Am2901_Src.*;\r
7 import static net.mograsim.logic.ui.am2900.TestableAm2901.Register.*;\r
8 import static org.junit.jupiter.api.Assertions.*;\r
9 \r
10 import java.awt.Point;\r
11 import java.util.stream.IntStream;\r
12 import java.util.stream.Stream;\r
13 \r
14 import org.junit.jupiter.api.BeforeEach;\r
15 import org.junit.jupiter.api.Order;\r
16 import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;\r
17 import org.junit.jupiter.api.Test;\r
18 import org.junit.jupiter.api.TestMethodOrder;\r
19 import org.junit.jupiter.params.ParameterizedTest;\r
20 import org.junit.jupiter.params.provider.ArgumentsSource;\r
21 import net.mograsim.logic.ui.am2900.TestableAm2901.Register;\r
22 \r
23 @TestMethodOrder(OrderAnnotation.class)\r
24 public class Am2901Test\r
25 {\r
26         private TestableAm2901 am2901;\r
27 \r
28         @BeforeEach\r
29         void initialize()\r
30         {\r
31                 createAndSetup();\r
32                 setInputsToZero();\r
33         }\r
34 \r
35         void createAndSetup()\r
36         {\r
37                 am2901 = new TestableAm2901Impl();\r
38                 am2901.setup();\r
39         }\r
40 \r
41         void setRegistersToZero()\r
42         {\r
43                 setInputsToZero();\r
44                 for (Register r : Register.values())\r
45                 {\r
46                         setRegisterToZero(r);\r
47                 }\r
48         }\r
49 \r
50         void setRegisterToZero(Register r)\r
51         {\r
52                 System.out.println("Setting reg " + r + " to zero");\r
53 \r
54                 am2901.setD("0000");\r
55                 am2901.setSrc(DZ);\r
56                 am2901.setFunc(AND);\r
57                 setRegOutput(r);\r
58 \r
59                 am2901.assertFullCycleSuccess();\r
60         }\r
61 \r
62         void setRegOutput(Register r)\r
63         {\r
64                 if (r == Q)\r
65                 {\r
66                         am2901.setDest(QREG);\r
67                 } else\r
68                 {\r
69                         am2901.setReg_B(r.toBitString());\r
70                         am2901.setDest(RAMF);\r
71                 }\r
72         }\r
73 \r
74         void setInputsToZero()\r
75         {\r
76                 am2901.setCarryIn("0");\r
77                 am2901.setQ_0("0");\r
78                 am2901.setQ_3("0");\r
79                 am2901.setRAM_0("0");\r
80                 am2901.setRAM_3("0");\r
81                 am2901.setReg_A("0000");\r
82                 am2901.setReg_B("0000");\r
83                 am2901.setD("0000");\r
84                 am2901.setSrc(AB);\r
85                 am2901.setFunc(ADD);\r
86                 am2901.setDest(QREG);\r
87 //              am2901.setNotOutEnable("0"); TODO\r
88                 am2901.clockOn(true);\r
89                 am2901.assertRunSuccess();\r
90         }\r
91 \r
92         @Order(1)\r
93         @ParameterizedTest\r
94         @ArgumentsSource(TestableAm2901.RegisterProvider.class)\r
95         void testDirectAccess(Register r)\r
96         {\r
97                 assertEquals("UUUU", am2901.getDirectly(r));\r
98 \r
99                 am2901.setDirectly(r, "1011");\r
100 \r
101                 assertEquals("1011", am2901.getDirectly(r));\r
102         }\r
103 \r
104         @Order(2)\r
105         @ParameterizedTest\r
106         @ArgumentsSource(TestableAm2901.RegisterProvider.class)\r
107         void testSetToZero(Register r)\r
108         {\r
109                 assertEquals("UUUU", am2901.getDirectly(r));\r
110 \r
111                 setRegisterToZero(r);\r
112 \r
113                 assertEquals("0000", am2901.getDirectly(r));\r
114                 assertEquals("0000", am2901.getY());\r
115                 assertEquals("0", am2901.getCarryOut());\r
116                 assertEquals("0", am2901.getOverflow());\r
117                 assertEquals("0", am2901.getSign());\r
118                 assertEquals("1", am2901.getZero());\r
119         }\r
120 \r
121         @Order(3)\r
122         @Test\r
123         void testSetAllToZero()\r
124         {\r
125                 setRegistersToZero();\r
126 \r
127                 assertEquals("0000", am2901.getY());\r
128                 assertEquals("0", am2901.getCarryOut());\r
129                 assertEquals("0", am2901.getOverflow());\r
130                 assertEquals("0", am2901.getSign());\r
131                 assertEquals("1", am2901.getZero());\r
132                 assertEquals("0", am2901.getQ_0());\r
133                 assertEquals("0", am2901.getQ_3());\r
134                 assertEquals("0", am2901.getRAM_0());\r
135                 assertEquals("0", am2901.getRAM_3());\r
136 \r
137                 assertAll("register values", Register.stream().map(r -> () ->\r
138                 {\r
139                         assertEquals("0000", am2901.getDirectly(r), r.name());\r
140                 }));\r
141         }\r
142 \r
143         @Order(4)\r
144         @Test\r
145         void testADD()\r
146         {\r
147                 am2901.setSrc(DA);\r
148                 am2901.setFunc(ADD);\r
149                 am2901.setDest(NOP);\r
150                 am2901.setReg_A(r0.toBitString());\r
151 \r
152                 assertAll(getAll4BitPairs().map(xy -> () ->\r
153                 {\r
154                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
155                         am2901.setD(to4bitBin(xy.y));\r
156 \r
157                         am2901.assertFullCycleSuccess();\r
158 \r
159                         int res32Bit = xy.x + xy.y;\r
160                         int res4Bit = res32Bit & 0b1111;\r
161                         int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y);\r
162                         int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);\r
163 \r
164                         String desc = xy.x + " + " + xy.y + " = " + res4Bit + ": ";\r
165 \r
166                         assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");\r
167                         assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");\r
168                         assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");\r
169                         assertEquals(to1bitBin(res32Bit & 0b1_0000), am2901.getCarryOut(), desc + "Cn+4");\r
170                         assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");\r
171                 }));\r
172         }\r
173 \r
174         @Order(4)\r
175         @Test\r
176         void testAND()\r
177         {\r
178                 am2901.setSrc(DA);\r
179                 am2901.setFunc(AND);\r
180                 am2901.setDest(NOP);\r
181                 am2901.setReg_A(r0.toBitString());\r
182 \r
183                 assertAll(getAll4BitPairs().map(xy -> () ->\r
184                 {\r
185                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
186                         am2901.setD(to4bitBin(xy.y));\r
187 \r
188                         am2901.assertFullCycleSuccess();\r
189 \r
190                         int res32Bit = xy.x & xy.y;\r
191 \r
192                         String desc = xy.x + " & " + xy.y + " = " + res32Bit + ": ";\r
193 \r
194                         assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
195                         assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
196                         assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
197 //                      assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
198 //                      assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), desc + "OVR"); // TODO\r
199                 }));\r
200         }\r
201 \r
202         @Order(4)\r
203         @Test\r
204         void testOR()\r
205         {\r
206                 am2901.setSrc(DA);\r
207                 am2901.setFunc(OR);\r
208                 am2901.setDest(NOP);\r
209                 am2901.setReg_A(r0.toBitString());\r
210 \r
211                 assertAll(getAll4BitPairs().map(xy -> () ->\r
212                 {\r
213                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
214                         am2901.setD(to4bitBin(xy.y));\r
215 \r
216                         am2901.assertFullCycleSuccess();\r
217 \r
218                         int res32Bit = xy.x | xy.y;\r
219 \r
220                         String desc = xy.x + " | " + xy.y + " = " + res32Bit + ": ";\r
221 \r
222                         assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
223                         assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
224                         assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
225 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
226 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO\r
227                 }));\r
228         }\r
229 \r
230         @Order(4)\r
231         @Test\r
232         void testXOR()\r
233         {\r
234                 am2901.setSrc(DA);\r
235                 am2901.setFunc(EXOR);\r
236                 am2901.setDest(NOP);\r
237                 am2901.setReg_A(r0.toBitString());\r
238 \r
239                 assertAll(getAll4BitPairs().map(xy -> () ->\r
240                 {\r
241                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
242                         am2901.setD(to4bitBin(xy.y));\r
243 \r
244                         am2901.assertFullCycleSuccess();\r
245 \r
246                         int res32Bit = xy.x ^ xy.y;\r
247 \r
248                         String desc = xy.x + " ^ " + xy.y + " = " + res32Bit + ": ";\r
249 \r
250                         assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
251                         assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
252                         assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
253 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
254 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO\r
255                 }));\r
256         }\r
257 \r
258         @Order(4)\r
259         @Test\r
260         void testSUB()\r
261         {\r
262                 am2901.setSrc(DA);\r
263                 am2901.setCarryIn("1");\r
264                 am2901.setFunc(SUBR);\r
265                 am2901.setDest(NOP);\r
266                 am2901.setReg_A(r0.toBitString());\r
267 \r
268                 assertAll(getAll4BitPairs().map(xy -> () ->\r
269                 {\r
270                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
271                         am2901.setD(to4bitBin(xy.y));\r
272 \r
273                         am2901.assertFullCycleSuccess();\r
274 \r
275                         int res32Bit = xy.x - xy.y;\r
276                         int res4Bit = res32Bit & 0b1111;\r
277                         int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y);\r
278                         int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);\r
279 \r
280                         String desc = xy.x + " - " + xy.y + " = " + res4Bit + ": ";\r
281 \r
282                         assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");\r
283                         assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");\r
284                         assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");\r
285                         assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), desc + "Cn+4");\r
286                         assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");\r
287                 }));\r
288         }\r
289 \r
290         static Stream<Point> getAll4BitPairs()\r
291         {\r
292                 return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y)));\r
293         }\r
294 }\r