X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2Fparameters%2FMnemonicFamily.java;h=d6906fb3b6ae486525f6c750be07b1004ee7d6d3;hb=8bed58cd47f4e53a0a83e066d38864aa6875502f;hp=f4343bd0d2a95ea85122daf415e6345b9ed657d0;hpb=91f076c44a4f00786343beb923ab01894672416f;p=Mograsim.git 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 f4343bd0..d6906fb3 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,113 +10,145 @@ import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterTyp public class MnemonicFamily implements ParameterClassification { private final Mnemonic[] values; + private final Mnemonic defaultValue; private final String[] stringValues; private Map byText; private int vectorLength; - - public MnemonicFamily(String... names) + + public MnemonicFamily(String defaultValueName, String... names) { - this(false, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); + this(false, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); } - - public MnemonicFamily(boolean reverse, String... names) + + public MnemonicFamily(boolean reverse, String defaultValueName, String... names) { - this(reverse, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); + this(reverse, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); } - - public MnemonicFamily(int bits, String... names) + + public MnemonicFamily(String defaultValueName, int bits, String... names) { - this(false, bits, names); + this(false, defaultValueName, bits, names); } - - public MnemonicFamily(boolean reverse, int bits, String... names) + + public MnemonicFamily(boolean reverse, String defaultValueName, int bits, String... names) { this.values = new Mnemonic[names.length]; this.stringValues = new String[names.length]; BitVector[] values = new BitVector[names.length]; - for(int i = 0; i < names.length; i++) + for (int i = 0; i < names.length; i++) { values[i] = BitVector.from(i, bits); } - + setup(names, values, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; } - - public MnemonicFamily(String[] names, long[] values, int bits) + + public MnemonicFamily(String defaultValueName, String[] names, long[] values, int bits) { - this(false, names, values, bits); + this(false, defaultValueName, names, values, bits); } - - public MnemonicFamily(boolean reverse, String[] names, long[] values, int bits) + + public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, long[] values, int bits) { - if(names.length != values.length) + if (names.length != values.length) throw new IllegalArgumentException(); this.values = new Mnemonic[values.length]; this.stringValues = new String[values.length]; BitVector[] vectors = new BitVector[values.length]; - - for(int i = 0; i < vectors.length; i++) + + for (int i = 0; i < vectors.length; i++) { vectors[i] = BitVector.from(values[i], bits); } - + setup(names, vectors, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; } - - public MnemonicFamily(String[] names, BitVector[] values) + + public MnemonicFamily(String defaultValueName, String[] names, BitVector[] values) { - this(false, names, values); + this(false, defaultValueName, names, values); } - - public MnemonicFamily(boolean reverse, String[] names, BitVector[] values) + + public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, BitVector[] values) { - if(names.length != values.length) + if (names.length != values.length) throw new IllegalArgumentException(); this.values = new Mnemonic[values.length]; this.stringValues = new String[values.length]; - + setup(names, values, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; } - - public MnemonicFamily(MnemonicPair... values) - { - this(false, values); - } - - public MnemonicFamily(boolean reverse, MnemonicPair... values) + + public MnemonicFamily(String defaultValueName, MnemonicPair... values) { this.values = new Mnemonic[values.length]; this.stringValues = new String[values.length]; - + setup(values); + + int defaultValueIndex = -1; + for (int i = 0; i < values.length; i++) + if (stringValues[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; } - + private void setup(String[] names, BitVector[] values, boolean reverse) { MnemonicPair[] mnemonics = new MnemonicPair[values.length]; - for(int i = 0; i < values.length; i++) + for (int i = 0; i < values.length; i++) mnemonics[i] = new MnemonicPair(names[i], reverse ? values[i].reverse() : values[i]); setup(mnemonics); } - + private void setup(MnemonicPair[] values) { - for(int i = 0; i < values.length; i++) + for (int i = 0; i < values.length; i++) { this.values[i] = createMnemonic(values[i], i); this.stringValues[i] = values[i].name; } - if(values.length == 0) + if (values.length == 0) vectorLength = 0; else { vectorLength = values[0].value.length(); - for(int i = 1; i < values.length; i++) - if(values[i].value.length() != vectorLength) + for (int i = 1; i < values.length; i++) + if (values[i].value.length() != vectorLength) throw new IllegalArgumentException("MnemonicFamily is not of uniform vector length!"); } byText = Arrays.stream(this.values).collect(Collectors.toMap(m -> m.getText(), m -> m)); - if(values.length != byText.keySet().size()) + if (values.length != byText.keySet().size()) throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!"); } @@ -129,35 +161,41 @@ public class MnemonicFamily implements ParameterClassification { return values.clone(); } - + public Mnemonic get(int ordinal) { return values[ordinal]; } - + public Mnemonic get(String text) { return byText.get(text); } - + + @Override + public MicroInstructionParameter getDefault() + { + return defaultValue; + } + public boolean contains(Mnemonic m) { - if(m != null) + if (m != null) return m.owner == this; else return false; } - + public boolean contains(String value) { return byText.keySet().contains(value); } - + public int size() { return values.length; } - + public int getVectorLength() { return vectorLength; @@ -185,7 +223,7 @@ public class MnemonicFamily implements ParameterClassification { return stringValues.clone(); } - + @Override public int hashCode() { @@ -200,12 +238,12 @@ public class MnemonicFamily implements ParameterClassification { return this == obj; } - + @Override public Mnemonic parse(String toParse) { Mnemonic parsed = get(toParse); - if(parsed == null) + if (parsed == null) throw new UnknownMnemonicException(toParse); return parsed; } @@ -214,7 +252,7 @@ public class MnemonicFamily implements ParameterClassification { public final String name; public final BitVector value; - + public MnemonicPair(String name, BitVector value) { this.name = name;