8e966f13ff065bd40cb5d9bba4e7d739e6baec35
[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.WireArrayInput;\r
13 \r
14 public class Clock implements TimelineEventHandler, Component {\r
15         private boolean toggle = false;\r
16         private WireArrayInput outI;\r
17         private int delta;\r
18 \r
19         /**\r
20          * \r
21          * @param out   {@link WireArray} the clock's impulses are fed into\r
22          * @param delta ticks between rising and falling edge\r
23          */\r
24         public Clock(WireArray out, int delta) {\r
25                 this.delta = delta;\r
26                 this.outI = out.createInput();\r
27                 Simulation.TIMELINE.addEvent(this, 50);\r
28         }\r
29 \r
30         @Override\r
31         public void handle(TimelineEvent e) {\r
32                 addToTimeline();\r
33                 outI.feedSignals(new Bit[] { toggle ? Bit.ONE : Bit.ZERO });\r
34                 toggle = !toggle;\r
35         }\r
36 \r
37         public WireArray getOut() {\r
38                 return outI.owner;\r
39         }\r
40 \r
41         private void addToTimeline() {\r
42                 Simulation.TIMELINE.addEvent(this, delta);\r
43         }\r
44 \r
45         @Override\r
46         public List<WireArray> getAllInputs() {\r
47                 return Collections.unmodifiableList(Arrays.asList());\r
48         }\r
49 \r
50         @Override\r
51         public List<WireArray> getAllOutputs() {\r
52                 return Collections.unmodifiableList(Arrays.asList(outI.owner));\r
53         }\r
54 }\r