X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2FSplitter.java;fp=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2FSplitter.java;h=48db52d99416ee278b2ad4dbc6fa1fe30e9c150f;hb=a4c5cfb856026771dfcf31eb22434b8b6ff20ad4;hp=0000000000000000000000000000000000000000;hpb=7199371e42ba04d2daab9f8512fdf25bd5f5ff92;p=Mograsim.git diff --git a/era.mi/src/era/mi/logic/components/Splitter.java b/era.mi/src/era/mi/logic/components/Splitter.java new file mode 100644 index 00000000..48db52d9 --- /dev/null +++ b/era.mi/src/era/mi/logic/components/Splitter.java @@ -0,0 +1,53 @@ +package era.mi.logic.components; + +import era.mi.logic.Bit; +import era.mi.logic.WireArray; +import era.mi.logic.WireArrayObserver; + +public class Splitter implements WireArrayObserver +{ + private WireArray input; + private WireArray[] outputs; + + public Splitter(WireArray input, WireArray... outputs) + { + this.input = input; + this.outputs = outputs; + input.addObserver(this); + int length = 0; + for(WireArray out : outputs) + length += out.length(); + + if(input.length() != length) + throw new IllegalArgumentException("The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length()."); + } + + protected void compute() + { + int startIndex = 0; + Bit[] inputBits = input.getValues(); + for(int i = 0; i < outputs.length; i++) + { + Bit[] outputBits = new Bit[outputs[i].length()]; + System.arraycopy(inputBits, startIndex, outputBits, 0, outputs[i].length()); + outputs[i].feedSignals(outputBits); + startIndex += outputs[i].length(); + } + } + + public WireArray getInput() + { + return input; + } + + public WireArray[] getOutputs() + { + return outputs.clone(); + } + + @Override + public void update(WireArray initiator) + { + compute(); + } +}