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