Made Connector an Component and more useful
authorChristian Femers <femers@in.tum.de>
Sun, 19 May 2019 20:26:09 +0000 (22:26 +0200)
committerChristian Femers <femers@in.tum.de>
Sun, 19 May 2019 20:26:09 +0000 (22:26 +0200)
era.mi/src/era/mi/logic/components/Connector.java [new file with mode: 0644]

diff --git a/era.mi/src/era/mi/logic/components/Connector.java b/era.mi/src/era/mi/logic/components/Connector.java
new file mode 100644 (file)
index 0000000..2a9d5ae
--- /dev/null
@@ -0,0 +1,79 @@
+package era.mi.logic.components;\r
+\r
+import java.util.List;\r
+\r
+import era.mi.logic.Bit;\r
+import era.mi.logic.Simulation;\r
+import era.mi.logic.wires.WireArray;\r
+import era.mi.logic.wires.WireArray.WireArrayEnd;\r
+import era.mi.logic.wires.WireArrayObserver;\r
+\r
+public class Connector implements WireArrayObserver, Component\r
+{\r
+       private boolean connected;\r
+       private final WireArray a;\r
+       private final WireArray b;\r
+       private final WireArrayEnd aI;\r
+       private final WireArrayEnd bI;\r
+\r
+       public Connector(WireArray a, WireArray b)\r
+       {\r
+               if (a.length != b.length)\r
+                       throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", 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
+       public void connect()\r
+       {\r
+               connected = true;\r
+               update(a);\r
+               update(b);\r
+       }\r
+\r
+       public void disconnect()\r
+       {\r
+               connected = false;\r
+               aI.clearSignals();\r
+               bI.clearSignals();\r
+       }\r
+\r
+       public void setConnection(boolean connected)\r
+       {\r
+               if (connected)\r
+                       connect();\r
+               else\r
+                       disconnect();\r
+       }\r
+\r
+       @Override\r
+       public void update(WireArray initiator, Bit[] oldValues)\r
+       {\r
+               if (connected)\r
+                       Simulation.TIMELINE.addEvent(e -> update(initiator), 1);\r
+       }\r
+\r
+       private void update(WireArray initiator)\r
+       {\r
+               if (initiator == a)\r
+                       bI.feedSignals(aI.wireValuesExcludingMe());\r
+               else\r
+                       aI.feedSignals(bI.wireValuesExcludingMe());\r
+       }\r
+\r
+       @Override\r
+       public List<WireArray> getAllInputs()\r
+       {\r
+               return List.of(a, b);\r
+       }\r
+\r
+       @Override\r
+       public List<WireArray> getAllOutputs()\r
+       {\r
+               return List.of(a, b);\r
+       }\r
+}\r