X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2Fgates%2FMultiInputGate.java;fp=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2Fcomponents%2Fgates%2FMultiInputGate.java;h=0b4a5d097b3eed8613685d185d4dfd0e0ece251f;hb=5606ceefa2c360772194c85ed884e5f8f06f36aa;hp=0000000000000000000000000000000000000000;hpb=002110424653b282ab9c7ea4b12f967d59e5f66a;p=Mograsim.git diff --git a/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java b/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java new file mode 100644 index 00000000..0b4a5d09 --- /dev/null +++ b/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java @@ -0,0 +1,54 @@ +package era.mi.logic.components.gates; + +import java.util.List; + +import era.mi.logic.components.BasicComponent; +import era.mi.logic.types.BitVector.BitVectorMutator; +import era.mi.logic.types.MutationOperation; +import era.mi.logic.wires.Wire.WireEnd; + +public abstract class MultiInputGate extends BasicComponent +{ + protected WireEnd[] in; + protected WireEnd out; + protected final int length; + protected MutationOperation op; + + protected MultiInputGate(int processTime, MutationOperation op, WireEnd out, WireEnd... in) + { + super(processTime); + this.op = op; + length = out.length(); + this.in = in.clone(); + if (in.length < 1) + throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length)); + for (WireEnd w : in) + { + if (w.length() != length) + throw new IllegalArgumentException("All wires connected to the gate must be of uniform length."); + w.addObserver(this); + } + this.out = out; + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + + @Override + protected void compute() + { + BitVectorMutator mutator = BitVectorMutator.empty(); + for (WireEnd w : in) + op.apply(mutator, w.getValues()); + out.feedSignals(mutator.get()); + } +}