+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