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