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