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