Reformatted everything. Eclipse built-in Linewrapping/Comments 140 chars
[Mograsim.git] / era.mi / src / era / mi / logic / components / Merger.java
1 package era.mi.logic.components;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.Collections;\r
5 import java.util.List;\r
6 \r
7 import era.mi.logic.Bit;\r
8 import era.mi.logic.wires.WireArray;\r
9 import era.mi.logic.wires.WireArray.WireArrayInput;\r
10 import era.mi.logic.wires.WireArrayObserver;\r
11 \r
12 public class Merger implements WireArrayObserver, Component {\r
13         private WireArrayInput outI;\r
14         private WireArray[] inputs;\r
15         private int[] beginningIndex;\r
16 \r
17         /**\r
18          * \r
19          * @param union  The output of merging n {@link WireArray}s into one. Must have length = a1.length() + a2.length() + ... + an.length().\r
20          * @param inputs The inputs to be merged into the union\r
21          */\r
22         public Merger(WireArray union, WireArray... inputs) {\r
23                 this.inputs = inputs;\r
24                 this.outI = union.createInput();\r
25                 this.beginningIndex = new int[inputs.length];\r
26 \r
27                 int length = 0;\r
28                 for (int i = 0; i < inputs.length; i++) {\r
29                         beginningIndex[i] = length;\r
30                         length += inputs[i].length;\r
31                         inputs[i].addObserver(this);\r
32                 }\r
33 \r
34                 if (length != union.length)\r
35                         throw new IllegalArgumentException(\r
36                                         "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");\r
37         }\r
38 \r
39         public WireArray getInput(int index) {\r
40                 return inputs[index];\r
41         }\r
42 \r
43         public WireArray getUnion() {\r
44                 return outI.owner;\r
45         }\r
46 \r
47         @Override\r
48         public void update(WireArray initiator, Bit[] oldValues) {\r
49                 int index = find(initiator);\r
50                 int beginning = beginningIndex[index];\r
51                 outI.feedSignals(beginning, initiator.getValues());\r
52         }\r
53 \r
54         private int find(WireArray w) {\r
55                 for (int i = 0; i < inputs.length; i++)\r
56                         if (inputs[i] == w)\r
57                                 return i;\r
58                 return -1;\r
59         }\r
60 \r
61         public WireArray[] getInputs() {\r
62                 return inputs.clone();\r
63         }\r
64 \r
65         @Override\r
66         public List<WireArray> getAllInputs() {\r
67                 return Collections.unmodifiableList(Arrays.asList(inputs));\r
68         }\r
69 \r
70         @Override\r
71         public List<WireArray> getAllOutputs() {\r
72                 return Collections.unmodifiableList(Arrays.asList(outI.owner));\r
73         }\r
74 }\r