Timeline now passed via constructor
[Mograsim.git] / era.mi / src / era / mi / logic / components / gates / MultiInputGate.java
index 7d0e485..e9920ba 100644 (file)
@@ -3,25 +3,28 @@ package era.mi.logic.components.gates;
 import java.util.List;\r
 \r
 import era.mi.logic.components.BasicComponent;\r
-import era.mi.logic.types.Bit;\r
-import era.mi.logic.wires.Wire.WireEnd;\r
+import era.mi.logic.timeline.Timeline;\r
+import era.mi.logic.types.BitVector.BitVectorMutator;\r
+import era.mi.logic.types.MutationOperation;\r
+import era.mi.logic.wires.Wire.ReadEnd;\r
+import era.mi.logic.wires.Wire.ReadWriteEnd;\r
 \r
 public abstract class MultiInputGate extends BasicComponent\r
 {\r
-       protected WireEnd[] in;\r
-       protected WireEnd out;\r
+       protected ReadEnd[] in;\r
+       protected ReadWriteEnd out;\r
        protected final int length;\r
-       protected Operation op;\r
+       protected MutationOperation op;\r
 \r
-       protected MultiInputGate(int processTime, Operation op, WireEnd out, WireEnd... in)\r
+       protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)\r
        {\r
-               super(processTime);\r
+               super(timeline, processTime);\r
                this.op = op;\r
                length = out.length();\r
                this.in = in.clone();\r
                if (in.length < 1)\r
                        throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length));\r
-               for (WireEnd w : in)\r
+               for (ReadEnd w : in)\r
                {\r
                        if (w.length() != length)\r
                                throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");\r
@@ -31,13 +34,13 @@ public abstract class MultiInputGate extends BasicComponent
        }\r
 \r
        @Override\r
-       public List<WireEnd> getAllInputs()\r
+       public List<ReadEnd> getAllInputs()\r
        {\r
                return List.of(in);\r
        }\r
 \r
        @Override\r
-       public List<WireEnd> getAllOutputs()\r
+       public List<ReadWriteEnd> getAllOutputs()\r
        {\r
                return List.of(out);\r
        }\r
@@ -45,14 +48,9 @@ public abstract class MultiInputGate extends BasicComponent
        @Override\r
        protected void compute()\r
        {\r
-               Bit[] result = in[0].getValues();\r
-               for (int i = 1; i < in.length; i++)\r
-                       result = op.execute(result, in[i].getValues());\r
-               out.feedSignals(result);\r
-       }\r
-\r
-       protected interface Operation\r
-       {\r
-               public Bit[] execute(Bit[] a, Bit[] b);\r
+               BitVectorMutator mutator = BitVectorMutator.empty();\r
+               for (ReadEnd w : in)\r
+                       op.apply(mutator, w.getValues());\r
+               out.feedSignals(mutator.get());\r
        }\r
 }\r