From 21f5ad7261fa02502dceafd7dd1aa6f1718ef67b Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Tue, 27 Aug 2019 15:46:24 +0200 Subject: [PATCH] Reworked Parameter Classifications --- .../machine/MicroInstructionDefinition.java | 5 +++- .../mi/parameters/BooleanClassification.java | 18 +++++++++++ .../mi/parameters/IntegerClassification.java | 25 ++++++++++++++++ .../machine/mi/parameters/Mnemonic.java | 6 ++++ .../machine/mi/parameters/MnemonicFamily.java | 30 +++++++++++++++---- .../parameters/ParameterClassification.java | 10 ++++++- .../parameters/SimpleTypeClassification.java | 25 ---------------- 7 files changed, 86 insertions(+), 33 deletions(-) create mode 100644 net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java create mode 100644 net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java delete mode 100644 net.mograsim.machine/src/net/mograsim/machine/mi/parameters/SimpleTypeClassification.java diff --git a/net.mograsim.machine/src/net/mograsim/machine/MicroInstructionDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MicroInstructionDefinition.java index 33a970c5..63134a0e 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/MicroInstructionDefinition.java +++ b/net.mograsim.machine/src/net/mograsim/machine/MicroInstructionDefinition.java @@ -13,6 +13,9 @@ public interface MicroInstructionDefinition /** * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition. */ - public int size(); + public default int size() + { + return getParameterClassifications().length; + } } 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 new file mode 100644 index 00000000..abe552f9 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java @@ -0,0 +1,18 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class BooleanClassification implements ParameterClassification +{ + @Override + public ParameterType getExpectedType() + { + return ParameterType.BOOLEAN_IMMEDIATE; + } + + @Override + public int getExpectedBits() + { + return 1; + } +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java new file mode 100644 index 00000000..d5ba9640 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java @@ -0,0 +1,25 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class IntegerClassification implements ParameterClassification +{ + private final int bits; + + public IntegerClassification(int bits) + { + this.bits = bits; + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.INTEGER_IMMEDIATE; + } + + @Override + public int getExpectedBits() + { + return bits; + } +} 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 feeb88e8..cca106ed 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 @@ -65,4 +65,10 @@ public final class Mnemonic implements MicroInstructionParameter { return ParameterType.MNEMONIC; } + + @Override + public String toString() + { + return text; + } } diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java index aa07f808..62785be6 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java @@ -10,21 +10,23 @@ public class MnemonicFamily implements ParameterClassification { private final Mnemonic[] values; private final Map byText; - private final int vectorLenght; + private final int vectorLength; public MnemonicFamily(Mnemonic... values) { this.values = values; if(values.length == 0) - vectorLenght = 0; + vectorLength = 0; else { - vectorLenght = values[0].getValue().width(); + vectorLength = values[0].getValue().width(); for(int i = 1; i < values.length; i++) - if(values[i].getValue().width() != vectorLenght) + if(values[i].getValue().width() != vectorLength) throw new IllegalArgumentException("MnemonicFamily is not of uniform vector length!"); } byText = Arrays.stream(values).collect(Collectors.toMap(m -> m.getText(), m -> m)); + if(values.length != byText.keySet().size()) + throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!"); } public Mnemonic[] getValues() @@ -45,6 +47,11 @@ public class MnemonicFamily implements ParameterClassification return false; } + public boolean contains(String value) + { + return byText.keySet().contains(value); + } + public int size() { return values.length; @@ -52,13 +59,13 @@ public class MnemonicFamily implements ParameterClassification public int getVectorLength() { - return vectorLenght; + return vectorLength; } @Override public boolean conforms(MicroInstructionParameter param) { - return param instanceof Mnemonic ? contains((Mnemonic) param) : false; + return ParameterClassification.super.conforms(param) && (param instanceof Mnemonic ? contains((Mnemonic) param) : false); } @Override @@ -66,4 +73,15 @@ public class MnemonicFamily implements ParameterClassification { return ParameterType.MNEMONIC; } + + @Override + public int getExpectedBits() + { + return vectorLength; + } + + public String[] getStringValues() + { + return byText.keySet().toArray(new String[values.length]); + } } diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java index b9362a09..f98def90 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java @@ -8,10 +8,18 @@ public interface ParameterClassification * Determines whether a {@link MicroInstructionParameter} is part of this class of parameters. * @return true if the classification contains the Parameter, false otherwise */ - public boolean conforms(MicroInstructionParameter param); + public default boolean conforms(MicroInstructionParameter param) + { + return param.getType().equals(getExpectedType()) && param.getValue().width() == getExpectedBits(); + } /** * @return The type of the parameters in this classification. */ public ParameterType getExpectedType(); + + /** + * @return The number of bits of the parameters in this classification. + */ + public int getExpectedBits(); } diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/SimpleTypeClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/SimpleTypeClassification.java deleted file mode 100644 index c6687aed..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/SimpleTypeClassification.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class SimpleTypeClassification implements ParameterClassification -{ - private ParameterType expectedType; - - public SimpleTypeClassification(ParameterType expectedType) - { - this.expectedType = expectedType; - } - - @Override - public boolean conforms(MicroInstructionParameter param) - { - return expectedType.equals(param.getType()); - } - - @Override - public ParameterType getExpectedType() - { - return expectedType; - } -} -- 2.17.1