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