Fixed a bug causing CoreMemories using their own memories
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / mi / MicroInstructionDefinition.java
index 229c761..5221e3e 100644 (file)
@@ -1,13 +1,16 @@
 package net.mograsim.machine.mi;
 
 import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Optional;
 
+import net.mograsim.logic.core.types.Bit;
 import net.mograsim.machine.mi.parameters.IntegerClassification;
 import net.mograsim.machine.mi.parameters.IntegerImmediate;
 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
+import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType;
 import net.mograsim.machine.mi.parameters.MnemonicFamily;
 import net.mograsim.machine.mi.parameters.ParameterClassification;
-import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType;
 
 public interface MicroInstructionDefinition
 {
@@ -15,13 +18,12 @@ public interface MicroInstructionDefinition
         * @return The {@link ParameterClassification}s of which a MicroInstruction is composed.
         */
        public ParameterClassification[] getParameterClassifications();
-       
+
        /**
         * @throws IndexOutOfBoundsException
         */
        public ParameterClassification getParameterClassification(int index);
-       
-       
+
        /**
         * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition.
         */
@@ -29,18 +31,26 @@ public interface MicroInstructionDefinition
        {
                return getParameterClassifications().length;
        }
-       
-       public default MicroInstruction createDefaultInstruction()
+
+       /**
+        * @return The amount of {@link Bit}s in a {@link MicroInstruction} that follows this definition.
+        */
+       public default int sizeInBits()
+       {
+               return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b);
+       }
+
+       public default MicroInstruction createDefaultInstruction(Runnable updateCallback)
        {
                int size = size();
                MicroInstructionParameter[] params = new MicroInstructionParameter[size];
                ParameterClassification[] classes = getParameterClassifications();
-               for(int i = 0; i < size; i++)
+               for (int i = 0; i < size; i++)
                {
                        MicroInstructionParameter newParam;
                        ParameterClassification classification = classes[i];
                        ParameterType type = classification.getExpectedType();
-                       switch(type)
+                       switch (type)
                        {
                        case BOOLEAN_IMMEDIATE:
                        case MNEMONIC:
@@ -54,11 +64,8 @@ public interface MicroInstructionDefinition
                        }
                        params[i] = newParam;
                }
-               return new StandardMicroInstruction(params);
-       }
-       
-       public static MicroInstructionDefinition create(ParameterClassification... classes)
-       {
-               return new StandardMicroInstructionDefinition(classes);
+               return new StandardMicroInstruction(updateCallback, params);
        }
+
+       public Optional<String> getParameterDescription(int index);
 }
\ No newline at end of file