75884f869232cd52e398e651c98cca74991d61e1
[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.WireArrayEnd;\r
10 import era.mi.logic.wires.WireArrayObserver;\r
11 \r
12 public class Merger implements WireArrayObserver, Component\r
13 {\r
14         private WireArrayEnd outI;\r
15         private WireArray[] inputs;\r
16         private int[] beginningIndex;\r
17 \r
18         /**\r
19          * \r
20          * @param union  The output of merging n {@link WireArray}s into one. Must have length = a1.length() + a2.length() + ... + an.length().\r
21          * @param inputs The inputs to be merged into the union\r
22          */\r
23         public Merger(WireArray union, WireArray... inputs)\r
24         {\r
25                 this.inputs = inputs;\r
26                 this.outI = union.createInput();\r
27                 this.beginningIndex = new int[inputs.length];\r
28 \r
29                 int length = 0;\r
30                 for (int i = 0; i < inputs.length; i++)\r
31                 {\r
32                         beginningIndex[i] = length;\r
33                         length += inputs[i].length;\r
34                         inputs[i].addObserver(this);\r
35                 }\r
36 \r
37                 if (length != union.length)\r
38                         throw new IllegalArgumentException(\r
39                                         "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");\r
40         }\r
41 \r
42         public WireArray getInput(int index)\r
43         {\r
44                 return inputs[index];\r
45         }\r
46 \r
47         public WireArray getUnion()\r
48         {\r
49                 return outI.owner;\r
50         }\r
51 \r
52         @Override\r
53         public void update(WireArray initiator, Bit[] oldValues)\r
54         {\r
55                 int index = find(initiator);\r
56                 int beginning = beginningIndex[index];\r
57                 outI.feedSignals(beginning, initiator.getValues());\r
58         }\r
59 \r
60         private int find(WireArray w)\r
61         {\r
62                 for (int i = 0; i < inputs.length; i++)\r
63                         if (inputs[i] == w)\r
64                                 return i;\r
65                 return -1;\r
66         }\r
67 \r
68         public WireArray[] getInputs()\r
69         {\r
70                 return inputs.clone();\r
71         }\r
72 \r
73         @Override\r
74         public List<WireArray> getAllInputs()\r
75         {\r
76                 return Collections.unmodifiableList(Arrays.asList(inputs));\r
77         }\r
78 \r
79         @Override\r
80         public List<WireArray> getAllOutputs()\r
81         {\r
82                 return Collections.unmodifiableList(Arrays.asList(outI.owner));\r
83         }\r
84 }\r