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 java.math.BigInteger;
8 import java.util.Random;
9 import java.util.function.LongConsumer;
11 import org.junit.Ignore;
12 import org.junit.jupiter.api.BeforeAll;
13 import org.junit.jupiter.api.BeforeEach;
14 import org.junit.jupiter.api.Disabled;
15 import org.junit.jupiter.api.Test;
16 import org.junit.jupiter.api.TestInstance;
17 import org.junit.jupiter.api.TestInstance.Lifecycle;
19 import net.mograsim.logic.core.components.Connector;
20 import net.mograsim.logic.core.components.Demux;
21 import net.mograsim.logic.core.components.Merger;
22 import net.mograsim.logic.core.components.Mux;
23 import net.mograsim.logic.core.components.Splitter;
24 import net.mograsim.logic.core.components.TriStateBuffer;
25 import net.mograsim.logic.core.components.gates.AndGate;
26 import net.mograsim.logic.core.components.gates.NandGate;
27 import net.mograsim.logic.core.components.gates.NorGate;
28 import net.mograsim.logic.core.components.gates.NotGate;
29 import net.mograsim.logic.core.components.gates.OrGate;
30 import net.mograsim.logic.core.components.gates.XorGate;
31 import net.mograsim.logic.core.timeline.Timeline;
32 import net.mograsim.logic.core.types.Bit;
33 import net.mograsim.logic.core.types.BitVector;
34 import net.mograsim.logic.core.wires.Wire;
35 import net.mograsim.logic.core.wires.Wire.ReadEnd;
36 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
38 @SuppressWarnings("unused")
41 private Timeline t = new Timeline(11);
50 void circuitExampleTest()
52 Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
53 f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
54 k = new Wire(t, 1, 1);
55 new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
56 new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
57 new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
58 new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
59 new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
61 a.createReadWriteEnd().feedSignals(Bit.ZERO);
62 b.createReadWriteEnd().feedSignals(Bit.ONE);
63 c.createReadWriteEnd().feedSignals(Bit.ZERO);
64 d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
65 e.createReadWriteEnd().feedSignals(Bit.ZERO);
69 assertEquals(Bit.ONE, j.getValue());
70 assertEquals(Bit.ZERO, k.getValue());
76 Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
77 in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
78 new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
82 assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
83 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
84 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
90 Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(t, 8, 1);
91 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
92 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
93 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
95 new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
99 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
105 Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(t, 8, 1);
106 Wire.fuse(a, out, 0, 0, a.width);
107 Wire.fuse(b, out, 0, a.width, b.width);
108 Wire.fuse(c, out, 0, a.width + b.width, c.width);
109 ReadWriteEnd rA = a.createReadWriteEnd();
110 rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
111 ReadWriteEnd rB = b.createReadWriteEnd();
112 rB.feedSignals(Bit.ONE, Bit.ZERO);
113 ReadWriteEnd rC = c.createReadWriteEnd();
114 rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
117 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
118 out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
120 assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X);
121 assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X);
122 assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X);
127 assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
128 assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE);
129 assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
135 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
137 ReadWriteEnd rw = a.createReadWriteEnd();
139 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
141 rw.feedSignals(Bit.ONE, Bit.U, Bit.Z);
143 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);
149 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
150 a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X);
154 assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X);
160 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
161 a.createReadWriteEnd();
166 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
170 // void connectorTest()
173 // Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
174 // new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
175 //// b.createReadWriteEnd();
176 // a.createReadWriteEnd();
178 // assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
182 void triStateBufferTest()
184 Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
185 new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
186 new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
187 new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
189 ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
190 enI.feedSignals(Bit.ONE);
191 aI.feedSignals(Bit.ONE);
192 bI.feedSignals(Bit.Z);
196 assertEquals(Bit.ONE, b.getValue());
198 bI.feedSignals(Bit.ZERO);
202 assertEquals(Bit.X, b.getValue());
203 assertEquals(Bit.ONE, a.getValue());
206 enI.feedSignals(Bit.ZERO);
210 assertEquals(Bit.ZERO, a.getValue());
217 Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(t, 4, 1);
218 ReadWriteEnd selectIn = select.createReadWriteEnd();
220 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
221 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
222 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
224 new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
225 c.createReadOnlyEnd());
228 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
229 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
232 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
234 selectIn.feedSignals(Bit.ONE, Bit.ONE);
237 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
244 Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(t, 4, 1);
245 ReadWriteEnd selectIn = select.createReadWriteEnd();
247 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
248 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
250 new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
251 c.createReadWriteEnd());
254 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
255 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
256 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
257 selectIn.feedSignals(Bit.ZERO, 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.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
264 selectIn.feedSignals(Bit.ONE, Bit.ONE);
267 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
268 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
269 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
276 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
277 new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
278 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
279 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
283 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
289 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
290 new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
291 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
292 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
296 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
302 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1), d = new Wire(t, 4, 1);
303 new NandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
304 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
305 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
306 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
310 assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
316 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1), d = new Wire(t, 4, 1);
317 new NorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
318 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
319 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
320 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
324 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
330 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
331 new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
332 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
333 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
334 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
338 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
344 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
345 new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
346 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
350 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
354 void rsLatchCircuitTest()
356 Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
357 nq = new Wire(t, 1, 1);
359 new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
360 new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
361 new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
362 new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
364 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
366 sIn.feedSignals(Bit.ONE);
367 rIn.feedSignals(Bit.ZERO);
371 assertEquals(Bit.ONE, q.getValue());
372 assertEquals(Bit.ZERO, nq.getValue());
374 sIn.feedSignals(Bit.ZERO);
377 assertEquals(Bit.ONE, q.getValue());
378 assertEquals(Bit.ZERO, nq.getValue());
380 rIn.feedSignals(Bit.ONE);
384 assertEquals(Bit.ZERO, q.getValue());
385 assertEquals(Bit.ONE, nq.getValue());
389 void numericValueTest()
391 Wire a = new Wire(t, 4, 1);
392 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
396 assertEquals(15, a.getUnsignedValue());
397 assertEquals(-1, a.getSignedValue());
400 boolean flag = false;
403 void simpleTimelineTest()
405 Timeline t = new Timeline(3);
410 fail("Events executed out of order!");
416 fail("Events executed out of order!");
422 fail("Events executed out of order!");
427 fail("Only supposed to execute until timestamp 20, not 25");
430 t.executeUntil(t.laterThan(20), 100);
433 fail("Not all events were executed in order!");
436 // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes
437 @Disabled("Out of date")
439 void multipleInputs()
441 Wire w = new Wire(t, 2, 1);
442 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
443 wI1.feedSignals(Bit.ONE, Bit.Z);
444 wI2.feedSignals(Bit.Z, Bit.X);
446 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
448 wI2.feedSignals(Bit.ZERO, Bit.Z);
450 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
452 wI2.feedSignals(Bit.Z, Bit.Z);
454 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
456 wI2.feedSignals(Bit.ONE, Bit.Z);
457 ReadEnd rE = w.createReadOnlyEnd();
458 rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
461 wI1.feedSignals(Bit.X, Bit.X);
463 wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
465 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
468 @Disabled("Braucht den Connector noch irgendjemand?")
470 void wireConnections()
472 // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
474 Wire a = new Wire(t, 1, 2);
475 Wire b = new Wire(t, 1, 2);
476 Wire c = new Wire(t, 1, 2);
477 ReadWriteEnd aI = a.createReadWriteEnd();
478 ReadWriteEnd bI = b.createReadWriteEnd();
479 ReadWriteEnd cI = c.createReadWriteEnd();
481 TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
482 TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
483 LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);
485 cI.feedSignals(Bit.ONE);
486 test.assertAfterSimulationIs(print, Bit.ONE);
488 cI.feedSignals(Bit.X);
489 test.assertAfterSimulationIs(print, Bit.X);
491 cI.feedSignals(Bit.X);
492 cI.feedSignals(Bit.Z);
493 test.assertAfterSimulationIs(print, Bit.Z);
495 new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
496 test.assertAfterSimulationIs(print, Bit.Z);
497 System.err.println("ONE");
498 bI.feedSignals(Bit.ONE);
499 test.assertAfterSimulationIs(print, Bit.ONE);
500 System.err.println("ZERO");
501 bI.feedSignals(Bit.ZERO);
502 test.assertAfterSimulationIs(print, Bit.ZERO);
503 System.err.println("Z");
504 bI.feedSignals(Bit.Z);
505 test.assertAfterSimulationIs(print, Bit.Z);
507 new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
508 System.err.println("Z 2");
509 aI.feedSignals(Bit.Z);
510 test.assertAfterSimulationIs(print, Bit.Z);
511 test2.assertAfterSimulationIs(Bit.Z);
512 System.err.println("ONE 2");
513 aI.feedSignals(Bit.ONE);
514 test.assertAfterSimulationIs(print, Bit.ONE);
515 test2.assertAfterSimulationIs(Bit.ONE);
516 System.err.println("ZERO 2");
517 aI.feedSignals(Bit.ZERO);
518 test.assertAfterSimulationIs(print, Bit.ZERO);
519 test2.assertAfterSimulationIs(Bit.ZERO);
520 System.err.println("Z 2 II");
521 aI.feedSignals(Bit.Z);
522 test.assertAfterSimulationIs(print, Bit.Z);
523 test2.assertAfterSimulationIs(Bit.Z);
525 System.err.println("No Conflict yet");
526 bI.feedSignals(Bit.ONE);
527 test.assertAfterSimulationIs(print, Bit.ONE);
528 test2.assertAfterSimulationIs(Bit.ONE);
529 aI.feedSignals(Bit.ONE);
530 test.assertAfterSimulationIs(print, Bit.ONE);
531 test2.assertAfterSimulationIs(Bit.ONE);
532 System.err.println("Conflict");
533 aI.feedSignals(Bit.ZERO);
534 test.assertAfterSimulationIs(print, Bit.X);
535 test2.assertAfterSimulationIs(Bit.X);
536 aI.feedSignals(Bit.ONE);
537 test.assertAfterSimulationIs(print, Bit.ONE);
538 test2.assertAfterSimulationIs(Bit.ONE);
541 private static void assertBitArrayEquals(BitVector actual, Bit... expected)
543 assertArrayEquals(expected, actual.getBits());