-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
+package era.mi.logic.components;
+
+import java.util.List;
+
+import era.mi.logic.Simulation;
+import era.mi.logic.types.BitVector;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.WireEnd;
+import era.mi.logic.wires.WireObserver;
+
+public class Connector implements WireObserver, Component
+{
+ private boolean connected;
+ private final WireEnd a;
+ private final WireEnd b;
+
+ public Connector(WireEnd a, WireEnd b)
+ {
+ if (a.length() != b.length())
+ throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));
+ this.a = a;
+ this.b = b;
+ a.addObserver(this);
+ b.addObserver(this);
+ }
+
+ public void connect()
+ {
+ connected = true;
+ update(a.getWire());
+ update(b.getWire());
+ }
+
+ public void disconnect()
+ {
+ connected = false;
+ a.clearSignals();
+ b.clearSignals();
+ }
+
+ public void setConnection(boolean connected)
+ {
+ if (connected)
+ connect();
+ else
+ disconnect();
+ }
+
+ @Override
+ public void update(Wire initiator, BitVector oldValues)
+ {
+ if (connected)
+ Simulation.TIMELINE.addEvent(e -> update(initiator), 1);
+ }
+
+ private void update(Wire initiator)
+ {
+ if (initiator == a.getWire())
+ b.feedSignals(a.wireValuesExcludingMe());
+ else
+ a.feedSignals(b.wireValuesExcludingMe());
+ }
+
+ @Override
+ public List<WireEnd> getAllInputs()
+ {
+ return List.of(a, b);
+ }
+
+ @Override
+ public List<WireEnd> getAllOutputs()
+ {
+ return List.of(a, b);
+ }
+}