1 package net.mograsim.logic.model.am2900;
3 import static net.mograsim.logic.model.am2900.TestUtil.*;
4 import static net.mograsim.logic.model.am2900.TestableAm2901.Am2901_Dest.*;
5 import static net.mograsim.logic.model.am2900.TestableAm2901.Am2901_Func.*;
6 import static net.mograsim.logic.model.am2900.TestableAm2901.Am2901_Src.*;
7 import static net.mograsim.logic.model.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.DisplayName;
16 import org.junit.jupiter.api.Order;
17 import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
18 import org.junit.jupiter.api.Test;
19 import org.junit.jupiter.api.TestMethodOrder;
20 import org.junit.jupiter.params.ParameterizedTest;
21 import org.junit.jupiter.params.provider.EnumSource;
23 import net.mograsim.logic.model.am2900.TestableAm2901.Register;
25 @DisplayName("Am2901 Tests")
26 @TestMethodOrder(OrderAnnotation.class)
27 public class Am2901Test
29 private TestableAm2901 am2901;
40 am2901 = new TestableAm2901Impl();
44 void setRegistersToZero()
47 for (Register r : Register.values())
53 void setRegisterToZero(Register r)
60 am2901.assertFullCycleSuccess();
63 void setRegOutput(Register r)
70 am2901.setReg_B(r.toBitString());
75 void setInputsToZero()
77 am2901.setCarryIn("0");
82 am2901.setReg_A("0000");
83 am2901.setReg_B("0000");
88 // am2901.setNotOutEnable("0"); TODO
90 am2901.assertRunSuccess();
93 @ParameterizedTest(name = "{0}")
95 @DisplayName("Direct / high level access")
96 @EnumSource(Register.class)
97 void testDirectAccess(Register r)
99 assertEquals("UUUU", am2901.getDirectly(r));
101 am2901.setDirectly(r, "1011");
103 assertEquals("1011", am2901.getDirectly(r));
106 @ParameterizedTest(name = "{0}")
108 @DisplayName("Setting each register to 0")
109 @EnumSource(Register.class)
110 void testSetToZero(Register r)
112 assertEquals("UUUU", am2901.getDirectly(r));
114 setRegisterToZero(r);
116 assertEquals("0000", am2901.getDirectly(r));
117 assertEquals("0000", am2901.getY());
118 assertEquals("0", am2901.getCarryOut());
119 assertEquals("0", am2901.getOverflow());
120 assertEquals("0", am2901.getSign());
121 assertEquals("1", am2901.getZero());
126 @DisplayName("Setting all registers to 0")
127 void testSetAllToZero()
129 setRegistersToZero();
131 assertEquals("0000", am2901.getY());
132 assertEquals("0", am2901.getCarryOut());
133 assertEquals("0", am2901.getOverflow());
134 assertEquals("0", am2901.getSign());
135 assertEquals("1", am2901.getZero());
136 assertEquals("0", am2901.getQ_0());
137 assertEquals("0", am2901.getQ_3());
138 assertEquals("0", am2901.getRAM_0());
139 assertEquals("0", am2901.getRAM_3());
141 assertAll("register values", Register.stream().map(r -> () ->
143 assertEquals("0000", am2901.getDirectly(r), r.name());
149 @DisplayName("ADD operation")
155 am2901.setReg_A(r0.toBitString());
157 assertAll(getAll4BitPairs().map(xy -> () ->
159 am2901.setDirectly(r0, to4bitBin(xy.x));
160 am2901.setD(to4bitBin(xy.y));
162 am2901.assertFullCycleSuccess();
164 int res32Bit = xy.x + xy.y;
165 int res4Bit = res32Bit & 0b1111;
166 int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y);
167 int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);
169 assertAll("Result of " + xy.x + " + " + xy.y + " = " + res32Bit,
170 () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"),
171 () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"),
172 () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"),
173 () -> assertEquals(to1bitBin(res32Bit > 15), am2901.getCarryOut(), " Cn+4"),
174 () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR"));
180 @DisplayName("AND operation")
186 am2901.setReg_A(r0.toBitString());
188 assertAll(getAll4BitPairs().map(xy -> () ->
190 am2901.setDirectly(r0, to4bitBin(xy.x));
191 am2901.setD(to4bitBin(xy.y));
193 am2901.assertFullCycleSuccess();
195 int res32Bit = xy.x & xy.y;
197 assertAll("Result of " + xy.x + " & " + xy.y + " = " + res32Bit,
198 () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"),
199 () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"),
200 () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3")
201 // () -> assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), " Cn+4"), // TODO
202 // () -> assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), " OVR") // TODO
209 @DisplayName("OR operation")
215 am2901.setReg_A(r0.toBitString());
217 assertAll(getAll4BitPairs().map(xy -> () ->
219 am2901.setDirectly(r0, to4bitBin(xy.x));
220 am2901.setD(to4bitBin(xy.y));
222 am2901.assertFullCycleSuccess();
224 int res32Bit = xy.x | xy.y;
226 assertAll("Result of " + xy.x + " | " + xy.y + " = " + res32Bit,
227 () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"),
228 () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"),
229 () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3")
230 // () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), " Cn+4"), // TODO
231 // () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), " OVR") // TODO
238 @DisplayName("XOR operation")
242 am2901.setFunc(EXOR);
244 am2901.setReg_A(r0.toBitString());
246 assertAll(getAll4BitPairs().map(xy -> () ->
248 am2901.setDirectly(r0, to4bitBin(xy.x));
249 am2901.setD(to4bitBin(xy.y));
251 am2901.assertFullCycleSuccess();
253 int res32Bit = xy.x ^ xy.y;
255 assertAll("Result of " + xy.x + " ^ " + xy.y + " = " + res32Bit,
256 () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"),
257 () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"),
258 () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3"));
264 @DisplayName("SUB operation")
268 am2901.setCarryIn("1");
269 am2901.setFunc(SUBR);
271 am2901.setReg_A(r0.toBitString());
273 assertAll(getAll4BitPairs().map(xy -> () ->
275 am2901.setDirectly(r0, to4bitBin(xy.x));
276 am2901.setD(to4bitBin(xy.y));
278 am2901.assertFullCycleSuccess();
280 int res32Bit = xy.x - xy.y;
281 int res4Bit = res32Bit & 0b1111;
282 int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y);
283 int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn);
285 assertAll("Result of " + xy.x + " - " + xy.y + " = " + res32Bit,
286 () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"),
287 () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"),
288 () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"),
289 () -> assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), " Cn+4"),
290 () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR"));
294 static Stream<Point> getAll4BitPairs()
296 return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y)));