1 package era.mi.logic.components;
3 import era.mi.logic.wires.WireArray;
4 import era.mi.logic.wires.WireArray.WireArrayInput;
5 import era.mi.logic.wires.WireArrayObserver;
7 public class Merger implements WireArrayObserver
9 private WireArrayInput outI;
10 private WireArray[] inputs;
11 private int[] beginningIndex;
15 * @param union The output of merging n {@link WireArray}s into one. Must have
16 * length = a1.length() + a2.length() + ... + an.length().
17 * @param inputs The inputs to be merged into the union
19 public Merger(WireArray union, WireArray... inputs)
22 this.outI = union.createInput();
23 this.beginningIndex = new int[inputs.length];
26 for (int i = 0; i < inputs.length; i++)
28 beginningIndex[i] = length;
29 length += inputs[i].length;
30 inputs[i].addObserver(this);
33 if (length != union.length)
34 throw new IllegalArgumentException(
35 "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
38 public WireArray getInput(int index)
43 public WireArray getUnion()
49 public void update(WireArray initiator)
51 int index = find(initiator);
52 int beginning = beginningIndex[index];
53 outI.feedSignals(beginning, initiator.getValues());
56 private int find(WireArray w)
58 for (int i = 0; i < inputs.length; i++)
64 public WireArray[] getInputs()
66 return inputs.clone();