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