Introduced sim speed description. Fixes #16
[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 int getDelta()
48         {
49                 return delta;
50         }
51
52         public BitVector getOutValues()
53         {
54                 return isOn ? BitVector.SINGLE_1 : BitVector.SINGLE_0;
55         }
56
57         public boolean isOn()
58         {
59                 return isOn;
60         }
61
62         private void addToTimeline()
63         {
64                 timeline.addEvent(this, delta);
65         }
66
67         @Override
68         public List<ReadEnd> getAllInputs()
69         {
70                 return List.of();
71         }
72
73         @Override
74         public List<ReadWriteEnd> getAllOutputs()
75         {
76                 return List.of(out);
77         }
78
79         @Override
80         public void registerObserver(LogicObserver ob)
81         {
82                 observers.add(ob);
83         }
84
85         @Override
86         public void deregisterObserver(LogicObserver ob)
87         {
88                 observers.remove(ob);
89         }
90
91         @Override
92         public void notifyObservers()
93         {
94                 observers.forEach(ob -> ob.update(this));
95         }
96 }