WireEnd functionality split into ReadEnd and ReadWriteEnd
[Mograsim.git] / era.mi / src / era / mi / logic / components / Splitter.java
1 package era.mi.logic.components;\r
2 \r
3 import java.util.List;\r
4 \r
5 import era.mi.logic.types.BitVector;\r
6 import era.mi.logic.wires.Wire.ReadEnd;\r
7 import era.mi.logic.wires.Wire.ReadWriteEnd;\r
8 import era.mi.logic.wires.WireObserver;\r
9 \r
10 public class Splitter implements WireObserver, Component\r
11 {\r
12         private ReadEnd input;\r
13         private ReadWriteEnd[] outputs;\r
14 \r
15         public Splitter(ReadEnd input, ReadWriteEnd... outputs)\r
16         {\r
17                 this.input = input;\r
18                 this.outputs = outputs;\r
19                 input.addObserver(this);\r
20                 int length = 0;\r
21                 for (ReadEnd out : outputs)\r
22                         length += out.length();\r
23 \r
24                 if (input.length() != length)\r
25                         throw new IllegalArgumentException(\r
26                                         "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");\r
27         }\r
28 \r
29         protected void compute()\r
30         {\r
31                 BitVector inputBits = input.getValues();\r
32                 int startIndex = 0;\r
33                 for (int i = 0; i < outputs.length; i++)\r
34                 {\r
35                         outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].length()));\r
36                         startIndex += outputs[i].length();\r
37                 }\r
38         }\r
39 \r
40         @Override\r
41         public void update(ReadEnd initiator, BitVector oldValues)\r
42         {\r
43                 compute();\r
44         }\r
45 \r
46         @Override\r
47         public List<ReadEnd> getAllInputs()\r
48         {\r
49                 return List.of(input);\r
50         }\r
51 \r
52         @Override\r
53         public List<ReadWriteEnd> getAllOutputs()\r
54         {\r
55                 return List.of(outputs);\r
56         }\r
57 }\r