X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2FMapper.java;fp=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2FMapper.java;h=ef3f235eed511a6e0ef2c3dc01c960a694305ddc;hb=49f569b513c36e8ad421fd5a547bf34bd830652a;hp=0000000000000000000000000000000000000000;hpb=670a82cafe6435b2cdaf02e86701fedd14970c1c;p=Mograsim.git 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 index 00000000..ef3f235e --- /dev/null +++ b/era.mi/src/era/mi/logic/components/Mapper.java @@ -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; + } +}