-package era.mi.logic.components;
-
-import era.mi.logic.Util;
-import era.mi.logic.Bit;
-import era.mi.logic.WireArray;
-import era.mi.logic.WireArrayObserver;
-
-@Deprecated
-public class Merger implements WireArrayObserver
-{
- private WireArray out;
- private WireArray[] inputs;
-
- //TODO: General problem with this concept; New inputs coming in at the same time override each other
-
- /**
- *
- * @param union The output of merging n {@link WireArray}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
- * @param inputs The inputs to be merged into the union
- */
- public Merger(WireArray union, WireArray... inputs)
- {
- this.inputs = inputs;
- this.out = union;
-
- int length = 0;
- for(WireArray input : inputs)
- {
- length += input.length();
- input.addObserver(this);
- }
-
- if(length != union.length())
- throw new IllegalArgumentException("The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
- }
-
- protected void compute()
- {
- Bit[][] bits = new Bit[inputs.length][];
- for(int i = 0; i < inputs.length; i++)
- bits[i] = inputs[i].getValues();
- Bit[] newOut = Util.concat(bits);
- out.feedSignals(newOut);
- }
-
- public WireArray getInput(int index)
- {
- return inputs[index];
- }
-
- public WireArray getUnion()
- {
- return out;
- }
-
- @Override
- public void update(WireArray initiator)
- {
- compute(); //No inner delay
- }
-}
+package era.mi.logic.components;\r
+\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import era.mi.logic.Bit;\r
+import era.mi.logic.wires.WireArray;\r
+import era.mi.logic.wires.WireArray.WireArrayEnd;\r
+import era.mi.logic.wires.WireArrayObserver;\r
+\r
+public class Merger implements WireArrayObserver, Component\r
+{\r
+ private WireArrayEnd outI;\r
+ private WireArray[] inputs;\r
+ private int[] beginningIndex;\r
+\r
+ /**\r
+ * \r
+ * @param union The output of merging n {@link WireArray}s into one. Must have length = a1.length() + a2.length() + ... + an.length().\r
+ * @param inputs The inputs to be merged into the union\r
+ */\r
+ public Merger(WireArray union, WireArray... inputs)\r
+ {\r
+ this.inputs = inputs;\r
+ this.outI = union.createInput();\r
+ this.beginningIndex = new int[inputs.length];\r
+\r
+ int length = 0;\r
+ for (int i = 0; i < inputs.length; i++)\r
+ {\r
+ beginningIndex[i] = length;\r
+ length += inputs[i].length;\r
+ inputs[i].addObserver(this);\r
+ }\r
+\r
+ if (length != union.length)\r
+ throw new IllegalArgumentException(\r
+ "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");\r
+ }\r
+\r
+ public WireArray getInput(int index)\r
+ {\r
+ return inputs[index];\r
+ }\r
+\r
+ public WireArray getUnion()\r
+ {\r
+ return outI.owner;\r
+ }\r
+\r
+ @Override\r
+ public void update(WireArray initiator, Bit[] oldValues)\r
+ {\r
+ int index = find(initiator);\r
+ int beginning = beginningIndex[index];\r
+ outI.feedSignals(beginning, initiator.getValues());\r
+ }\r
+\r
+ private int find(WireArray w)\r
+ {\r
+ for (int i = 0; i < inputs.length; i++)\r
+ if (inputs[i] == w)\r
+ return i;\r
+ return -1;\r
+ }\r
+\r
+ public WireArray[] getInputs()\r
+ {\r
+ return inputs.clone();\r
+ }\r
+\r
+ @Override\r
+ public List<WireArray> getAllInputs()\r
+ {\r
+ return Collections.unmodifiableList(Arrays.asList(inputs));\r
+ }\r
+\r
+ @Override\r
+ public List<WireArray> getAllOutputs()\r
+ {\r
+ return Collections.unmodifiableList(Arrays.asList(outI.owner));\r
+ }\r
+}\r