Added DeserializedSubmodelComponent Editor project
[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                 am2901.setD("0000");\r
53                 am2901.setSrc(DZ);\r
54                 am2901.setFunc(AND);\r
55                 setRegOutput(r);\r
56 \r
57                 am2901.assertFullCycleSuccess();\r
58         }\r
59 \r
60         void setRegOutput(Register r)\r
61         {\r
62                 if (r == Q)\r
63                 {\r
64                         am2901.setDest(QREG);\r
65                 } else\r
66                 {\r
67                         am2901.setReg_B(r.toBitString());\r
68                         am2901.setDest(RAMF);\r
69                 }\r
70         }\r
71 \r
72         void setInputsToZero()\r
73         {\r
74                 am2901.setCarryIn("0");\r
75                 am2901.setQ_0("0");\r
76                 am2901.setQ_3("0");\r
77                 am2901.setRAM_0("0");\r
78                 am2901.setRAM_3("0");\r
79                 am2901.setReg_A("0000");\r
80                 am2901.setReg_B("0000");\r
81                 am2901.setD("0000");\r
82                 am2901.setSrc(AB);\r
83                 am2901.setFunc(ADD);\r
84                 am2901.setDest(QREG);\r
85 //              am2901.setNotOutEnable("0"); TODO\r
86                 am2901.clockOn(true);\r
87                 am2901.assertRunSuccess();\r
88         }\r
89 \r
90         @Order(1)\r
91         @ParameterizedTest\r
92         @ArgumentsSource(TestableAm2901.RegisterProvider.class)\r
93         void testDirectAccess(Register r)\r
94         {\r
95                 assertEquals("UUUU", am2901.getDirectly(r));\r
96 \r
97                 am2901.setDirectly(r, "1011");\r
98 \r
99                 assertEquals("1011", am2901.getDirectly(r));\r
100         }\r
101 \r
102         @Order(2)\r
103         @ParameterizedTest\r
104         @ArgumentsSource(TestableAm2901.RegisterProvider.class)\r
105         void testSetToZero(Register r)\r
106         {\r
107                 assertEquals("UUUU", am2901.getDirectly(r));\r
108 \r
109                 setRegisterToZero(r);\r
110 \r
111                 assertEquals("0000", am2901.getDirectly(r));\r
112                 assertEquals("0000", am2901.getY());\r
113                 assertEquals("0", am2901.getCarryOut());\r
114                 assertEquals("0", am2901.getOverflow());\r
115                 assertEquals("0", am2901.getSign());\r
116                 assertEquals("1", am2901.getZero());\r
117         }\r
118 \r
119         @Order(3)\r
120         @Test\r
121         void testSetAllToZero()\r
122         {\r
123                 setRegistersToZero();\r
124 \r
125                 assertEquals("0000", am2901.getY());\r
126                 assertEquals("0", am2901.getCarryOut());\r
127                 assertEquals("0", am2901.getOverflow());\r
128                 assertEquals("0", am2901.getSign());\r
129                 assertEquals("1", am2901.getZero());\r
130                 assertEquals("0", am2901.getQ_0());\r
131                 assertEquals("0", am2901.getQ_3());\r
132                 assertEquals("0", am2901.getRAM_0());\r
133                 assertEquals("0", am2901.getRAM_3());\r
134 \r
135                 assertAll("register values", Register.stream().map(r -> () ->\r
136                 {\r
137                         assertEquals("0000", am2901.getDirectly(r), r.name());\r
138                 }));\r
139         }\r
140 \r
141         @Order(4)\r
142         @Test\r
143         void testADD()\r
144         {\r
145                 am2901.setSrc(DA);\r
146                 am2901.setFunc(ADD);\r
147                 am2901.setDest(NOP);\r
148                 am2901.setReg_A(r0.toBitString());\r
149 \r
150                 assertAll(getAll4BitPairs().map(xy -> () ->\r
151                 {\r
152                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
153                         am2901.setD(to4bitBin(xy.y));\r
154 \r
155                         am2901.assertFullCycleSuccess();\r
156 \r
157                         int res32Bit = xy.x + xy.y;\r
158                         int res4Bit = res32Bit & 0b1111;\r
159                         int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y);\r
160                         int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);\r
161 \r
162                         String desc = xy.x + " + " + xy.y + " = " + res4Bit + ": ";\r
163 \r
164                         assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");\r
165                         assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");\r
166                         assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");\r
167                         assertEquals(to1bitBin(res32Bit & 0b1_0000), am2901.getCarryOut(), desc + "Cn+4");\r
168                         assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");\r
169                 }));\r
170         }\r
171 \r
172         @Order(4)\r
173         @Test\r
174         void testAND()\r
175         {\r
176                 am2901.setSrc(DA);\r
177                 am2901.setFunc(AND);\r
178                 am2901.setDest(NOP);\r
179                 am2901.setReg_A(r0.toBitString());\r
180 \r
181                 assertAll(getAll4BitPairs().map(xy -> () ->\r
182                 {\r
183                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
184                         am2901.setD(to4bitBin(xy.y));\r
185 \r
186                         am2901.assertFullCycleSuccess();\r
187 \r
188                         int res32Bit = xy.x & xy.y;\r
189 \r
190                         String desc = xy.x + " & " + xy.y + " = " + res32Bit + ": ";\r
191 \r
192                         assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
193                         assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
194                         assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
195 //                      assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
196 //                      assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), desc + "OVR"); // TODO\r
197                 }));\r
198         }\r
199 \r
200         @Order(4)\r
201         @Test\r
202         void testOR()\r
203         {\r
204                 am2901.setSrc(DA);\r
205                 am2901.setFunc(OR);\r
206                 am2901.setDest(NOP);\r
207                 am2901.setReg_A(r0.toBitString());\r
208 \r
209                 assertAll(getAll4BitPairs().map(xy -> () ->\r
210                 {\r
211                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
212                         am2901.setD(to4bitBin(xy.y));\r
213 \r
214                         am2901.assertFullCycleSuccess();\r
215 \r
216                         int res32Bit = xy.x | xy.y;\r
217 \r
218                         String desc = xy.x + " | " + xy.y + " = " + res32Bit + ": ";\r
219 \r
220                         assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
221                         assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
222                         assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
223 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
224 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO\r
225                 }));\r
226         }\r
227 \r
228         @Order(4)\r
229         @Test\r
230         void testXOR()\r
231         {\r
232                 am2901.setSrc(DA);\r
233                 am2901.setFunc(EXOR);\r
234                 am2901.setDest(NOP);\r
235                 am2901.setReg_A(r0.toBitString());\r
236 \r
237                 assertAll(getAll4BitPairs().map(xy -> () ->\r
238                 {\r
239                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
240                         am2901.setD(to4bitBin(xy.y));\r
241 \r
242                         am2901.assertFullCycleSuccess();\r
243 \r
244                         int res32Bit = xy.x ^ xy.y;\r
245 \r
246                         String desc = xy.x + " ^ " + xy.y + " = " + res32Bit + ": ";\r
247 \r
248                         assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");\r
249                         assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");\r
250                         assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");\r
251 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO\r
252 //                      assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO\r
253                 }));\r
254         }\r
255 \r
256         @Order(4)\r
257         @Test\r
258         void testSUB()\r
259         {\r
260                 am2901.setSrc(DA);\r
261                 am2901.setCarryIn("1");\r
262                 am2901.setFunc(SUBR);\r
263                 am2901.setDest(NOP);\r
264                 am2901.setReg_A(r0.toBitString());\r
265 \r
266                 assertAll(getAll4BitPairs().map(xy -> () ->\r
267                 {\r
268                         am2901.setDirectly(r0, to4bitBin(xy.x));\r
269                         am2901.setD(to4bitBin(xy.y));\r
270 \r
271                         am2901.assertFullCycleSuccess();\r
272 \r
273                         int res32Bit = xy.x - xy.y;\r
274                         int res4Bit = res32Bit & 0b1111;\r
275                         int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y);\r
276                         int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);\r
277 \r
278                         String desc = xy.x + " - " + xy.y + " = " + res4Bit + ": ";\r
279 \r
280                         assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");\r
281                         assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");\r
282                         assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");\r
283                         assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), desc + "Cn+4");\r
284                         assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");\r
285                 }));\r
286         }\r
287 \r
288         static Stream<Point> getAll4BitPairs()\r
289         {\r
290                 return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y)));\r
291         }\r
292 }\r