f7648554e2e1c3c4df92a0e798d082a25a8d9ca1
[Mograsim.git] / era.mi / src / era / mi / logic / components / Clock.java
1 package era.mi.logic.components;
2
3 import java.util.List;
4
5 import era.mi.logic.Simulation;
6 import era.mi.logic.timeline.TimelineEvent;
7 import era.mi.logic.timeline.TimelineEventHandler;
8 import era.mi.logic.types.Bit;
9 import era.mi.logic.wires.Wire;
10 import era.mi.logic.wires.Wire.ReadEnd;
11 import era.mi.logic.wires.Wire.ReadWriteEnd;
12
13 public class Clock implements TimelineEventHandler, Component
14 {
15         private boolean toggle = false;
16         private ReadWriteEnd out;
17         private int delta;
18
19         /**
20          * 
21          * @param out   {@link Wire} the clock's impulses are fed into
22          * @param delta ticks between rising and falling edge
23          */
24         public Clock(ReadWriteEnd out, int delta)
25         {
26                 this.delta = delta;
27                 this.out = out;
28                 addToTimeline();
29         }
30
31         @Override
32         public void handle(TimelineEvent e)
33         {
34                 addToTimeline();
35                 out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
36                 toggle = !toggle;
37         }
38
39         public ReadWriteEnd getOut()
40         {
41                 return out;
42         }
43
44         private void addToTimeline()
45         {
46                 Simulation.TIMELINE.addEvent(this, delta);
47         }
48
49         @Override
50         public List<ReadEnd> getAllInputs()
51         {
52                 return List.of();
53         }
54
55         @Override
56         public List<ReadWriteEnd> getAllOutputs()
57         {
58                 return List.of(out);
59         }
60 }