1 package net.mograsim.logic.ui.am2900;
\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
10 import java.awt.Point;
\r
11 import java.util.stream.IntStream;
\r
12 import java.util.stream.Stream;
\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
23 @TestMethodOrder(OrderAnnotation.class)
\r
24 public class Am2901Test
\r
26 private TestableAm2901 am2901;
\r
35 void createAndSetup()
\r
37 am2901 = new TestableAm2901Impl();
\r
41 void setRegistersToZero()
\r
44 for (Register r : Register.values())
\r
46 setRegisterToZero(r);
\r
50 void setRegisterToZero(Register r)
\r
52 am2901.setD("0000");
\r
54 am2901.setFunc(AND);
\r
57 am2901.assertFullCycleSuccess();
\r
60 void setRegOutput(Register r)
\r
64 am2901.setDest(QREG);
\r
67 am2901.setReg_B(r.toBitString());
\r
68 am2901.setDest(RAMF);
\r
72 void setInputsToZero()
\r
74 am2901.setCarryIn("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
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
92 @ArgumentsSource(TestableAm2901.RegisterProvider.class)
\r
93 void testDirectAccess(Register r)
\r
95 assertEquals("UUUU", am2901.getDirectly(r));
\r
97 am2901.setDirectly(r, "1011");
\r
99 assertEquals("1011", am2901.getDirectly(r));
\r
104 @ArgumentsSource(TestableAm2901.RegisterProvider.class)
\r
105 void testSetToZero(Register r)
\r
107 assertEquals("UUUU", am2901.getDirectly(r));
\r
109 setRegisterToZero(r);
\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
121 void testSetAllToZero()
\r
123 setRegistersToZero();
\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
135 assertAll("register values", Register.stream().map(r -> () ->
\r
137 assertEquals("0000", am2901.getDirectly(r), r.name());
\r
146 am2901.setFunc(ADD);
\r
147 am2901.setDest(NOP);
\r
148 am2901.setReg_A(r0.toBitString());
\r
150 assertAll(getAll4BitPairs().map(xy -> () ->
\r
152 am2901.setDirectly(r0, to4bitBin(xy.x));
\r
153 am2901.setD(to4bitBin(xy.y));
\r
155 am2901.assertFullCycleSuccess();
\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
162 String desc = xy.x + " + " + xy.y + " = " + res4Bit + ": ";
\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
177 am2901.setFunc(AND);
\r
178 am2901.setDest(NOP);
\r
179 am2901.setReg_A(r0.toBitString());
\r
181 assertAll(getAll4BitPairs().map(xy -> () ->
\r
183 am2901.setDirectly(r0, to4bitBin(xy.x));
\r
184 am2901.setD(to4bitBin(xy.y));
\r
186 am2901.assertFullCycleSuccess();
\r
188 int res32Bit = xy.x & xy.y;
\r
190 String desc = xy.x + " & " + xy.y + " = " + res32Bit + ": ";
\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
205 am2901.setFunc(OR);
\r
206 am2901.setDest(NOP);
\r
207 am2901.setReg_A(r0.toBitString());
\r
209 assertAll(getAll4BitPairs().map(xy -> () ->
\r
211 am2901.setDirectly(r0, to4bitBin(xy.x));
\r
212 am2901.setD(to4bitBin(xy.y));
\r
214 am2901.assertFullCycleSuccess();
\r
216 int res32Bit = xy.x | xy.y;
\r
218 String desc = xy.x + " | " + xy.y + " = " + res32Bit + ": ";
\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
233 am2901.setFunc(EXOR);
\r
234 am2901.setDest(NOP);
\r
235 am2901.setReg_A(r0.toBitString());
\r
237 assertAll(getAll4BitPairs().map(xy -> () ->
\r
239 am2901.setDirectly(r0, to4bitBin(xy.x));
\r
240 am2901.setD(to4bitBin(xy.y));
\r
242 am2901.assertFullCycleSuccess();
\r
244 int res32Bit = xy.x ^ xy.y;
\r
246 String desc = xy.x + " ^ " + xy.y + " = " + res32Bit + ": ";
\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
261 am2901.setCarryIn("1");
\r
262 am2901.setFunc(SUBR);
\r
263 am2901.setDest(NOP);
\r
264 am2901.setReg_A(r0.toBitString());
\r
266 assertAll(getAll4BitPairs().map(xy -> () ->
\r
268 am2901.setDirectly(r0, to4bitBin(xy.x));
\r
269 am2901.setD(to4bitBin(xy.y));
\r
271 am2901.assertFullCycleSuccess();
\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
278 String desc = xy.x + " - " + xy.y + " = " + res4Bit + ": ";
\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
288 static Stream<Point> getAll4BitPairs()
\r
290 return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y)));
\r