X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2Fparameters%2FMnemonicFamily.java;h=fbdaf764ac2b87d18d30da6e847c794ce4570161;hb=dfc725abca213bdd76fc97fdeb3310f095131f95;hp=14bffbb6e9df566f401d9e561b4edb3ff7362e02;hpb=e3e5c330486368586ac604d90d89596c083afea9;p=Mograsim.git diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java index 14bffbb6..fbdaf764 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java @@ -1,10 +1,15 @@ 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.BitVector; +import net.mograsim.machine.MachineException; import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; public class MnemonicFamily implements ParameterClassification @@ -15,105 +20,17 @@ public class MnemonicFamily implements ParameterClassification private Map byText; private int vectorLength; - public MnemonicFamily(String defaultValueName, String... names) - { - this(false, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String... names) - { - this(reverse, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); - } - - public MnemonicFamily(String defaultValueName, int bits, String... names) - { - this(false, defaultValueName, bits, 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++) - { - 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 defaultValueName, String[] names, long[] values, int bits) - { - this(false, defaultValueName, names, values, bits); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, long[] values, int bits) - { - 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++) - { - 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 defaultValueName, String[] names, BitVector[] values) - { - this(false, defaultValueName, names, values); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, BitVector[] values) - { - 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(String defaultValueName, MnemonicPair... values) + MnemonicFamily(String defaultValueName, MnemonicPair... values) { + if (values.length == 0) + throw new MachineException("Mnemonics must not be empty!"); this.values = new Mnemonic[values.length]; this.stringValues = new String[values.length]; setup(values); - int defaultValueIndex = -1; + // if no valid defaultValue is specified, pick first value as default + int defaultValueIndex = 0; for (int i = 0; i < values.length; i++) if (stringValues[i].equals(defaultValueName)) { @@ -123,14 +40,6 @@ public class MnemonicFamily implements ParameterClassification 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++) - 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++) @@ -258,4 +167,121 @@ public class MnemonicFamily implements ParameterClassification this.value = value; } } + + public static class MnemonicFamilyBuilder + { + private final List pairs; + private final int bits; + private String defaultValue; + + public MnemonicFamilyBuilder(int bits) + { + this.pairs = new LinkedList<>(); + this.bits = bits; + } + + public MnemonicFamilyBuilder addX() + { + pairs.add(new MnemonicPair("X", BitVector.of(X, bits))); + return this; + } + + public MnemonicFamilyBuilder add(MnemonicPair... pairs) + { + this.pairs.addAll(List.of(pairs)); + return this; + } + + /** + * Adds a name with its corresponding value to the {@link MnemonicFamily} + * + * @return this {@link MnemonicFamilyBuilder} + */ + public MnemonicFamilyBuilder add(String name, BitVector value) + { + add(new MnemonicPair(name, value)); + return this; + } + + /** + * Adds names with their corresponding values to the {@link MnemonicFamily} + * + * @param names The names to be added to the {@link MnemonicFamily} + * @param values The values as {@link BitVector}s + * @return this {@link MnemonicFamilyBuilder} + */ + public MnemonicFamilyBuilder add(String name, long value) + { + add(new MnemonicPair(name, BitVector.from(value, bits))); + return this; + } + + /** + * Adds names with their corresponding values to the {@link MnemonicFamily} + * + * @param names The names to be added to the {@link MnemonicFamily} + * @param values The values as {@link BitVector}s + * @return this {@link MnemonicFamilyBuilder} + */ + public MnemonicFamilyBuilder add(String names[], BitVector[] values) + { + if (names.length != values.length) + throw new IllegalArgumentException("Cannot add Mnemonics! Amount of names does not match amount of values!"); + for (int i = 0; i < names.length; i++) + add(new MnemonicPair(names[i], values[i])); + return this; + } + + /** + * Adds names with their corresponding values (converted to a BitVector) to the {@link MnemonicFamily} + * + * @param names The names to be added to the {@link MnemonicFamily} + * @param values The values to be converted to {@link BitVector}s with a given amount of {@link MnemonicFamilyBuilder#bits} + * @return this {@link MnemonicFamilyBuilder} + */ + public MnemonicFamilyBuilder add(String names[], long values[]) + { + if (names.length != values.length) + throw new IllegalArgumentException("Cannot add Mnemonics! Amount of names does not match amount of values!"); + for (int i = 0; i < names.length; i++) + add(new MnemonicPair(names[i], BitVector.from(values[i], bits))); + return this; + } + + /** + * Adds names to the {@link MnemonicFamily}; The corresponding {@link BitVector} value to a name is the value of its index + * + * @param names The names to be added to the {@link MnemonicFamily} + * @return this {@link MnemonicFamilyBuilder} + */ + public MnemonicFamilyBuilder add(String... names) + { + for (int i = 0; i < names.length; i++) + add(names[i], i); + return this; + } + + /** + * Sets the name of the default {@link Mnemonic} of this {@link MnemonicFamily} + */ + public MnemonicFamilyBuilder setDefault(String defaultValue) + { + this.defaultValue = defaultValue; + return this; + } + + /** + * Sets the name of the default {@link Mnemonic} of this {@link MnemonicFamily} to "X" + */ + public MnemonicFamilyBuilder setXDefault() + { + this.defaultValue = "X"; + return this; + } + + public MnemonicFamily build() + { + return new MnemonicFamily(defaultValue, pairs.toArray(new MnemonicPair[pairs.size()])); + } + } }