From: Fabian Stemmler Date: Thu, 5 Sep 2019 15:53:29 +0000 (+0200) Subject: Refactored MicroprogramMemory to MicroInstructionMemory X-Git-Url: https://mograsim.net/gitweb/?a=commitdiff_plain;h=2fe86b9ccd64afbe485b8290db9f11b93d9943bf;p=Mograsim.git Refactored MicroprogramMemory to MicroInstructionMemory --- diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java new file mode 100644 index 00000000..6d02f7be --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java @@ -0,0 +1,12 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.Memory; +import net.mograsim.machine.MemoryDefinition; + +public interface MicroInstructionMemory extends Memory +{ + public static MicroInstructionMemory create(MemoryDefinition def) + { + return new StandardMicroInstructionMemory(def); + } +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java new file mode 100644 index 00000000..674e4185 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java @@ -0,0 +1,28 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.MachineException; + +public class MicroInstructionMemoryParseException extends MachineException +{ + + /** + * + */ + private static final long serialVersionUID = 6820101808901789906L; + + public MicroInstructionMemoryParseException() + { + super(); + } + + public MicroInstructionMemoryParseException(String message) + { + super(message); + } + + public MicroInstructionMemoryParseException(Throwable cause) + { + super(cause); + } + +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java new file mode 100644 index 00000000..44d00981 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -0,0 +1,107 @@ +package net.mograsim.machine.mi; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.math.BigInteger; +import java.util.ArrayList; +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.IntegerClassification; +import net.mograsim.machine.mi.parameters.IntegerImmediate; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.MnemonicFamily; +import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public class MicroInstructionMemoryParser +{ + public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException + { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input)))) + { + return parseMemory(definition, reader); + } + } + + public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input) + { + List instructions = new ArrayList<>(); + try + { + String line; + while (input.ready() && !"".equals((line = input.readLine()))) + instructions.add(parse(definition, line)); + } catch (IOException e) + { + e.printStackTrace(); + } + + int maxAddress = instructions.size() - 1; + MicroInstructionMemory memory = MicroInstructionMemory + .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress)); + int i = 0; + for (MicroInstruction inst : instructions) + memory.setCell(i++, inst); + return memory; + } + + public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) + { + int size = definition.size(); + String[] strings = toParse.split(","); + if (size != strings.length) + throw new MicroInstructionMemoryParseException( + "String does not match definition! The number of parameters does not match."); + MicroInstructionParameter[] params = new MicroInstructionParameter[size]; + ParameterClassification[] classes = definition.getParameterClassifications(); + try + { + for (int i = 0; i < size; i++) + { + params[i] = classes[i].parse(strings[i]); + } + return new StandardMicroInstruction(params); + } catch (Exception e) + { + throw new MicroInstructionMemoryParseException(e.getCause()); + } + } + + public static void write(MicroInstructionMemory memory, String output) throws IOException + { + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output))) + { + write(memory, writer); + } + } + + public static void write(MicroInstructionMemory memory, OutputStreamWriter output) throws IOException + { + MemoryDefinition def = memory.getDefinition(); + long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1; + for (long i = min; i < max; i++) + { + output.write(toCSV(memory.getCell(i)) + "\n"); + } + } + + private static String toCSV(MicroInstruction inst) + { + int max = inst.getSize() - 1; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < max; i++) + { + sb.append(inst.getParameter(i).toString()); + sb.append(","); + } + sb.append(inst.getParameter(max).toString()); + return sb.toString(); + } +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemory.java deleted file mode 100644 index e31ce771..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemory.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.Memory; -import net.mograsim.machine.MemoryDefinition; - -public interface MicroprogramMemory extends Memory -{ - public static MicroprogramMemory create(MemoryDefinition def) - { - return new StandardMicroprogramMemory(def); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParseException.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParseException.java deleted file mode 100644 index eea81af6..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParseException.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.MachineException; - -public class MicroprogramMemoryParseException extends MachineException -{ - - /** - * - */ - private static final long serialVersionUID = 6820101808901789906L; - - public MicroprogramMemoryParseException() - { - super(); - } - - public MicroprogramMemoryParseException(String message) - { - super(message); - } - - public MicroprogramMemoryParseException(Throwable cause) - { - super(cause); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java deleted file mode 100644 index da3e1e08..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.mograsim.machine.mi; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.math.BigInteger; -import java.util.ArrayList; -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.IntegerClassification; -import net.mograsim.machine.mi.parameters.IntegerImmediate; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.MnemonicFamily; -import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public class MicroprogramMemoryParser -{ - public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException - { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input)))) - { - return parseMemory(definition, reader); - } - } - - public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input) - { - List instructions = new ArrayList<>(); - try - { - String line; - while (input.ready() && !"".equals((line = input.readLine()))) - instructions.add(parse(definition, line)); - } catch (IOException e) - { - e.printStackTrace(); - } - - int maxAddress = instructions.size() - 1; - MicroprogramMemory memory = MicroprogramMemory - .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress)); - int i = 0; - for (MicroInstruction inst : instructions) - memory.setCell(i++, inst); - return memory; - } - - public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) - { - int size = definition.size(); - String[] strings = toParse.split(","); - if (size != strings.length) - throw new MicroprogramMemoryParseException( - "String does not match definition! The number of parameters does not match."); - MicroInstructionParameter[] params = new MicroInstructionParameter[size]; - ParameterClassification[] classes = definition.getParameterClassifications(); - try - { - for (int i = 0; i < size; i++) - { - params[i] = classes[i].parse(strings[i]); - } - return new StandardMicroInstruction(params); - } catch (Exception e) - { - throw new MicroprogramMemoryParseException(e.getCause()); - } - } - - public static void write(MicroprogramMemory memory, String output) throws IOException - { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output))) - { - write(memory, writer); - } - } - - public static void write(MicroprogramMemory memory, OutputStreamWriter output) throws IOException - { - MemoryDefinition def = memory.getDefinition(); - long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1; - for (long i = min; i < max; i++) - { - output.write(toCSV(memory.getCell(i)) + "\n"); - } - } - - private static String toCSV(MicroInstruction inst) - { - int max = inst.getSize() - 1; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < max; i++) - { - sb.append(inst.getParameter(i).toString()); - sb.append(","); - } - sb.append(inst.getParameter(max).toString()); - return sb.toString(); - } - - public static void main(String[] args) - { - MnemonicFamily family = new MnemonicFamily(new MnemonicPair("ZERO", BitVector.SINGLE_0), - new MnemonicPair("ONE", BitVector.SINGLE_1)); - 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(boolClass.get(false), - new IntegerImmediate(BigInteger.valueOf(i), 8), family.get(i % 2))); - try - { - write(memory, "test.txt"); - MicroprogramMemory newMemory = parseMemory(def, "test.txt"); - write(newMemory, "test2.txt"); - } catch (IOException e) - { - e.printStackTrace(); - } - - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java new file mode 100644 index 00000000..6ef54bdb --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -0,0 +1,64 @@ +package net.mograsim.machine.mi; + +import java.util.HashSet; + +import net.mograsim.machine.MemoryDefinition; +import net.mograsim.machine.MemoryObserver; +import net.mograsim.machine.standard.memory.MemoryException; + +class StandardMicroInstructionMemory implements MicroInstructionMemory +{ + private MicroInstruction[] data; + private MemoryDefinition definition; + private HashSet observers = new HashSet<>(); + + StandardMicroInstructionMemory(MemoryDefinition definition) + { + if(definition.size() > Integer.MAX_VALUE) + throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long"); + this.definition = definition; + data = new MicroInstruction[(int) definition.size()]; + } + + private int translate(long address) + { + return (int) (address - definition.getMinimalAddress()); + } + + @Override + public MicroInstruction getCell(long address) + { + return data[translate(address)]; + } + + @Override + public void setCell(long address, MicroInstruction data) + { + this.data[translate(address)] = data; + } + + @Override + public void registerObserver(MemoryObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(MemoryObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers(long address) + { + observers.forEach(ob -> ob.update(address)); + } + + @Override + public MemoryDefinition getDefinition() + { + return definition; + } + +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroprogramMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroprogramMemory.java deleted file mode 100644 index e06a94da..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroprogramMemory.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.machine.mi; - -import java.util.HashSet; - -import net.mograsim.machine.MemoryDefinition; -import net.mograsim.machine.MemoryObserver; -import net.mograsim.machine.standard.memory.MemoryException; - -class StandardMicroprogramMemory implements MicroprogramMemory -{ - private MicroInstruction[] data; - private MemoryDefinition definition; - private HashSet observers = new HashSet<>(); - - StandardMicroprogramMemory(MemoryDefinition definition) - { - if(definition.size() > Integer.MAX_VALUE) - throw new MemoryException("Size of MicroprogramMemory must be an int, not a long"); - this.definition = definition; - data = new MicroInstruction[(int) definition.size()]; - } - - private int translate(long address) - { - return (int) (address - definition.getMinimalAddress()); - } - - @Override - public MicroInstruction getCell(long address) - { - return data[translate(address)]; - } - - @Override - public void setCell(long address, MicroInstruction data) - { - this.data[translate(address)] = data; - } - - @Override - public void registerObserver(MemoryObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(MemoryObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers(long address) - { - observers.forEach(ob -> ob.update(address)); - } - - @Override - public MemoryDefinition getDefinition() - { - return definition; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java index 00a6f196..605e26d4 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java @@ -4,12 +4,12 @@ import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; -import net.mograsim.machine.mi.MicroprogramMemory; +import net.mograsim.machine.mi.MicroInstructionMemory; public class InstructionTableContentProvider implements ILazyContentProvider { private TableViewer viewer; - private MicroprogramMemory memory; + private MicroInstructionMemory memory; @Override public void updateElement(int index) @@ -21,7 +21,7 @@ public class InstructionTableContentProvider implements ILazyContentProvider public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (TableViewer) viewer; - this.memory = (MicroprogramMemory) newInput; + this.memory = (MicroInstructionMemory) newInput; if (this.memory != null) this.viewer.setItemCount((int) memory.size()); } 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 ee1f5da0..167a6276 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 @@ -17,9 +17,9 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.part.ViewPart; import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.MicroprogramMemory; -import net.mograsim.machine.mi.MicroprogramMemoryParseException; -import net.mograsim.machine.mi.MicroprogramMemoryParser; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.machine.mi.MicroInstructionMemoryParseException; +import net.mograsim.machine.mi.MicroInstructionMemoryParser; import net.mograsim.machine.mi.parameters.ParameterClassification; import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; import net.mograsim.plugin.tables.DisplaySettings; @@ -33,7 +33,7 @@ public class InstructionView extends ViewPart private TableViewer viewer; private TableViewerColumn[] columns = new TableViewerColumn[0]; private MicroInstructionDefinition miDef; - private MicroprogramMemory memory; + private MicroInstructionMemory memory; private DisplaySettings displaySettings; @SuppressWarnings("unused") @@ -97,7 +97,7 @@ public class InstructionView extends ViewPart saveLoc = d.getFilterPath() + File.separator + filename; } - public void bindMicroprogramMemory(MicroprogramMemory memory) + public void bindMicroprogramMemory(MicroInstructionMemory memory) { this.memory = memory; viewer.setInput(memory); @@ -178,11 +178,11 @@ public class InstructionView extends ViewPart } try { - MicroprogramMemory newMemory = MicroprogramMemoryParser.parseMemory(miDef, file); + MicroInstructionMemory newMemory = MicroInstructionMemoryParser.parseMemory(miDef, file); bindMicroprogramMemory(newMemory); saveLoc = file; } - catch (IOException | MicroprogramMemoryParseException e) + catch (IOException | MicroInstructionMemoryParseException e) { e.printStackTrace(); } @@ -198,7 +198,7 @@ public class InstructionView extends ViewPart { try { - MicroprogramMemoryParser.write(memory, file); + MicroInstructionMemoryParser.write(memory, file); } catch (IOException e) {