Added era.mi; Project containing provisional simulator core
[Mograsim.git] / era.mi / src / era / mi / logic / components / Merger.java
1 package era.mi.logic.components;
2
3 import era.mi.logic.Util;
4 import era.mi.logic.Bit;
5 import era.mi.logic.WireArray;
6 import era.mi.logic.WireArrayObserver;
7
8 @Deprecated
9 public class Merger implements WireArrayObserver
10 {
11         private WireArray out;
12         private WireArray[] inputs;
13         
14         //TODO: General problem with this concept; New inputs coming in at the same time override each other
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.out = union;
25                 
26                 int length = 0;
27                 for(WireArray input : inputs)
28                 {
29                         length += input.length();
30                         input.addObserver(this);
31                 }
32                         
33                 if(length != union.length())
34                         throw new IllegalArgumentException("The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
35         }
36
37         protected void compute()
38         {
39                 Bit[][] bits = new Bit[inputs.length][];
40                 for(int i = 0; i < inputs.length; i++)
41                         bits[i] = inputs[i].getValues();
42                 Bit[] newOut = Util.concat(bits);
43                 out.feedSignals(newOut);
44         }
45
46         public WireArray getInput(int index)
47         {
48                 return inputs[index];
49         }
50         
51         public WireArray getUnion()
52         {
53                 return out;
54         }
55         
56         @Override
57         public void update(WireArray initiator)
58         {
59                 compute(); //No inner delay
60         }
61 }