Fixed Merger, Mux, Splitter: onedirectional again. Tests added.
[Mograsim.git] / era.mi / src / era / mi / logic / components / Mapper.java
diff --git a/era.mi/src/era/mi/logic/components/Mapper.java b/era.mi/src/era/mi/logic/components/Mapper.java
new file mode 100644 (file)
index 0000000..ef3f235
--- /dev/null
@@ -0,0 +1,66 @@
+package era.mi.logic.components;
+
+import era.mi.logic.wires.WireArray;
+import era.mi.logic.wires.WireArray.WireArrayInput;
+import era.mi.logic.wires.WireArrayObserver;
+
+public class Mapper implements WireArrayObserver
+{
+    private int[] inBeginningIndex, outBeginningIndex;
+    private WireArray[] inputs;
+    private WireArrayInput[] outputsI;
+
+    public Mapper(WireArray[] inputs, WireArray[] outputs)
+    {
+       this.inputs = inputs.clone();
+
+       int beginningIndex = 0;
+       for (int i = 0; i < inputs.length; i++)
+       {
+           inBeginningIndex[i] = beginningIndex;
+           beginningIndex += inputs[i].length;
+           inputs[i].addObserver(this);
+       }
+       int inputsLength = beginningIndex;
+       beginningIndex = 0;
+       for (int i = 0; i < outputs.length; i++)
+       {
+           outputsI[i] = outputs[i].createInput();
+           outBeginningIndex[i] = beginningIndex;
+           beginningIndex += outputs[i].length;
+       }
+       if (inputsLength != beginningIndex)
+           throw new IllegalArgumentException("Mapper inputs must add up to the same length as outputs. ("
+                   + inputsLength + ", " + beginningIndex + ").");
+    }
+
+    @Override
+    public void update(WireArray initiator)
+    {
+       for (int i = 0; i < inputs.length; i++)
+       {
+           if (inputs[i] == initiator)
+           {
+               int inB = inBeginningIndex[i];
+//             int outB = outBeginningIndex TODO
+           }
+       }
+    }
+
+    // binary search
+    private int findLower(int[] sorted, int value)
+    {
+       int a = 0, b = sorted.length;
+       while (a < (b - 1))
+       {
+           int inspect = (a + b) >> 1;
+           if (sorted[inspect] == value)
+               return inspect;
+           if (sorted[inspect] > value)
+               b = inspect;
+           else
+               a = inspect;
+       }
+       return a;
+    }
+}