e186928b10c6782ca216bbe1088b136fde814f5a
[Mograsim.git] / plugins / net.mograsim.logic.core / src / net / mograsim / logic / core / components / CoreClock.java
1 package net.mograsim.logic.core.components;
2
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.List;
6
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;
16
17 public class CoreClock extends CoreComponent implements TimelineEventHandler, LogicObservable
18 {
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;
22         private int delta;
23
24         /**
25          * 
26          * @param out   {@link CoreWire} the clock's impulses are fed into
27          * @param delta ticks between rising and falling edge
28          */
29         public CoreClock(Timeline timeline, ReadWriteEnd out, int delta)
30         {
31                 super(timeline);
32                 this.delta = delta;
33                 this.out = out;
34                 this.observers = new HashSet<>();
35                 addToTimeline();
36         }
37
38         @Override
39         public void handle(TimelineEvent e)
40         {
41                 addToTimeline();
42                 isOn = !isOn;
43                 out.feedSignals(getOutValues());
44                 notifyObservers();
45         }
46
47         public BitVector getOutValues()
48         {
49                 return isOn ? BitVector.SINGLE_1 : BitVector.SINGLE_0;
50         }
51
52         public boolean isOn()
53         {
54                 return isOn;
55         }
56
57         private void addToTimeline()
58         {
59                 timeline.addEvent(this, delta);
60         }
61
62         @Override
63         public List<ReadEnd> getAllInputs()
64         {
65                 return List.of();
66         }
67
68         @Override
69         public List<ReadWriteEnd> getAllOutputs()
70         {
71                 return List.of(out);
72         }
73
74         @Override
75         public void registerObserver(LogicObserver ob)
76         {
77                 observers.add(ob);
78         }
79
80         @Override
81         public void deregisterObserver(LogicObserver ob)
82         {
83                 observers.remove(ob);
84         }
85
86         @Override
87         public void notifyObservers()
88         {
89                 observers.forEach(ob -> ob.update(this));
90         }
91 }