BitDisplay, ManualSwitch now Observable. More Docs added in Timeline.
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / components / BitDisplay.java
1 package net.mograsim.logic.core.components;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 \r
7 import net.mograsim.logic.core.LogicObservable;\r
8 import net.mograsim.logic.core.LogicObserver;\r
9 import net.mograsim.logic.core.timeline.Timeline;\r
10 import net.mograsim.logic.core.types.Bit;\r
11 import net.mograsim.logic.core.types.BitVector;\r
12 import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
13 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
14 \r
15 public class BitDisplay extends BasicComponent implements LogicObservable\r
16 {\r
17         private Collection<LogicObserver> observers;\r
18         private final ReadEnd in;\r
19         private BitVector displayedValue;\r
20 \r
21         public BitDisplay(Timeline timeline, ReadEnd in)\r
22         {\r
23                 super(timeline, 1);\r
24                 observers = new ArrayList<>();\r
25                 this.in = in;\r
26                 in.registerObserver(this);\r
27                 compute();\r
28         }\r
29 \r
30         @Override\r
31         protected void compute()\r
32         {\r
33                 displayedValue = in.getValues();\r
34                 notifyObservers();\r
35         }\r
36 \r
37         public BitVector getDisplayedValue()\r
38         {\r
39                 return displayedValue;\r
40         }\r
41 \r
42         public boolean isDisplaying(Bit... values)\r
43         {\r
44                 return displayedValue.equals(BitVector.of(values));\r
45         }\r
46 \r
47         @Override\r
48         public List<ReadEnd> getAllInputs()\r
49         {\r
50                 return List.of(in);\r
51         }\r
52 \r
53         @Override\r
54         public List<ReadWriteEnd> getAllOutputs()\r
55         {\r
56                 return List.of();\r
57         }\r
58 \r
59         @Override\r
60         public void registerObserver(LogicObserver ob)\r
61         {\r
62                 observers.add(ob);\r
63         }\r
64 \r
65         @Override\r
66         public void deregisterObserver(LogicObserver ob)\r
67         {\r
68                 observers.remove(ob);\r
69         }\r
70 \r
71         @Override\r
72         public void notifyObservers()\r
73         {\r
74                 observers.forEach(ob -> ob.update(this));\r
75         }\r
76 }\r