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