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