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.util.function.LongConsumer;
9 import org.junit.jupiter.api.Test;
11 import net.mograsim.logic.core.components.Connector;
12 import net.mograsim.logic.core.components.Demux;
13 import net.mograsim.logic.core.components.Merger;
14 import net.mograsim.logic.core.components.Mux;
15 import net.mograsim.logic.core.components.Splitter;
16 import net.mograsim.logic.core.components.TriStateBuffer;
17 import net.mograsim.logic.core.components.gates.AndGate;
18 import net.mograsim.logic.core.components.gates.NandGate;
19 import net.mograsim.logic.core.components.gates.NorGate;
20 import net.mograsim.logic.core.components.gates.NotGate;
21 import net.mograsim.logic.core.components.gates.OrGate;
22 import net.mograsim.logic.core.components.gates.XorGate;
23 import net.mograsim.logic.core.timeline.Timeline;
24 import net.mograsim.logic.core.types.Bit;
25 import net.mograsim.logic.core.types.BitVector;
26 import net.mograsim.logic.core.wires.Wire;
27 import net.mograsim.logic.core.wires.Wire.ReadEnd;
28 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
30 @SuppressWarnings("unused")
33 private Timeline t = new Timeline(11);
36 void circuitExampleTest()
38 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),
39 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),
40 k = new Wire(t, 1, 1);
41 new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
42 new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
43 new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
44 new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
45 new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
47 a.createReadWriteEnd().feedSignals(Bit.ZERO);
48 b.createReadWriteEnd().feedSignals(Bit.ONE);
49 c.createReadWriteEnd().feedSignals(Bit.ZERO);
50 d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
51 e.createReadWriteEnd().feedSignals(Bit.ZERO);
55 assertEquals(Bit.ONE, j.getValue());
56 assertEquals(Bit.ZERO, k.getValue());
63 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);
64 in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
65 new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
69 assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
70 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
71 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
78 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);
79 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
80 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
81 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
83 new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
87 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
91 void triStateBufferTest()
93 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);
94 new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
95 new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
96 new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
98 ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
99 enI.feedSignals(Bit.ONE);
100 aI.feedSignals(Bit.ONE);
101 bI.feedSignals(Bit.Z);
105 assertEquals(Bit.ONE, b.getValue());
107 bI.feedSignals(Bit.ZERO);
111 assertEquals(Bit.X, b.getValue());
112 assertEquals(Bit.ONE, a.getValue());
115 enI.feedSignals(Bit.ZERO);
119 assertEquals(Bit.ZERO, a.getValue());
127 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);
128 ReadWriteEnd selectIn = select.createReadWriteEnd();
130 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
131 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
132 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
134 new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
135 c.createReadOnlyEnd());
138 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
139 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
142 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
144 selectIn.feedSignals(Bit.ONE, Bit.ONE);
147 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
155 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);
156 ReadWriteEnd selectIn = select.createReadWriteEnd();
158 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
159 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
161 new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
162 c.createReadWriteEnd());
165 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
166 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
167 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
168 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
171 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
172 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
173 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
175 selectIn.feedSignals(Bit.ONE, Bit.ONE);
178 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
179 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
180 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
188 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
189 new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
190 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
191 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
195 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
202 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
203 new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
204 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
205 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
209 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
216 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);
217 new NandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
218 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
219 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
220 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
224 assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
231 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);
232 new NorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
233 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
234 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
235 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
239 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
246 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);
247 new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
248 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
249 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
250 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
254 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
261 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
262 new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
263 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
267 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
271 void rsLatchCircuitTest()
274 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),
275 nq = new Wire(t, 1, 1);
277 new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
278 new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
279 new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
280 new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
282 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
284 sIn.feedSignals(Bit.ONE);
285 rIn.feedSignals(Bit.ZERO);
289 assertEquals(Bit.ONE, q.getValue());
290 assertEquals(Bit.ZERO, nq.getValue());
292 sIn.feedSignals(Bit.ZERO);
295 assertEquals(Bit.ONE, q.getValue());
296 assertEquals(Bit.ZERO, nq.getValue());
298 rIn.feedSignals(Bit.ONE);
302 assertEquals(Bit.ZERO, q.getValue());
303 assertEquals(Bit.ONE, nq.getValue());
307 void numericValueTest()
311 Wire a = new Wire(t, 4, 1);
312 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
316 assertEquals(15, a.getUnsignedValue());
317 assertEquals(-1, a.getSignedValue());
320 boolean flag = false;
323 void simpleTimelineTest()
325 Timeline t = new Timeline(3);
330 fail("Events executed out of order!");
336 fail("Events executed out of order!");
342 fail("Events executed out of order!");
347 fail("Only supposed to execute until timestamp 20, not 25");
350 t.executeUntil(t.laterThan(20), 100);
353 fail("Not all events were executed in order!");
357 void multipleInputs()
360 Wire w = new Wire(t, 2, 1);
361 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
362 wI1.feedSignals(Bit.ONE, Bit.Z);
363 wI2.feedSignals(Bit.Z, Bit.X);
365 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
367 wI2.feedSignals(Bit.ZERO, Bit.Z);
369 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
371 wI2.feedSignals(Bit.Z, Bit.Z);
373 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
375 wI2.feedSignals(Bit.ONE, Bit.Z);
376 ReadEnd rE = w.createReadOnlyEnd();
377 rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
380 wI1.feedSignals(Bit.X, Bit.X);
382 wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
384 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
388 void wireConnections()
390 // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
394 Wire a = new Wire(t, 1, 2);
395 Wire b = new Wire(t, 1, 2);
396 Wire c = new Wire(t, 1, 2);
397 ReadWriteEnd aI = a.createReadWriteEnd();
398 ReadWriteEnd bI = b.createReadWriteEnd();
399 ReadWriteEnd cI = c.createReadWriteEnd();
401 TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
402 TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
403 LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);
405 cI.feedSignals(Bit.ONE);
406 test.assertAfterSimulationIs(print, Bit.ONE);
408 cI.feedSignals(Bit.X);
409 test.assertAfterSimulationIs(print, Bit.X);
411 cI.feedSignals(Bit.X);
412 cI.feedSignals(Bit.Z);
413 test.assertAfterSimulationIs(print, Bit.Z);
415 new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
416 test.assertAfterSimulationIs(print, Bit.Z);
417 System.err.println("ONE");
418 bI.feedSignals(Bit.ONE);
419 test.assertAfterSimulationIs(print, Bit.ONE);
420 System.err.println("ZERO");
421 bI.feedSignals(Bit.ZERO);
422 test.assertAfterSimulationIs(print, Bit.ZERO);
423 System.err.println("Z");
424 bI.feedSignals(Bit.Z);
425 test.assertAfterSimulationIs(print, Bit.Z);
427 new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
428 System.err.println("Z 2");
429 aI.feedSignals(Bit.Z);
430 test.assertAfterSimulationIs(print, Bit.Z);
431 test2.assertAfterSimulationIs(Bit.Z);
432 System.err.println("ONE 2");
433 aI.feedSignals(Bit.ONE);
434 test.assertAfterSimulationIs(print, Bit.ONE);
435 test2.assertAfterSimulationIs(Bit.ONE);
436 System.err.println("ZERO 2");
437 aI.feedSignals(Bit.ZERO);
438 test.assertAfterSimulationIs(print, Bit.ZERO);
439 test2.assertAfterSimulationIs(Bit.ZERO);
440 System.err.println("Z 2 II");
441 aI.feedSignals(Bit.Z);
442 test.assertAfterSimulationIs(print, Bit.Z);
443 test2.assertAfterSimulationIs(Bit.Z);
445 System.err.println("No Conflict yet");
446 bI.feedSignals(Bit.ONE);
447 test.assertAfterSimulationIs(print, Bit.ONE);
448 test2.assertAfterSimulationIs(Bit.ONE);
449 aI.feedSignals(Bit.ONE);
450 test.assertAfterSimulationIs(print, Bit.ONE);
451 test2.assertAfterSimulationIs(Bit.ONE);
452 System.err.println("Conflict");
453 aI.feedSignals(Bit.ZERO);
454 test.assertAfterSimulationIs(print, Bit.X);
455 test2.assertAfterSimulationIs(Bit.X);
456 aI.feedSignals(Bit.ONE);
457 test.assertAfterSimulationIs(print, Bit.ONE);
458 test2.assertAfterSimulationIs(Bit.ONE);
461 private static void assertBitArrayEquals(BitVector actual, Bit... expected)
463 assertArrayEquals(expected, actual.getBits());