65621358f4d4d2900b02f676864b6bf6c898d45d
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / components / Clock.java
1 package net.mograsim.logic.core.components;
2
3 import java.util.List;
4
5 import net.mograsim.logic.core.timeline.Timeline;
6 import net.mograsim.logic.core.timeline.TimelineEvent;
7 import net.mograsim.logic.core.timeline.TimelineEventHandler;
8 import net.mograsim.logic.core.types.Bit;
9 import net.mograsim.logic.core.wires.Wire;
10 import net.mograsim.logic.core.wires.Wire.ReadEnd;
11 import net.mograsim.logic.core.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 }