1 package net.mograsim.logic.core.components;
3 import java.util.ArrayList;
4 import java.util.Collection;
7 import net.mograsim.logic.core.LogicObservable;
8 import net.mograsim.logic.core.LogicObserver;
9 import net.mograsim.logic.core.timeline.Timeline;
10 import net.mograsim.logic.core.types.Bit;
11 import net.mograsim.logic.core.types.BitVector;
12 import net.mograsim.logic.core.wires.Wire.ReadEnd;
13 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
16 * This class models a simple on/off (ONE/ZERO) switch for user interaction.
18 * @author Christian Femers
21 public class ManualSwitch extends Component implements LogicObservable
23 private Collection<LogicObserver> observers;
24 private ReadWriteEnd output;
26 public ManualSwitch(Timeline timeline, ReadWriteEnd output)
29 observers = new ArrayList<>();
33 public void switchFullOn()
35 setState(BitVector.of(Bit.ONE, output.width()));
38 public void switchFullOff()
40 setState(BitVector.of(Bit.ZERO, output.width()));
51 public void setState(Bit bit)
53 setState(BitVector.of(bit));
56 public void setState(BitVector bits)
58 if (bits.length() != output.width())
59 throw new IllegalArgumentException("Incorrect bit vector length");
60 if (bits.equals(output.getInputValues()))
62 output.feedSignals(bits);
66 public boolean isFullOn()
68 return BitVector.of(Bit.ONE, output.width()).equals(output.getInputValues());
71 public BitVector getValues()
73 return output.getInputValues();
77 public List<ReadEnd> getAllInputs()
83 public List<ReadWriteEnd> getAllOutputs()
85 return List.of(output);
89 public void registerObserver(LogicObserver ob)
95 public void deregisterObserver(LogicObserver ob)
101 public void notifyObservers()
103 observers.forEach(ob -> ob.update(this));