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