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