X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2FConnector.java;fp=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2FConnector.java;h=89fb96eb4d6737ec44548f19458c8edc4d20e513;hb=5606ceefa2c360772194c85ed884e5f8f06f36aa;hp=0000000000000000000000000000000000000000;hpb=002110424653b282ab9c7ea4b12f967d59e5f66a;p=Mograsim.git 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 index 00000000..89fb96eb --- /dev/null +++ b/era.mi/src/era/mi/logic/components/Connector.java @@ -0,0 +1,75 @@ +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 getAllInputs() + { + return List.of(a, b); + } + + @Override + public List getAllOutputs() + { + return List.of(a, b); + } +}