Merge branch 'development' of
[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.types.Bit;
11 import net.mograsim.logic.core.types.BitVector;
12 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
13 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
14
15 public class CoreBitDisplay extends BasicCoreComponent implements LogicObservable
16 {
17         private Collection<LogicObserver> observers;
18         private final ReadEnd in;
19         private BitVector displayedValue;
20
21         public CoreBitDisplay(Timeline timeline, ReadEnd in)
22         {
23                 super(timeline, 1);
24                 observers = new ArrayList<>();
25                 this.in = in;
26                 in.registerObserver(this);
27                 compute();
28         }
29
30         @Override
31         protected void compute()
32         {
33                 displayedValue = in.getValues();
34                 notifyObservers();
35         }
36
37         public BitVector getDisplayedValue()
38         {
39                 return displayedValue;
40         }
41
42         public boolean isDisplaying(Bit... values)
43         {
44                 return displayedValue.equals(BitVector.of(values));
45         }
46
47         @Override
48         public List<ReadEnd> getAllInputs()
49         {
50                 return List.of(in);
51         }
52
53         @Override
54         public List<ReadWriteEnd> getAllOutputs()
55         {
56                 return List.of();
57         }
58
59         @Override
60         public void registerObserver(LogicObserver ob)
61         {
62                 observers.add(ob);
63         }
64
65         @Override
66         public void deregisterObserver(LogicObserver ob)
67         {
68                 observers.remove(ob);
69         }
70
71         @Override
72         public void notifyObservers()
73         {
74                 observers.forEach(ob -> ob.update(this));
75         }
76 }