0b2e55ae2344de0c28a70b02b2c818240c9a4a94
[Mograsim.git] / era.mi / src / net / mograsim / logic / core / components / Connector.java
1 package net.mograsim.logic.core.components;\r
2 \r
3 import java.util.List;\r
4 \r
5 import net.mograsim.logic.core.timeline.Timeline;\r
6 import net.mograsim.logic.core.types.BitVector;\r
7 import net.mograsim.logic.core.wires.WireObserver;\r
8 import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
9 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
10 \r
11 public class Connector extends Component implements WireObserver\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(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)\r
18         {\r
19                 super(timeline);\r
20                 if (a.length() != b.length())\r
21                         throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));\r
22                 this.a = a;\r
23                 this.b = b;\r
24                 a.addObserver(this);\r
25                 b.addObserver(this);\r
26         }\r
27 \r
28         public void connect()\r
29         {\r
30                 connected = true;\r
31                 update(a);\r
32                 update(b);\r
33         }\r
34 \r
35         public void disconnect()\r
36         {\r
37                 connected = false;\r
38                 a.clearSignals();\r
39                 b.clearSignals();\r
40         }\r
41 \r
42         public void setConnection(boolean connected)\r
43         {\r
44                 if (connected)\r
45                         connect();\r
46                 else\r
47                         disconnect();\r
48         }\r
49 \r
50         @Override\r
51         public void update(ReadEnd initiator, BitVector oldValues)\r
52         {\r
53                 if (connected)\r
54                         timeline.addEvent(e -> update(initiator), 1);\r
55         }\r
56 \r
57         private void update(ReadEnd initiator)\r
58         {\r
59                 if (initiator == a)\r
60                         b.feedSignals(a.wireValuesExcludingMe());\r
61                 else\r
62                         a.feedSignals(b.wireValuesExcludingMe());\r
63         }\r
64 \r
65         @Override\r
66         public List<ReadEnd> getAllInputs()\r
67         {\r
68                 return List.of(a, b);\r
69         }\r
70 \r
71         @Override\r
72         public List<ReadWriteEnd> getAllOutputs()\r
73         {\r
74                 return List.of(a, b);\r
75         }\r
76 }\r