1 package net.mograsim.logic.core.components;
3 import java.util.Collection;
4 import java.util.HashSet;
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.timeline.TimelineEvent;
11 import net.mograsim.logic.core.timeline.TimelineEventHandler;
12 import net.mograsim.logic.core.types.BitVector;
13 import net.mograsim.logic.core.wires.CoreWire;
14 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
15 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
17 public class CoreClock extends CoreComponent implements TimelineEventHandler, LogicObservable
19 private Collection<LogicObserver> observers;
20 private boolean isOn = false;// first update switches to 1; so the clock starts as 1.
21 private ReadWriteEnd out;
26 * @param out {@link CoreWire} the clock's impulses are fed into
27 * @param delta ticks between rising and falling edge
29 public CoreClock(Timeline timeline, ReadWriteEnd out, int delta)
34 this.observers = new HashSet<>();
39 public void handle(TimelineEvent e)
43 out.feedSignals(getOutValues());
52 public BitVector getOutValues()
54 return isOn ? BitVector.SINGLE_1 : BitVector.SINGLE_0;
62 private void addToTimeline()
64 timeline.addEvent(this, delta);
68 public List<ReadEnd> getAllInputs()
74 public List<ReadWriteEnd> getAllOutputs()
80 public void registerObserver(LogicObserver ob)
86 public void deregisterObserver(LogicObserver ob)
92 public void notifyObservers()
94 observers.forEach(ob -> ob.update(this));