-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Connector extends Component implements WireObserver
-{
- private boolean connected;
- private final ReadWriteEnd a;
- private final ReadWriteEnd b;
-
- public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)
- {
- super(timeline);
- 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);
- update(b);
- }
-
- public void disconnect()
- {
- connected = false;
- a.clearSignals();
- b.clearSignals();
- }
-
- public void setConnection(boolean connected)
- {
- if (connected)
- connect();
- else
- disconnect();
- }
-
- @Override
- public void update(ReadEnd initiator, BitVector oldValues)
- {
- if (connected)
- timeline.addEvent(e -> update(initiator), 1);
- }
-
- private void update(ReadEnd initiator)
- {
- if (initiator == a)
- b.feedSignals(a.wireValuesExcludingMe());
- else
- a.feedSignals(b.wireValuesExcludingMe());
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(a, b);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(a, b);
- }
-}
+package net.mograsim.logic.core.components;\r
+\r
+import java.util.List;\r
+\r
+import net.mograsim.logic.core.LogicObservable;\r
+import net.mograsim.logic.core.LogicObserver;\r
+import net.mograsim.logic.core.timeline.Timeline;\r
+import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
+\r
+public class Connector extends Component implements LogicObserver\r
+{\r
+ private boolean connected;\r
+ private final ReadWriteEnd a;\r
+ private final ReadWriteEnd b;\r
+\r
+ public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)\r
+ {\r
+ super(timeline);\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.registerObserver(this);\r
+ b.registerObserver(this);\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
+ a.clearSignals();\r
+ b.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(LogicObservable initiator)\r
+ {\r
+ if (connected)\r
+ timeline.addEvent(e -> innerUpdate(initiator), 1);\r
+ }\r
+\r
+ private void innerUpdate(LogicObservable initiator)\r
+ {\r
+ if (initiator == a)\r
+ b.feedSignals(a.wireValuesExcludingMe());\r
+ else\r
+ a.feedSignals(b.wireValuesExcludingMe());\r
+ }\r
+\r
+ @Override\r
+ public List<ReadEnd> getAllInputs()\r
+ {\r
+ return List.of(a, b);\r
+ }\r
+\r
+ @Override\r
+ public List<ReadWriteEnd> getAllOutputs()\r
+ {\r
+ return List.of(a, b);\r
+ }\r
+}\r