X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.core%2Ftest%2Fnet%2Fmograsim%2Flogic%2Fcore%2Ftests%2FComponentTest.java;fp=net.mograsim.logic.core%2Ftest%2Fnet%2Fmograsim%2Flogic%2Fcore%2Ftests%2FComponentTest.java;h=0000000000000000000000000000000000000000;hb=0a04a4ed66ecebd4254541c4977599f6052c115a;hp=464db587c472595ce90d2e3c107cfc5cd6917c9c;hpb=9b4850366c29fbd800ee8df1858c398d8c35a0c0;p=Mograsim.git diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/ComponentTest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/ComponentTest.java deleted file mode 100644 index 464db587..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/ComponentTest.java +++ /dev/null @@ -1,463 +0,0 @@ -package net.mograsim.logic.core.tests; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import net.mograsim.logic.core.components.Demux; -import net.mograsim.logic.core.components.Mux; -import net.mograsim.logic.core.components.TriStateBuffer; -import net.mograsim.logic.core.components.UnidirectionalMerger; -import net.mograsim.logic.core.components.UnidirectionalSplitter; -import net.mograsim.logic.core.components.gates.AndGate; -import net.mograsim.logic.core.components.gates.NandGate; -import net.mograsim.logic.core.components.gates.NorGate; -import net.mograsim.logic.core.components.gates.NotGate; -import net.mograsim.logic.core.components.gates.OrGate; -import net.mograsim.logic.core.components.gates.XorGate; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.Wire; -import net.mograsim.logic.core.wires.Wire.ReadEnd; -import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; - -@SuppressWarnings("unused") -class ComponentTest -{ - private Timeline t = new Timeline(11); - - @BeforeEach - void resetTimeline() - { - t.reset(); - } - - @Test - void circuitExampleTest() - { - 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), - 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), - k = new Wire(t, 1, 1); - new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd()); - new UnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd()); - new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd()); - new UnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd()); - - a.createReadWriteEnd().feedSignals(Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ZERO); - d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE); - e.createReadWriteEnd().feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ONE, j.getValue()); - assertEquals(Bit.ZERO, k.getValue()); - } - - @Test - void splitterTest() - { - 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); - in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - new UnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd()); - - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO); - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void mergerTest() - { - 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); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - new UnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void fusionTest1() - { - 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); - Wire.fuse(a, out, 0, 0, a.width); - Wire.fuse(b, out, 0, a.width, b.width); - Wire.fuse(c, out, 0, a.width + b.width, c.width); - ReadWriteEnd rA = a.createReadWriteEnd(); - rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); - ReadWriteEnd rB = b.createReadWriteEnd(); - rB.feedSignals(Bit.ONE, Bit.ZERO); - ReadWriteEnd rC = c.createReadWriteEnd(); - rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - t.executeAll(); - assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X); - assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X); - assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X); - rA.clearSignals(); - rB.clearSignals(); - rC.clearSignals(); - t.executeAll(); - assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); - assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE); - assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); - } - - @Test - void fusionTest2() - { - Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); - Wire.fuse(a, b); - ReadWriteEnd rw = a.createReadWriteEnd(); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); - - rw.feedSignals(Bit.ONE, Bit.U, Bit.Z); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z); - } - - @Test - void fusionTest3() - { - Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); - a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X); - t.executeAll(); - Wire.fuse(a, b); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X); - } - - @Test - void fusionTest4() - { - Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); - a.createReadWriteEnd(); - t.executeAll(); - - Wire.fuse(a, b); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); - } - -// @Test -// void connectorTest() -// { -// t.reset(); -// Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); -// new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect(); -//// b.createReadWriteEnd(); -// a.createReadWriteEnd(); -// t.executeAll(); -// assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); -// } - - @Test - void triStateBufferTest() - { - 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); - new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd()); - new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd()); - new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd()); - - ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd(); - enI.feedSignals(Bit.ONE); - aI.feedSignals(Bit.ONE); - bI.feedSignals(Bit.Z); - - t.executeAll(); - - assertEquals(Bit.ONE, b.getValue()); - - bI.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.X, b.getValue()); - assertEquals(Bit.ONE, a.getValue()); - - aI.clearSignals(); - enI.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ZERO, a.getValue()); - - } - - @Test - void muxTest() - { - 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); - ReadWriteEnd selectIn = select.createReadWriteEnd(); - - selectIn.feedSignals(Bit.ZERO, Bit.ZERO); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), - c.createReadOnlyEnd()); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - selectIn.feedSignals(Bit.ZERO, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - selectIn.feedSignals(Bit.ONE, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - - } - - @Test - void demuxTest() - { - 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); - ReadWriteEnd selectIn = select.createReadWriteEnd(); - - selectIn.feedSignals(Bit.ZERO, Bit.ZERO); - in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - - new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), - c.createReadWriteEnd()); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - selectIn.feedSignals(Bit.ZERO, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - - selectIn.feedSignals(Bit.ONE, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - - } - - @Test - void andTest() - { - Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1); - new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO); - } - - @Test - void orTest() - { - Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1); - new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void nandTest() - { - 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); - new NandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); - } - - @Test - void norTest() - { - 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); - new NorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO); - } - - @Test - void xorTest() - { - 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); - new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); - b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE); - } - - @Test - void notTest() - { - Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2); - new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd()); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO); - } - - @Test - void rsLatchCircuitTest() - { - 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), - nq = new Wire(t, 1, 1); - - new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); - new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); - new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd()); - new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); - - ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd(); - - sIn.feedSignals(Bit.ONE); - rIn.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ONE, q.getValue()); - assertEquals(Bit.ZERO, nq.getValue()); - - sIn.feedSignals(Bit.ZERO); - - t.executeAll(); - assertEquals(Bit.ONE, q.getValue()); - assertEquals(Bit.ZERO, nq.getValue()); - - rIn.feedSignals(Bit.ONE); - - t.executeAll(); - - assertEquals(Bit.ZERO, q.getValue()); - assertEquals(Bit.ONE, nq.getValue()); - } - - @Test - void numericValueTest() - { - Wire a = new Wire(t, 4, 1); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE); - - t.executeAll(); - - assertEquals(15, a.getUnsignedValue()); - assertEquals(-1, a.getSignedValue()); - } - - boolean flag = false; - - @Test - void simpleTimelineTest() - { - Timeline t = new Timeline(3); - flag = false; - t.addEvent((e) -> - { - if (!flag) - fail("Events executed out of order!"); - flag = false; - }, 15); - t.addEvent((e) -> - { - if (flag) - fail("Events executed out of order!"); - flag = true; - }, 10); - t.addEvent((e) -> - { - if (flag) - fail("Events executed out of order!"); - flag = true; - }, 20); - t.addEvent((e) -> - { - fail("Only supposed to execute until timestamp 20, not 25"); - }, 25); - - t.executeUntil(t.laterThan(20), 100); - - if (!flag) - fail("Not all events were executed in order!"); - } - - // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes - @Disabled("Out of date") - @Test - void multipleInputs() - { - Wire w = new Wire(t, 2, 1); - ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd(); - wI1.feedSignals(Bit.ONE, Bit.Z); - wI2.feedSignals(Bit.Z, Bit.X); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X); - - wI2.feedSignals(Bit.ZERO, Bit.Z); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z); - - wI2.feedSignals(Bit.Z, Bit.Z); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); - - wI2.feedSignals(Bit.ONE, Bit.Z); - ReadEnd rE = w.createReadOnlyEnd(); - rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change.")); - t.executeAll(); - rE.close(); - wI1.feedSignals(Bit.X, Bit.X); - t.executeAll(); - wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed.")); - wI1.close(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); - } - - private static void assertBitArrayEquals(BitVector actual, Bit... expected) - { - assertArrayEquals(expected, actual.getBits()); - } -}