GUIBitDisplay and GUIManualSwitch now support logicWidth != 1
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / components / ManualSwitch.java
index 7f4f265..e5cdf1b 100644 (file)
@@ -8,6 +8,7 @@ import net.mograsim.logic.core.LogicObservable;
 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
@@ -26,49 +27,50 @@ public class ManualSwitch extends Component implements LogicObservable
        {\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