--- /dev/null
+package era.mi.logic.components;\r
+\r
+import java.util.Arrays;\r
+\r
+import era.mi.logic.Bit;\r
+import era.mi.logic.wires.WireArray;\r
+\r
+public class BitDisplay extends BasicComponent\r
+{\r
+ private final WireArray in;\r
+ private Bit[] displayedValue;\r
+\r
+ public BitDisplay(WireArray in)\r
+ {\r
+ super(1);\r
+ this.in = in;\r
+ in.addObserver(this);\r
+ }\r
+\r
+ @Override\r
+ protected void compute()\r
+ {\r
+ displayedValue = in.getValues();\r
+ }\r
+\r
+ public Bit[] getDisplayedValue()\r
+ {\r
+ return displayedValue;\r
+ }\r
+\r
+ public boolean isDisplaying(Bit... values)\r
+ {\r
+ return Arrays.equals(displayedValue, values);\r
+ }\r
+}\r
import static org.junit.jupiter.api.Assertions.*;
import java.util.Arrays;
+import java.util.function.LongConsumer;
import org.junit.jupiter.api.Test;
import era.mi.logic.Bit;
import era.mi.logic.Simulation;
-import era.mi.logic.components.Merger2;
-import era.mi.logic.components.Mux;
import era.mi.logic.components.Mux2;
-import era.mi.logic.components.Splitter;
import era.mi.logic.components.gates.AndGate;
import era.mi.logic.components.gates.NotGate;
import era.mi.logic.components.gates.OrGate;
}
assertTrue(Arrays.equals(w.getValues(), new Bit[] { Bit.ONE, Bit.Z }));
}
+
+ @Test
+ void wireConnections()
+ {
+ // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
+
+ Simulation.TIMELINE.reset();
+
+ WireArray a = new WireArray(1, 2);
+ WireArray b = new WireArray(1, 2);
+ WireArray c = new WireArray(1, 2);
+ WireArrayInput aI = a.createInput();
+ WireArrayInput bI = b.createInput();
+ WireArrayInput cI = c.createInput();
+
+ TestBitDisplay test = new TestBitDisplay(c);
+ LongConsumer print = time -> System.out.format("Time %2d\n %s\n %s\n %s\n", time, a, b, c);
+
+ cI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+
+ cI.feedSignals(Bit.X);
+ test.assertAfterSimulationIs(print, Bit.X);
+
+ cI.feedSignals(Bit.X);
+ cI.feedSignals(Bit.Z);
+ test.assertAfterSimulationIs(print, Bit.Z);
+
+ Connector c1 = new Connector(b, c);
+ test.assertAfterSimulationIs(print, Bit.Z);
+ System.out.println("ONE");
+ bI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+ System.out.println("ZERO");
+ bI.feedSignals(Bit.ZERO);
+ test.assertAfterSimulationIs(print, Bit.ZERO);
+ System.out.println("Z");
+ bI.feedSignals(Bit.Z);
+ test.assertAfterSimulationIs(Bit.Z);
+ }
+
+ private static void assertBitArrayEquals(Bit[] actual, Bit... expected)
+ {
+ assertArrayEquals(expected, actual);
+ }
}
--- /dev/null
+package era.mi.logic.tests;\r
+\r
+import era.mi.logic.Simulation;\r
+import era.mi.logic.wires.WireArray;\r
+import era.mi.logic.wires.WireArray.WireArrayInput;\r
+import era.mi.logic.wires.WireArrayObserver;\r
+\r
+public class Connector implements WireArrayObserver\r
+{\r
+ private final WireArray a;\r
+ private final WireArray b;\r
+ private final WireArrayInput aI;\r
+ private final WireArrayInput bI;\r
+\r
+ public Connector(WireArray a, WireArray b)\r
+ {\r
+ if (a.length != b.length)\r
+ throw new IllegalArgumentException("WireArray width does not match: " + a.length + ", " + b.length);\r
+ this.a = a;\r
+ this.b = b;\r
+ a.addObserver(this);\r
+ b.addObserver(this);\r
+ aI = a.createInput();\r
+ bI = b.createInput();\r
+ }\r
+\r
+ @Override\r
+ public void update(WireArray initiator)\r
+ {\r
+ Simulation.TIMELINE.addEvent((e) ->\r
+ {\r
+ if (initiator == a)\r
+ bI.feedSignals(a.getValues());\r
+ else\r
+ aI.feedSignals(b.getValues());\r
+ }, 1);\r
+ }\r
+}\r
--- /dev/null
+package era.mi.logic.tests;\r
+\r
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;\r
+\r
+import java.util.Arrays;\r
+import java.util.function.LongConsumer;\r
+\r
+import era.mi.logic.Bit;\r
+import era.mi.logic.Simulation;\r
+import era.mi.logic.components.BitDisplay;\r
+import era.mi.logic.wires.WireArray;\r
+\r
+public final class TestBitDisplay extends BitDisplay\r
+{\r
+\r
+ public TestBitDisplay(WireArray in)\r
+ {\r
+ super(in);\r
+ }\r
+\r
+ public void assertDisplays(Bit... expected)\r
+ {\r
+ assertArrayEquals(expected, getDisplayedValue());\r
+ }\r
+\r
+ public void assertAfterSimulationIs(Bit... expected)\r
+ {\r
+ Simulation.TIMELINE.executeAll();\r
+ assertDisplays(expected);\r
+ }\r
+\r
+ public void assertAfterSimulationIs(LongConsumer r, Bit... expected)\r
+ {\r
+ while (Simulation.TIMELINE.hasNext())\r
+ {\r
+ Simulation.TIMELINE.executeNext();\r
+ r.accept(Simulation.TIMELINE.getSimulationTime());\r
+ }\r
+ assertDisplays(expected);\r
+ }\r
+\r
+ @Override\r
+ protected void compute()\r
+ {\r
+ super.compute();\r
+ System.out.println("update: value is " + Arrays.toString(getDisplayedValue()));\r
+ }\r
+}\r