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),
44 e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1),
45 i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), 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),
209 out = new CoreWire(t, 4, 1);
210 ReadWriteEnd selectIn = select.createReadWriteEnd();
212 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
213 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
214 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
216 new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
217 c.createReadOnlyEnd());
220 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
221 selectIn.feedSignals(Bit.ONE, Bit.ZERO);
224 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
226 selectIn.feedSignals(Bit.ONE, Bit.ONE);
229 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
236 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),
237 in = new CoreWire(t, 4, 1);
238 ReadWriteEnd selectIn = select.createReadWriteEnd();
240 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
241 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
243 new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
244 c.createReadWriteEnd());
247 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
248 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
249 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
250 selectIn.feedSignals(Bit.ONE, Bit.ZERO);
253 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
254 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
255 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
257 selectIn.feedSignals(Bit.ONE, Bit.ONE);
260 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
261 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
262 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
269 CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
270 new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
271 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
272 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
276 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
282 CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1);
283 new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
284 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
285 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
289 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
295 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);
296 new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
297 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
298 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
299 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
303 assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
309 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);
310 new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
311 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
312 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
313 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
317 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
323 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);
324 new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
325 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
326 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
327 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
331 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
337 CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2);
338 new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
339 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
343 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
347 void rsLatchCircuitTest()
349 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),
350 q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1);
352 new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
353 new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
354 new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
355 new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
357 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
359 sIn.feedSignals(Bit.ONE);
360 rIn.feedSignals(Bit.ZERO);
364 assertEquals(Bit.ONE, q.getValue());
365 assertEquals(Bit.ZERO, nq.getValue());
367 sIn.feedSignals(Bit.ZERO);
370 assertEquals(Bit.ONE, q.getValue());
371 assertEquals(Bit.ZERO, nq.getValue());
373 rIn.feedSignals(Bit.ONE);
377 assertEquals(Bit.ZERO, q.getValue());
378 assertEquals(Bit.ONE, nq.getValue());
382 void numericValueTest()
384 CoreWire a = new CoreWire(t, 4, 1);
385 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
389 assertEquals(11, a.getValues().getUnsignedValueLong());
390 assertEquals(-5, a.getValues().getSignedValueLong());
393 boolean flag = false;
396 void simpleTimelineTest()
398 Timeline t = new Timeline(3);
403 fail("Events executed out of order!");
409 fail("Events executed out of order!");
415 fail("Events executed out of order!");
420 fail("Only supposed to execute until timestamp 20, not 25");
423 t.executeUntil(t.laterThan(20), 100);
426 fail("Not all events were executed in order!");
429 // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes
430 @Disabled("Out of date")
432 void multipleInputs()
434 CoreWire w = new CoreWire(t, 2, 1);
435 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
436 wI1.feedSignals(Bit.ONE, Bit.Z);
437 wI2.feedSignals(Bit.Z, Bit.X);
439 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
441 wI2.feedSignals(Bit.ZERO, Bit.Z);
443 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
445 wI2.feedSignals(Bit.Z, Bit.Z);
447 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
449 wI2.feedSignals(Bit.ONE, Bit.Z);
450 ReadEnd rE = w.createReadOnlyEnd();
451 rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
454 wI1.feedSignals(Bit.X, Bit.X);
456 wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
458 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
461 private static void assertBitArrayEquals(BitVector actual, Bit... expected)
463 assertArrayEquals(expected, actual.getBits());