From: Fabian Stemmler <stemmler@in.tum.de>
Date: Tue, 3 Sep 2019 21:10:52 +0000 (+0200)
Subject: Booleans in a MicroInstruction are now Mnemonics
X-Git-Url: https://mograsim.net/gitweb/?a=commitdiff_plain;h=62d703a95cafb4e98b4c3ffc305fb0224a6aec71;p=Mograsim.git

Booleans in a MicroInstruction are now Mnemonics

Booleans are now expressed as members of a special MnemonicFamily that
only has two values. Booleans can now be named freely.
---

diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java
index 1e34762b..da3e1e08 100644
--- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java
+++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java
@@ -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
 		{
diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java
index 1689cffb..8ee54985 100644
--- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java
+++ b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java
@@ -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
index 3d08840f..00000000
--- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanImmediate.java
+++ /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";
-	}
-}
diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java
index 46338477..14bbe3be 100644
--- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java
+++ b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java
@@ -48,7 +48,7 @@ public final class Mnemonic implements MicroInstructionParameter
 	@Override
 	public ParameterType getType()
 	{
-		return ParameterType.MNEMONIC;
+		return owner.getExpectedType();
 	}
 	
 	public int ordinal()
diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java
index 7d217146..813857d9 100644
--- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java
+++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java
@@ -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);
 	}
 
diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java
index 0af63e50..846d9abf 100644
--- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java
+++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java
@@ -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: