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