1 package net.mograsim.logic.core.tests;
3 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
4 import static org.junit.jupiter.api.Assertions.assertEquals;
5 import static org.junit.jupiter.api.Assertions.fail;
7 import org.junit.jupiter.api.BeforeEach;
8 import org.junit.jupiter.api.Disabled;
9 import org.junit.jupiter.api.Test;
11 import net.mograsim.logic.core.components.CoreDemux;
12 import net.mograsim.logic.core.components.CoreMux;
13 import net.mograsim.logic.core.components.CoreTriStateBuffer;
14 import net.mograsim.logic.core.components.CoreUnidirectionalMerger;
15 import net.mograsim.logic.core.components.CoreUnidirectionalSplitter;
16 import net.mograsim.logic.core.components.gates.CoreAndGate;
17 import net.mograsim.logic.core.components.gates.CoreNandGate;
18 import net.mograsim.logic.core.components.gates.CoreNorGate;
19 import net.mograsim.logic.core.components.gates.CoreNotGate;
20 import net.mograsim.logic.core.components.gates.CoreOrGate;
21 import net.mograsim.logic.core.components.gates.CoreXorGate;
22 import net.mograsim.logic.core.timeline.Timeline;
23 import net.mograsim.logic.core.types.Bit;
24 import net.mograsim.logic.core.types.BitVector;
25 import net.mograsim.logic.core.wires.CoreWire;
26 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
27 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
29 @SuppressWarnings("unused")
30 class CoreComponentTest
32 private Timeline t = new Timeline(11);
41 void circuitExampleTest()
43 CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1), e = new CoreWire(t, 1, 1),
44 f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1), i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1),
45 k = new CoreWire(t, 1, 1);
46 new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
47 new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
48 new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
49 new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
50 new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
52 a.createReadWriteEnd().feedSignals(Bit.ZERO);
53 b.createReadWriteEnd().feedSignals(Bit.ONE);
54 c.createReadWriteEnd().feedSignals(Bit.ZERO);
55 d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
56 e.createReadWriteEnd().feedSignals(Bit.ZERO);
60 assertEquals(Bit.ONE, j.getValue());
61 assertEquals(Bit.ZERO, k.getValue());
67 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1);
68 in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
69 new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
73 assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
74 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
75 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
81 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1);
82 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
83 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
84 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
86 new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
90 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
96 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1);
97 CoreWire.fuse(a, out, 0, 0, a.width);
98 CoreWire.fuse(b, out, 0, a.width, b.width);
99 CoreWire.fuse(c, out, 0, a.width + b.width, c.width);
100 ReadWriteEnd rA = a.createReadWriteEnd();
101 rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
102 ReadWriteEnd rB = b.createReadWriteEnd();
103 rB.feedSignals(Bit.ONE, Bit.ZERO);
104 ReadWriteEnd rC = c.createReadWriteEnd();
105 rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
108 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
109 out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
111 assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X);
112 assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X);
113 assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X);
118 assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
119 assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE);
120 assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
126 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
128 ReadWriteEnd rw = a.createReadWriteEnd();
130 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
132 rw.feedSignals(Bit.ONE, Bit.U, Bit.Z);
134 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);
140 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
141 a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X);
145 assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X);
151 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1);
152 a.createReadWriteEnd();
157 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
161 // void connectorTest()
164 // Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
165 // new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
166 //// b.createReadWriteEnd();
167 // a.createReadWriteEnd();
169 // assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
173 void triStateBufferTest()
175 CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1);
176 new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
177 new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
178 new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
180 ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
181 enI.feedSignals(Bit.ONE);
182 aI.feedSignals(Bit.ONE);
183 bI.feedSignals(Bit.Z);
187 assertEquals(Bit.ONE, b.getValue());
189 bI.feedSignals(Bit.ZERO);
193 assertEquals(Bit.X, b.getValue());
194 assertEquals(Bit.ONE, a.getValue());
197 enI.feedSignals(Bit.ZERO);
201 assertEquals(Bit.ZERO, a.getValue());
208 CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), out = new CoreWire(t, 4, 1);
209 ReadWriteEnd selectIn = select.createReadWriteEnd();
211 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
212 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
213 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
215 new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
216 c.createReadOnlyEnd());
219 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
220 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
223 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
225 selectIn.feedSignals(Bit.ONE, Bit.ONE);
228 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
235 CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), in = new CoreWire(t, 4, 1);
236 ReadWriteEnd selectIn = select.createReadWriteEnd();
238 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
239 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
241 new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
242 c.createReadWriteEnd());
245 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
246 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
247 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
248 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
251 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
252 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
253 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
255 selectIn.feedSignals(Bit.ONE, Bit.ONE);
258 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
259 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
260 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
267 CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
268 new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
269 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
270 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
274 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
280 CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
281 new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
282 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
283 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
287 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
293 CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1);
294 new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
295 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
296 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
297 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
301 assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
307 CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1);
308 new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
309 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
310 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
311 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
315 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
321 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1);
322 new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
323 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
324 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
325 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
329 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
335 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2);
336 new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
337 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
341 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
345 void rsLatchCircuitTest()
347 CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1), q = new CoreWire(t, 1, 1),
348 nq = new CoreWire(t, 1, 1);
350 new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
351 new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
352 new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
353 new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
355 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
357 sIn.feedSignals(Bit.ONE);
358 rIn.feedSignals(Bit.ZERO);
362 assertEquals(Bit.ONE, q.getValue());
363 assertEquals(Bit.ZERO, nq.getValue());
365 sIn.feedSignals(Bit.ZERO);
368 assertEquals(Bit.ONE, q.getValue());
369 assertEquals(Bit.ZERO, nq.getValue());
371 rIn.feedSignals(Bit.ONE);
375 assertEquals(Bit.ZERO, q.getValue());
376 assertEquals(Bit.ONE, nq.getValue());
380 void numericValueTest()
382 CoreWire a = new CoreWire(t, 4, 1);
383 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
387 assertEquals(15, a.getUnsignedValue());
388 assertEquals(-1, a.getSignedValue());
391 boolean flag = false;
394 void simpleTimelineTest()
396 Timeline t = new Timeline(3);
401 fail("Events executed out of order!");
407 fail("Events executed out of order!");
413 fail("Events executed out of order!");
418 fail("Only supposed to execute until timestamp 20, not 25");
421 t.executeUntil(t.laterThan(20), 100);
424 fail("Not all events were executed in order!");
427 // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes
428 @Disabled("Out of date")
430 void multipleInputs()
432 CoreWire w = new CoreWire(t, 2, 1);
433 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
434 wI1.feedSignals(Bit.ONE, Bit.Z);
435 wI2.feedSignals(Bit.Z, Bit.X);
437 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
439 wI2.feedSignals(Bit.ZERO, Bit.Z);
441 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
443 wI2.feedSignals(Bit.Z, Bit.Z);
445 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
447 wI2.feedSignals(Bit.ONE, Bit.Z);
448 ReadEnd rE = w.createReadOnlyEnd();
449 rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
452 wI1.feedSignals(Bit.X, Bit.X);
454 wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
456 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
459 private static void assertBitArrayEquals(BitVector actual, Bit... expected)
461 assertArrayEquals(expected, actual.getBits());