Timeline now passed via constructor
[Mograsim.git] / era.mi / src / era / mi / logic / components / gates / MultiInputGate.java
index f7af52e..038e227 100644 (file)
@@ -1,55 +1,56 @@
 package era.mi.logic.components.gates;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
-import era.mi.logic.Bit;
 import era.mi.logic.components.BasicComponent;
-import era.mi.logic.wires.WireArray;
-import era.mi.logic.wires.WireArray.WireArrayInput;
-
-public abstract class MultiInputGate extends BasicComponent {
-       protected WireArray[] in;
-       protected WireArray out;
-       protected WireArrayInput outI;
+import era.mi.logic.timeline.Timeline;
+import era.mi.logic.types.BitVector.BitVectorMutator;
+import era.mi.logic.types.MutationOperation;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+
+public abstract class MultiInputGate extends BasicComponent
+{
+       protected ReadEnd[] in;
+       protected ReadWriteEnd out;
        protected final int length;
-       protected Operation op;
+       protected MutationOperation op;
 
-       protected MultiInputGate(int processTime, Operation op, WireArray out, WireArray... in) {
-               super(processTime);
+       protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
+       {
+               super(timeline, processTime);
                this.op = op;
-               length = out.length;
+               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 (WireArray w : in) {
-                       if (w.length != length)
+               for (ReadEnd 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;
-               outI = out.createInput();
        }
 
        @Override
-       public List<WireArray> getAllInputs() {
-               return Collections.unmodifiableList(Arrays.asList(in));
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(in);
        }
 
        @Override
-       public List<WireArray> getAllOutputs() {
-               return Collections.unmodifiableList(Arrays.asList(out));
-       }
-
-       protected void compute() {
-               Bit[] result = in[0].getValues();
-               for (int i = 1; i < in.length; i++)
-                       result = op.execute(result, in[i].getValues());
-               outI.feedSignals(result);
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
        }
 
-       protected interface Operation {
-               public Bit[] execute(Bit[] a, Bit[] b);
+       @Override
+       protected void compute()
+       {
+               BitVectorMutator mutator = BitVectorMutator.empty();
+               for (ReadEnd w : in)
+                       op.apply(mutator, w.getValues());
+               out.feedSignals(mutator.get());
        }
 }