17c9f3c8ae22eba02dca835a86b9eb9ede7cca9a
[Mograsim.git] / era.mi / src / era / mi / logic / components / Connector.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.wires.WireArray;
8 import era.mi.logic.wires.WireArray.WireArrayEnd;
9 import era.mi.logic.wires.WireArrayObserver;
10
11 public class Connector implements WireArrayObserver, Component
12 {
13         private boolean connected;
14         private final WireArray a;
15         private final WireArray b;
16         private final WireArrayEnd aI;
17         private final WireArrayEnd bI;
18
19         public Connector(WireArray a, WireArray b)
20         {
21                 if (a.length != b.length)
22                         throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length, b.length));
23                 this.a = a;
24                 this.b = b;
25                 a.addObserver(this);
26                 b.addObserver(this);
27                 aI = a.createInput();
28                 bI = b.createInput();
29         }
30
31         public void connect()
32         {
33                 connected = true;
34                 update(a);
35                 update(b);
36         }
37
38         public void disconnect()
39         {
40                 connected = false;
41                 aI.clearSignals();
42                 bI.clearSignals();
43         }
44
45         public void setConnection(boolean connected)
46         {
47                 if (connected)
48                         connect();
49                 else
50                         disconnect();
51         }
52
53         @Override
54         public void update(WireArray initiator, Bit[] oldValues)
55         {
56                 if (connected)
57                         Simulation.TIMELINE.addEvent(e -> update(initiator), 1);
58         }
59
60         private void update(WireArray initiator)
61         {
62                 if (initiator == a)
63                         bI.feedSignals(aI.wireValuesExcludingMe());
64                 else
65                         aI.feedSignals(bI.wireValuesExcludingMe());
66         }
67
68         @Override
69         public List<WireArray> getAllInputs()
70         {
71                 return List.of(a, b);
72         }
73
74         @Override
75         public List<WireArray> getAllOutputs()
76         {
77                 return List.of(a, b);
78         }
79 }