X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.core%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fcore%2Fcomponents%2FManualSwitch.java;h=e5cdf1be639bdd839c0e2b4ee91f030629833d1e;hb=6345e8d7c88792fb1f92eb490e43b0decc15bf0f;hp=626804f0b17dc0cd081d05242484cc5fcbb3711d;hpb=10ce5cc888d0b781069822cecd85e33e6be8f54b;p=Mograsim.git diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java index 626804f0..e5cdf1be 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java @@ -8,6 +8,7 @@ import net.mograsim.logic.core.LogicObservable; import net.mograsim.logic.core.LogicObserver; import net.mograsim.logic.core.timeline.Timeline; import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; @@ -21,59 +22,55 @@ public class ManualSwitch extends Component implements LogicObservable { private Collection observers; private ReadWriteEnd output; - private boolean isOn; public ManualSwitch(Timeline timeline, ReadWriteEnd output) { super(timeline); observers = new ArrayList<>(); - if (output.length() != 1) - throw new IllegalArgumentException("Switch output can be only a single wire"); this.output = output; } - public void switchOn() + public void switchFullOn() { - setState(true); + setState(BitVector.of(Bit.ONE, output.length())); } - public void switchOff() + public void switchFullOff() { - setState(false); + setState(BitVector.of(Bit.ZERO, output.length())); } public void toggle() { - setState(!isOn); + if (isFullOn()) + switchFullOff(); + else + switchFullOn(); } - public void setState(boolean isOn) + public void setState(Bit bit) { - if (this.isOn == isOn) - return; - this.isOn = isOn; - output.feedSignals(getValue()); - notifyObservers(); + setState(BitVector.of(bit)); } - public void setToValueOf(Bit bit) + public void setState(BitVector bits) { - if (bit == Bit.ONE) - switchOn(); - else if (bit == Bit.ZERO) - switchOff(); - else - throw new IllegalArgumentException("Cannot set ManualSwitch to the value of Bit " + bit); + if (bits.length() != output.length()) + throw new IllegalArgumentException("Incorrect bit vector length"); + if (bits.equals(output.getInputValues())) + return; + output.feedSignals(bits); + notifyObservers(); } - public boolean isOn() + public boolean isFullOn() { - return isOn; + return BitVector.of(Bit.ONE, output.length()).equals(output.getInputValues()); } - public Bit getValue() + public BitVector getValues() { - return isOn ? Bit.ONE : Bit.ZERO; + return output.getInputValues(); } @Override