534b2ca6b5a966a2e2b00d123020bc2fa7fe6c18
[Mograsim.git] / era.mi / src / era / mi / logic / components / Merger.java
1 package era.mi.logic.components;
2
3 import era.mi.logic.wires.WireArray;
4 import era.mi.logic.wires.WireArray.WireArrayInput;
5 import era.mi.logic.wires.WireArrayObserver;
6
7 public class Merger implements WireArrayObserver
8 {
9     private WireArrayInput outI;
10     private WireArray[] inputs;
11     private int[] beginningIndex;
12
13     /**
14      * 
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
18      */
19     public Merger(WireArray union, WireArray... inputs)
20     {
21         this.inputs = inputs;
22         this.outI = union.createInput();
23         this.beginningIndex = new int[inputs.length];
24
25         int length = 0;
26         for (int i = 0; i < inputs.length; i++)
27         {
28             beginningIndex[i] = length;
29             length += inputs[i].length;
30             inputs[i].addObserver(this);
31         }
32
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().");
36     }
37
38     public WireArray getInput(int index)
39     {
40         return inputs[index];
41     }
42
43     public WireArray getUnion()
44     {
45         return outI.owner;
46     }
47
48     @Override
49     public void update(WireArray initiator)
50     {
51         int index = find(initiator);
52         int beginning = beginningIndex[index];
53         outI.feedSignals(beginning, initiator.getValues());
54     }
55
56     private int find(WireArray w)
57     {
58         for (int i = 0; i < inputs.length; i++)
59             if (inputs[i] == w)
60                 return i;
61         return -1;
62     }
63
64     public WireArray[] getInputs()
65     {
66         return inputs.clone();
67     }
68 }