Timeline now passed via constructor
[Mograsim.git] / era.mi / src / era / mi / logic / components / gates / MultiInputGate.java
index b85939e..038e227 100644 (file)
@@ -1,63 +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;
+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 WireArray[] in;
-       protected WireArray out;
-       protected WireArrayInput outI;
+       protected ReadEnd[] in;
+       protected ReadWriteEnd out;
        protected final int length;
-       protected Operation op;
-       
-       protected MultiInputGate(int processTime, Operation op, WireArray out, WireArray... in)
+       protected MutationOperation op;
+
+       protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime);
+               super(timeline, processTime);
                this.op = op;
-               length = out.length;
+               length = out.length();
                this.in = in.clone();
-               if(in.length < 1)
+               if (in.length < 1)
                        throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length));
-               for(WireArray w : in)
+               for (ReadEnd w : in)
                {
-                       if(w.length != length)
+                       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()
+       public List<ReadEnd> getAllInputs()
        {
-               return Collections.unmodifiableList(Arrays.asList(in));
+               return List.of(in);
        }
 
        @Override
-       public List<WireArray> getAllOutputs()
+       public List<ReadWriteEnd> getAllOutputs()
        {
-               return Collections.unmodifiableList(Arrays.asList(out));
+               return List.of(out);
        }
-       
+
+       @Override
        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);
-       }
-       
-       protected interface Operation
-       {
-               public Bit[] execute(Bit[] a, Bit[] b);
+               BitVectorMutator mutator = BitVectorMutator.empty();
+               for (ReadEnd w : in)
+                       op.apply(mutator, w.getValues());
+               out.feedSignals(mutator.get());
        }
 }