1 package net.mograsim.logic.ui.am2900;
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.*;
10 import java.awt.Point;
11 import java.util.stream.IntStream;
12 import java.util.stream.Stream;
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;
23 @TestMethodOrder(OrderAnnotation.class)
24 public class Am2901Test
26 private TestableAm2901 am2901;
37 am2901 = new TestableAm2901Impl();
41 void setRegistersToZero()
44 for (Register r : Register.values())
50 void setRegisterToZero(Register r)
52 System.out.println("Setting reg " + r + " to zero");
59 am2901.assertFullCycleSuccess();
62 void setRegOutput(Register r)
69 am2901.setReg_B(r.toBitString());
74 void setInputsToZero()
76 am2901.setCarryIn("0");
81 am2901.setReg_A("0000");
82 am2901.setReg_B("0000");
87 // am2901.setNotOutEnable("0"); TODO
89 am2901.assertRunSuccess();
94 @ArgumentsSource(TestableAm2901.RegisterProvider.class)
95 void testDirectAccess(Register r)
97 assertEquals("UUUU", am2901.getDirectly(r));
99 am2901.setDirectly(r, "1011");
101 assertEquals("1011", am2901.getDirectly(r));
106 @ArgumentsSource(TestableAm2901.RegisterProvider.class)
107 void testSetToZero(Register r)
109 assertEquals("UUUU", am2901.getDirectly(r));
111 setRegisterToZero(r);
113 assertEquals("0000", am2901.getDirectly(r));
114 assertEquals("0000", am2901.getY());
115 assertEquals("0", am2901.getCarryOut());
116 assertEquals("0", am2901.getOverflow());
117 assertEquals("0", am2901.getSign());
118 assertEquals("1", am2901.getZero());
123 void testSetAllToZero()
125 setRegistersToZero();
127 assertEquals("0000", am2901.getY());
128 assertEquals("0", am2901.getCarryOut());
129 assertEquals("0", am2901.getOverflow());
130 assertEquals("0", am2901.getSign());
131 assertEquals("1", am2901.getZero());
132 assertEquals("0", am2901.getQ_0());
133 assertEquals("0", am2901.getQ_3());
134 assertEquals("0", am2901.getRAM_0());
135 assertEquals("0", am2901.getRAM_3());
137 assertAll("register values", Register.stream().map(r -> () ->
139 assertEquals("0000", am2901.getDirectly(r), r.name());
150 am2901.setReg_A(r0.toBitString());
152 assertAll(getAll4BitPairs().map(xy -> () ->
154 am2901.setDirectly(r0, to4bitBin(xy.x));
155 am2901.setD(to4bitBin(xy.y));
157 am2901.assertFullCycleSuccess();
159 int res32Bit = xy.x + xy.y;
160 int res4Bit = res32Bit & 0b1111;
161 int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y);
162 int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);
164 String desc = xy.x + " + " + xy.y + " = " + res4Bit + ": ";
166 assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");
167 assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");
168 assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");
169 assertEquals(to1bitBin(res32Bit & 0b1_0000), am2901.getCarryOut(), desc + "Cn+4");
170 assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");
181 am2901.setReg_A(r0.toBitString());
183 assertAll(getAll4BitPairs().map(xy -> () ->
185 am2901.setDirectly(r0, to4bitBin(xy.x));
186 am2901.setD(to4bitBin(xy.y));
188 am2901.assertFullCycleSuccess();
190 int res32Bit = xy.x & xy.y;
192 String desc = xy.x + " & " + xy.y + " = " + res32Bit + ": ";
194 assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");
195 assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");
196 assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");
197 // assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), desc + "Cn+4"); // TODO
198 // assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), desc + "OVR"); // TODO
209 am2901.setReg_A(r0.toBitString());
211 assertAll(getAll4BitPairs().map(xy -> () ->
213 am2901.setDirectly(r0, to4bitBin(xy.x));
214 am2901.setD(to4bitBin(xy.y));
216 am2901.assertFullCycleSuccess();
218 int res32Bit = xy.x | xy.y;
220 String desc = xy.x + " | " + xy.y + " = " + res32Bit + ": ";
222 assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");
223 assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");
224 assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");
225 // assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO
226 // assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO
235 am2901.setFunc(EXOR);
237 am2901.setReg_A(r0.toBitString());
239 assertAll(getAll4BitPairs().map(xy -> () ->
241 am2901.setDirectly(r0, to4bitBin(xy.x));
242 am2901.setD(to4bitBin(xy.y));
244 am2901.assertFullCycleSuccess();
246 int res32Bit = xy.x ^ xy.y;
248 String desc = xy.x + " ^ " + xy.y + " = " + res32Bit + ": ";
250 assertEquals(to4bitBin(res32Bit), am2901.getY(), desc + "Y");
251 assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), desc + "F=0");
252 assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), desc + "F3");
253 // assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), desc + "Cn+4"); // TODO
254 // assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), desc + "OVR"); // TODO
263 am2901.setCarryIn("1");
264 am2901.setFunc(SUBR);
266 am2901.setReg_A(r0.toBitString());
268 assertAll(getAll4BitPairs().map(xy -> () ->
270 am2901.setDirectly(r0, to4bitBin(xy.x));
271 am2901.setD(to4bitBin(xy.y));
273 am2901.assertFullCycleSuccess();
275 int res32Bit = xy.x - xy.y;
276 int res4Bit = res32Bit & 0b1111;
277 int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y);
278 int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);
280 String desc = xy.x + " - " + xy.y + " = " + res4Bit + ": ";
282 assertEquals(to4bitBin(res4Bit & 0b1111), am2901.getY(), desc + "Y");
283 assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), desc + "F=0");
284 assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), desc + "F3");
285 assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), desc + "Cn+4");
286 assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), desc + "OVR");
290 static Stream<Point> getAll4BitPairs()
292 return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y)));