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