Booleans in a MicroInstruction are now Mnemonics
authorFabian Stemmler <stemmler@in.tum.de>
Tue, 3 Sep 2019 21:10:52 +0000 (23:10 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Tue, 3 Sep 2019 21:10:52 +0000 (23:10 +0200)
Booleans are now expressed as members of a special MnemonicFamily that
only has two values. Booleans can now be named freely.

net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java
net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java
net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanImmediate.java [deleted file]
net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java
net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java
net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java

index 1e34762..da3e1e0 100644 (file)
@@ -13,7 +13,6 @@ import java.util.List;
 import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.machine.MemoryDefinition;
 import net.mograsim.machine.mi.parameters.BooleanClassification;
-import net.mograsim.machine.mi.parameters.BooleanImmediate;
 import net.mograsim.machine.mi.parameters.IntegerClassification;
 import net.mograsim.machine.mi.parameters.IntegerImmediate;
 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
@@ -110,11 +109,12 @@ public class MicroprogramMemoryParser
        {
                MnemonicFamily family = new MnemonicFamily(new MnemonicPair("ZERO", BitVector.SINGLE_0),
                                new MnemonicPair("ONE", BitVector.SINGLE_1));
-               MicroInstructionDefinition def = MicroInstructionDefinition.create(new BooleanClassification(),
+               BooleanClassification boolClass = new BooleanClassification("H", "L");
+               MicroInstructionDefinition def = MicroInstructionDefinition.create(boolClass,
                                new IntegerClassification(8), family);
                MicroprogramMemory memory = new StandardMicroprogramMemory(MemoryDefinition.create(4, 0, 16));
                for (int i = 0; i < 17; i++)
-                       memory.setCell(i, new StandardMicroInstruction(new BooleanImmediate(false),
+                       memory.setCell(i, new StandardMicroInstruction(boolClass.get(false),
                                        new IntegerImmediate(BigInteger.valueOf(i), 8), family.get(i % 2)));
                try
                {
index 1689cff..8ee5498 100644 (file)
@@ -1,9 +1,23 @@
 package net.mograsim.machine.mi.parameters;
 
+import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType;
 
-public class BooleanClassification implements ParameterClassification
+public class BooleanClassification extends MnemonicFamily
 {
+       String trueName, falseName;
+       public BooleanClassification(String trueName, String falseName)
+       {
+               super(new MnemonicPair(trueName, BitVector.SINGLE_1), new MnemonicPair(falseName, BitVector.SINGLE_0));
+               this.trueName = trueName;
+               this.falseName = falseName;
+       }
+       
+       public Mnemonic get(boolean value)
+       {
+               return get(value ? trueName : falseName);
+       }
+       
        @Override
        public ParameterType getExpectedType()
        {
@@ -15,10 +29,4 @@ public class BooleanClassification implements ParameterClassification
        {
                return 1;
        }
-       
-       @Override
-       public BooleanImmediate parse(String toParse)
-       {
-               return new BooleanImmediate("H".equals(toParse));
-       }
 }
diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanImmediate.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanImmediate.java
deleted file mode 100644 (file)
index 3d08840..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-package net.mograsim.machine.mi.parameters;
-
-import net.mograsim.logic.core.types.BitVector;
-
-public class BooleanImmediate implements MicroInstructionParameter
-{
-       private boolean value;
-       
-       public BooleanImmediate(boolean value)
-       {
-               this.value = value;
-       }
-       
-       @Override
-       public BitVector getValue()
-       {
-               return value ? BitVector.SINGLE_1 : BitVector.SINGLE_0;
-       }
-       
-       public boolean getBooleanValue()
-       {
-               return value;
-       }
-
-       @Override
-       public ParameterType getType()
-       {
-               return ParameterType.BOOLEAN_IMMEDIATE;
-       }
-       
-       @Override
-       public int hashCode()
-       {
-               final int prime = 31;
-               int result = 1;
-               result = prime * result + (value ? 1231 : 1237);
-               return result;
-       }
-
-       @Override
-       public boolean equals(Object obj)
-       {
-               if (this == obj)
-                       return true;
-               if (obj == null)
-                       return false;
-               if (!(obj instanceof BooleanImmediate))
-                       return false;
-               BooleanImmediate other = (BooleanImmediate) obj;
-               if (value != other.value)
-                       return false;
-               return true;
-       }
-       
-       @Override
-       public String toString()
-       {
-               return value ? "H" : "L";
-       }
-}
index 4633847..14bbe3b 100644 (file)
@@ -48,7 +48,7 @@ public final class Mnemonic implements MicroInstructionParameter
        @Override
        public ParameterType getType()
        {
-               return ParameterType.MNEMONIC;
+               return owner.getExpectedType();
        }
        
        public int ordinal()
index 7d21714..813857d 100644 (file)
@@ -5,19 +5,23 @@ import org.eclipse.jface.viewers.CheckboxCellEditor;
 import org.eclipse.jface.viewers.EditingSupport;
 import org.eclipse.jface.viewers.TableViewer;
 
+import net.mograsim.logic.core.types.Bit;
 import net.mograsim.machine.mi.MicroInstruction;
-import net.mograsim.machine.mi.parameters.BooleanImmediate;
+import net.mograsim.machine.mi.MicroInstructionDefinition;
+import net.mograsim.machine.mi.parameters.BooleanClassification;
 
 public class BooleanEditingSupport extends EditingSupport
 {
        private final CheckboxCellEditor editor;
+       private final BooleanClassification boolClass;
        private final TableViewer viewer;
        private final int index;
 
-       public BooleanEditingSupport(TableViewer viewer, int index)
+       public BooleanEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index)
        {
                super(viewer);
                this.viewer = viewer;
+               this.boolClass = (BooleanClassification) definition.getParameterClassification(index);
                editor = new CheckboxCellEditor(viewer.getTable());
                this.index = index;
        }
@@ -37,13 +41,13 @@ public class BooleanEditingSupport extends EditingSupport
        @Override
        protected Object getValue(Object element)
        {
-               return ((BooleanImmediate) ((MicroInstruction) element).getParameter(index)).getBooleanValue();
+               return ((MicroInstruction) element).getParameter(index).getValue().getMSBit(0).equals(Bit.ONE);
        }
 
        @Override
        protected void setValue(Object element, Object value)
        {
-               ((MicroInstruction) element).setParameter(index, new BooleanImmediate((Boolean) value));
+               ((MicroInstruction) element).setParameter(index, boolClass.get((Boolean) value));
                viewer.update(element, null);
        }
 
index 0af63e5..846d9ab 100644 (file)
@@ -126,7 +126,7 @@ public class InstructionView extends ViewPart
                switch (parameterClassification.getExpectedType())
                {
                case BOOLEAN_IMMEDIATE:
-                       return new BooleanEditingSupport(viewer, index);
+                       return new BooleanEditingSupport(viewer, miDef, index);
                case INTEGER_IMMEDIATE:
                        return new IntegerEditingSupport(viewer, miDef, index, new DisplaySettings(NumberType.DECIMAL));
                case MNEMONIC: