.add("ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS", "EXOR", "EXNOR").build();
private static final MnemonicFamily am2901DestInstructions = new MnemonicFamilyBuilder(3).addX()
.add("QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD", "RAMQU", "RAMU").setDefault("NOP").build();
- private static final IntegerClassification register = new IntegerClassification(0, 4);
+ private static final IntegerClassification register = new IntegerClassification(4);
private static final BooleanClassification registerSelect = new BooleanClassification("MR", "IR");
private static final BooleanClassification abus = new BooleanClassification(true, "H", "AB");
private static final BooleanClassification dbus = new BooleanClassification(true, "H", "DB");
.add("JZ", "CJS", "JMAP", "CJP", "PUSH", "JSRP", "CJV", "JRP", "RFCT", "RPCT", "CRTN", "CJPP", "LDCT", "LOOP", "CONT", "TWB")
.setDefault("CONT").build();
- private static final IntegerClassification constant_12bit = new IntegerClassification(0, 12);
- private static final IntegerClassification constant_16bit = new IntegerClassification(0, 16);
+ private static final IntegerClassification constant_12bit = new IntegerClassification(12);
+ private static final IntegerClassification constant_16bit = new IntegerClassification(16);
private static final BooleanClassification hE = new BooleanClassification(true, "H", "E");
private static final BooleanClassification hI = new BooleanClassification(true, "H", "I");
private static final BooleanClassification hL = new BooleanClassification(true, "H", "L");
package net.mograsim.machine.mi.parameters;
-import net.mograsim.logic.core.types.BitVector;
+import static net.mograsim.logic.core.types.BitVector.SINGLE_0;
+import static net.mograsim.logic.core.types.BitVector.SINGLE_1;
+import static net.mograsim.logic.core.types.BitVector.SINGLE_X;
+
import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType;
public class BooleanClassification extends MnemonicFamily
public BooleanClassification(boolean defaultValue, String trueName, String falseName)
{
- super(defaultValue ? trueName : falseName, new MnemonicPair("X", BitVector.SINGLE_0),
- new MnemonicPair(trueName, BitVector.SINGLE_1), new MnemonicPair(falseName, BitVector.SINGLE_0));
+ super(defaultValue ? trueName : falseName, new MnemonicPair("X", SINGLE_X), new MnemonicPair(trueName, SINGLE_1),
+ new MnemonicPair(falseName, SINGLE_0));
this.trueName = trueName;
this.falseName = falseName;
}
public BooleanClassification(String trueName, String falseName)
{
- super("X", new MnemonicPair("X", BitVector.SINGLE_0), new MnemonicPair(trueName, BitVector.SINGLE_1),
- new MnemonicPair(falseName, BitVector.SINGLE_0));
+ super("X", new MnemonicPair("X", SINGLE_X), new MnemonicPair(trueName, SINGLE_1), new MnemonicPair(falseName, SINGLE_0));
this.trueName = trueName;
this.falseName = falseName;
}
private final int bits;
private final IntegerImmediate defaultValue;
+ /**
+ * The default value is set to X.
+ */
+ public IntegerClassification(int bits)
+ {
+ this.bits = bits;
+ this.defaultValue = new IntegerImmediate(this, null, bits);
+ }
+
public IntegerClassification(int defaultValue, int bits)
{
this.bits = bits;
- this.defaultValue = new IntegerImmediate(BitVector.from(defaultValue, bits));
+ this.defaultValue = new IntegerImmediate(this, BitVector.from(defaultValue, bits));
}
@Override
@Override
public IntegerImmediate parse(String toParse)
{
- return new IntegerImmediate(new BigInteger(toParse), bits);
+ return new IntegerImmediate(this, toParse.equals("X") ? null : new BigInteger(toParse), bits);
}
@Override
package net.mograsim.machine.mi.parameters;
+import static net.mograsim.logic.core.types.Bit.X;
+
import java.math.BigInteger;
import net.mograsim.logic.core.types.BitVector;
public final class IntegerImmediate implements MicroInstructionParameter
{
+ private IntegerClassification owner;
private BitVector value;
- public IntegerImmediate(BigInteger value, int bits)
+ /**
+ * <code>value == null</code> means a vector consisting only of X
+ */
+ public IntegerImmediate(IntegerClassification owner, BigInteger value, int bits)
{
- this.value = BitVector.from(value, bits);
+ this(owner, value == null ? BitVector.of(X, bits) : BitVector.from(value, bits));
}
- public IntegerImmediate(BitVector value)
+ public IntegerImmediate(IntegerClassification owner, BitVector value)
{
+ this.owner = owner;
this.value = value;
}
return true;
}
+ public boolean isX()
+ {
+ return value.equals(BitVector.of(X, value.length()));
+ }
+
/**
- * @return The value of this IntegerImmediate as an unsigned BigInteger
+ * @return The value of this IntegerImmediate as an unsigned BigInteger, or null, if the value is X.
*/
public BigInteger getValueAsBigInteger()
{
- return value.getUnsignedValue();
+ return isX() ? null : value.getUnsignedValue();
}
@Override
public String toString()
{
- return getValueAsBigInteger().toString();
+ return isX() ? "X" : getValueAsBigInteger().toString();
}
@Override
public boolean isDefault()
{
- return value.getSignedValueLong() == 0;
+ return equals(owner.getDefault());
}
}
package net.mograsim.machine.mi.parameters;
+import static net.mograsim.logic.core.types.Bit.X;
+
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
-import net.mograsim.logic.core.types.Bit;
import net.mograsim.logic.core.types.BitVector;
import net.mograsim.machine.MachineException;
import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType;
public MnemonicFamilyBuilder addX()
{
- pairs.add(new MnemonicPair("X", BitVector.of(Bit.ZERO, bits)));
+ pairs.add(new MnemonicPair("X", BitVector.of(X, bits)));
return this;
}
protected final CellEditor editor;
private final DisplaySettings displaySettings;
- public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings)
+ public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings, boolean allowX)
{
super(viewer);
this.viewer = viewer;
this.displaySettings = displaySettings;
editor = new TextCellEditor(viewer.getTable());
- editor.setValidator(new NumberCellEditorValidator());
+ editor.setValidator(new NumberCellEditorValidator(allowX));
}
@Override
@Override
final protected Object getValue(Object element)
{
- return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType(), getBitLength(element));
+ BigInteger bi = getAsBigInteger(element);
+ return bi == null ? "X" : AsmNumberUtil.toString(bi, displaySettings.getDataNumberType(), getBitLength(element));
}
@Override
final protected void setValue(Object element, Object userInput)
{
- try
- {
- setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput));
- }
- catch (@SuppressWarnings("unused") NumberFormatException e)
- {
- setAsBigInteger(element, BigInteger.valueOf(0));
- }
+ if (userInput.equals("X") || userInput.equals("x"))
+ setAsBigInteger(element, null);
+ else
+ try
+ {
+ setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput));
+ }
+ catch (@SuppressWarnings("unused") NumberFormatException e)
+ {
+ setAsBigInteger(element, BigInteger.valueOf(0));
+ }
viewer.update(element, null);
}
+ /**
+ * value==null means X, if this {@link NumberCellEditingSupport} was created with allowX==true
+ */
protected abstract void setAsBigInteger(Object element, BigInteger value);
+ /**
+ * null means X, if this {@link NumberCellEditingSupport} was created with allowX==true
+ */
protected abstract BigInteger getAsBigInteger(Object element);
protected abstract int getBitLength(Object element);
public class NumberCellEditorValidator implements ICellEditorValidator
{
+ private final boolean allowX;
+
+ public NumberCellEditorValidator(boolean allowX)
+ {
+ this.allowX = allowX;
+ }
@Override
public String isValid(Object value)
{
- return AsmNumberUtil.NumberType.NONE.equals(AsmNumberUtil.getType((String) value)) ? (String) value + "is not a valid number"
+ return !(allowX && value.equals("X")) && AsmNumberUtil.NumberType.NONE.equals(AsmNumberUtil.getType((String) value))
+ ? (String) value + " is not a valid number"
: null;
}
-
-}
+}
\ No newline at end of file
@Override
public String getText(Object element)
{
- return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType(), getBitLength(element));
+ BigInteger bi = getAsBigInteger(element);
+ return bi == null ? "X" : AsmNumberUtil.toString(bi, displaySettings.getDataNumberType(), getBitLength(element));
}
public abstract BigInteger getAsBigInteger(Object element);
{
public MemoryCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings)
{
- super(viewer, displaySettings);
+ // TODO maybe allow X here too?
+ super(viewer, displaySettings, false);
}
@Override
public IntegerEditingSupport(TableViewer viewer, MicroInstructionDefinition miDef, int index, DisplaySettings displaySettings,
InstructionTableContentProvider provider)
{
- super(viewer, displaySettings);
+ super(viewer, displaySettings, true);
classification = (IntegerClassification) miDef.getParameterClassifications()[index];
this.index = index;
this.provider = provider;
{
InstructionTableRow row = ((InstructionTableRow) element);
MicroInstructionParameter[] params = row.data.getCell(row.address).getParameters();
- IntegerImmediate newParam = new IntegerImmediate(value, classification.getExpectedBits());
+ IntegerImmediate newParam = new IntegerImmediate(classification, value, classification.getExpectedBits());
if (params[index].equals(newParam))
return;
params[index] = newParam;