import net.mograsim.logic.core.LogicObserver;\r
import net.mograsim.logic.core.timeline.Timeline;\r
import net.mograsim.logic.core.types.Bit;\r
+import net.mograsim.logic.core.types.BitVector;\r
import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
\r
{\r
super(timeline);\r
observers = new ArrayList<>();\r
- if (output.length() != 1)\r
- throw new IllegalArgumentException("Switch output can be only a single wire");\r
this.output = output;\r
}\r
\r
- public void switchOn()\r
+ public void switchFullOn()\r
{\r
- setState(true);\r
+ setState(BitVector.of(Bit.ONE, output.length()));\r
}\r
\r
- public void switchOff()\r
+ public void switchFullOff()\r
{\r
- setState(false);\r
+ setState(BitVector.of(Bit.ZERO, output.length()));\r
}\r
\r
public void toggle()\r
{\r
- setState(!isOn());\r
+ if (isFullOn())\r
+ switchFullOff();\r
+ else\r
+ switchFullOn();\r
}\r
\r
- public void setState(boolean isOn)\r
+ public void setState(Bit bit)\r
{\r
- setToValueOf(isOn ? Bit.ONE : Bit.ZERO);\r
+ setState(BitVector.of(bit));\r
}\r
\r
- public void setToValueOf(Bit bit)\r
+ public void setState(BitVector bits)\r
{\r
- if (!bit.isBinary())\r
- throw new IllegalArgumentException("Cannot set ManualSwitch to the value of Bit " + bit);\r
- if (bit == output.getInputValue())\r
+ if (bits.length() != output.length())\r
+ throw new IllegalArgumentException("Incorrect bit vector length");\r
+ if (bits.equals(output.getInputValues()))\r
return;\r
- output.feedSignals(bit);\r
+ output.feedSignals(bits);\r
notifyObservers();\r
}\r
\r
- public boolean isOn()\r
+ public boolean isFullOn()\r
{\r
- return output.getInputValue() == Bit.ONE;\r
+ return BitVector.of(Bit.ONE, output.length()).equals(output.getInputValues());\r
}\r
\r
- public Bit getValue()\r
+ public BitVector getValues()\r
{\r
- return output.getInputValue();\r
+ return output.getInputValues();\r
}\r
\r
@Override\r