WireEnd functionality split into ReadEnd and ReadWriteEnd
[Mograsim.git] / era.mi / src / era / mi / logic / components / TriStateBuffer.java
1 package era.mi.logic.components;\r
2 \r
3 import java.util.List;\r
4 \r
5 import era.mi.logic.types.Bit;\r
6 import era.mi.logic.wires.Wire.ReadEnd;\r
7 import era.mi.logic.wires.Wire.ReadWriteEnd;\r
8 \r
9 public class TriStateBuffer extends BasicComponent\r
10 {\r
11         ReadEnd in, enable;\r
12         ReadWriteEnd out;\r
13 \r
14         public TriStateBuffer(int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)\r
15         {\r
16                 super(processTime);\r
17                 if (in.length() != out.length())\r
18                         throw new IllegalArgumentException(\r
19                                         "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());\r
20                 if (enable.length() != 1)\r
21                         throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + ".");\r
22                 this.in = in;\r
23                 in.addObserver(this);\r
24                 this.enable = enable;\r
25                 enable.addObserver(this);\r
26                 this.out = out;\r
27         }\r
28 \r
29         @Override\r
30         protected void compute()\r
31         {\r
32                 if (enable.getValue() == Bit.ONE)\r
33                         out.feedSignals(in.getValues());\r
34                 else\r
35                         out.clearSignals();\r
36         }\r
37 \r
38         @Override\r
39         public List<ReadEnd> getAllInputs()\r
40         {\r
41                 return List.of(in, enable);\r
42         }\r
43 \r
44         @Override\r
45         public List<ReadWriteEnd> getAllOutputs()\r
46         {\r
47                 return List.of(out);\r
48         }\r
49 \r
50 }\r