Timeline now passed via constructor
[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.timeline.Timeline;
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 extends Component implements TimelineEventHandler
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(Timeline timeline, ReadWriteEnd out, int delta)
25         {
26                 super(timeline);
27                 this.delta = delta;
28                 this.out = out;
29                 addToTimeline();
30         }
31
32         @Override
33         public void handle(TimelineEvent e)
34         {
35                 addToTimeline();
36                 out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
37                 toggle = !toggle;
38         }
39
40         public ReadWriteEnd getOut()
41         {
42                 return out;
43         }
44
45         private void addToTimeline()
46         {
47                 timeline.addEvent(this, delta);
48         }
49
50         @Override
51         public List<ReadEnd> getAllInputs()
52         {
53                 return List.of();
54         }
55
56         @Override
57         public List<ReadWriteEnd> getAllOutputs()
58         {
59                 return List.of(out);
60         }
61 }