From 259c5b8d38b6ed641fd9b5d78fe20969c67015dc Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Fri, 6 Sep 2019 21:04:07 +0200 Subject: [PATCH] Updated Am2900Machine and -Definition; Added MachineContext MemoryView and InstructionView were updated to depend on the MachineContext --- .../META-INF/MANIFEST.MF | 3 +- .../model/am2900/machine/Am2900Machine.java | 21 ++++++ .../machine/Am2900MachineDefinition.java | 7 ++ .../Am2900MicroInstructionDefinition.java | 52 +++++++++++++++ ...m2900MicroInstructionMemoryDefinition.java | 32 +++++++++ .../src/net/mograsim/machine/Machine.java | 6 ++ .../mograsim/machine/MachineDefinition.java | 10 +++ .../src/net/mograsim/machine/Memory.java | 2 +- .../mi/MicroInstructionDefinition.java | 33 ++++++++++ .../machine/mi/MicroInstructionMemory.java | 6 +- .../mi/MicroInstructionMemoryDefinition.java | 8 +++ .../mi/MicroInstructionMemoryParser.java | 48 ++++++-------- .../mi/StandardMicroInstructionMemory.java | 15 +++-- .../net/mograsim/plugin/MachineContext.java | 65 +++++++++++++++++++ .../plugin/tables/memory/MemoryView.java | 38 +++++++++-- .../plugin/tables/mi/InstructionView.java | 34 +++++++--- 16 files changed, 323 insertions(+), 57 deletions(-) create mode 100644 net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java create mode 100644 net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java create mode 100644 net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java create mode 100644 net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java diff --git a/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF b/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF index fc904190..63beee29 100644 --- a/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF +++ b/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF @@ -11,7 +11,8 @@ Export-Package: net.mograsim.logic.model.am2900, net.mograsim.logic.model.examples Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: org.eclipse.osgi, - net.mograsim.machine;bundle-version="0.1.0";visibility:=reexport + net.mograsim.machine;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.core Automatic-Module-Name: net.mograsim.logic.model.am2900 Bundle-Vendor: Mograsim Team Bundle-Activator: net.mograsim.logic.model.am2900.Am2900Loader diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java index f8abe443..ff0704a1 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java @@ -10,7 +10,11 @@ import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.machine.Machine; import net.mograsim.machine.MachineDefinition; +import net.mograsim.machine.MainMemory; import net.mograsim.machine.Register; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.machine.mi.StandardMicroInstructionMemory; +import net.mograsim.machine.standard.memory.WordAddressableMemory; public class Am2900Machine implements Machine { @@ -18,6 +22,8 @@ public class Am2900Machine implements Machine private ViewModelModifiable viewModel; private Timeline timeline; private Clock clock; + private MainMemory mainMemory; + private MicroInstructionMemory instMemory; public Am2900Machine(Am2900MachineDefinition am2900MachineDefinition) { @@ -29,6 +35,9 @@ public class Am2900Machine implements Machine params.gateProcessTime = 50; params.wireTravelTime = 10; timeline = ViewLogicModelAdapter.convert(viewModel, params); + + mainMemory = new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()); + instMemory = new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()); } @Override @@ -76,4 +85,16 @@ public class Am2900Machine implements Machine } + @Override + public MainMemory getMainMemory() + { + return mainMemory; + } + + @Override + public MicroInstructionMemory getMicroInstructionMemory() + { + return instMemory; + } + } diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java index 6f9b6d8c..134997dd 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java @@ -7,10 +7,12 @@ import net.mograsim.machine.Machine; import net.mograsim.machine.MachineDefinition; import net.mograsim.machine.MainMemoryDefinition; import net.mograsim.machine.Register; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; public class Am2900MachineDefinition implements MachineDefinition { private MainMemoryDefinition memoryDefinition = new Am2900MainMemoryDefinition(); + private MicroInstructionMemoryDefinition microInstMemoryDefinition = new Am2900MicroInstructionMemoryDefinition(); @Override public Machine createNew() @@ -44,4 +46,9 @@ public class Am2900MachineDefinition implements MachineDefinition return memoryDefinition; } + @Override + public MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition() + { + return microInstMemoryDefinition; + } } diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java new file mode 100644 index 00000000..1263aab8 --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java @@ -0,0 +1,52 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.BooleanClassification; +import net.mograsim.machine.mi.parameters.IntegerClassification; +import net.mograsim.machine.mi.parameters.MnemonicFamily; +import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public class Am2900MicroInstructionDefinition implements MicroInstructionDefinition +{ + private final static MnemonicFamily am2910Instructions = new MnemonicFamily(new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily am2904StatusInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily am2904ShiftInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily am2904CarryInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily am2901DestInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily am2901FuncInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily am2901SrcInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static MnemonicFamily interruptInstructions = new MnemonicFamily( + new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */); + private final static BooleanClassification hL = new BooleanClassification("H", "L"); + private final static BooleanClassification registerSelect = new BooleanClassification("MR", "IR"); + private final static IntegerClassification register = new IntegerClassification(4); + + private final static ParameterClassification[] classes = { new BooleanClassification("R", "W"), hL, new BooleanClassification("H", "E"), + new BooleanClassification("H", "I"), new BooleanClassification("H", "E"), hL, new IntegerClassification(11), am2910Instructions, + new BooleanClassification("PS", "C"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions, am2904CarryInstructions, + new BooleanClassification("H", "DB"), new BooleanClassification("H", "AB"), registerSelect, register, registerSelect, register, + am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(16), + new BooleanClassification("D", "K"), interruptInstructions, new BooleanClassification("Dis", "IE") }; + + @Override + public ParameterClassification[] getParameterClassifications() + { + return classes; + } + + @Override + public ParameterClassification getParameterClassification(int index) + { + return classes[index]; + } + +} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java new file mode 100644 index 00000000..01b83212 --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public class Am2900MicroInstructionMemoryDefinition implements MicroInstructionMemoryDefinition +{ + + @Override + public int getMemoryAddressBits() + { + return 12; + } + + @Override + public long getMinimalAddress() + { + return 0; + } + + @Override + public long getMaximalAddress() + { + return 4096; + } + + @Override + public MicroInstructionDefinition getMicroInstructionDefinition() + { + return new Am2900MicroInstructionDefinition(); + } +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Machine.java b/net.mograsim.machine/src/net/mograsim/machine/Machine.java index dc544da6..621af8ee 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/Machine.java +++ b/net.mograsim.machine/src/net/mograsim/machine/Machine.java @@ -4,6 +4,7 @@ import net.mograsim.logic.core.components.Clock; import net.mograsim.logic.core.timeline.Timeline; import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.model.model.ViewModel; +import net.mograsim.machine.mi.MicroInstructionMemory; public interface Machine { MachineDefinition getDefinition(); @@ -19,4 +20,9 @@ public interface Machine { void setRegister(Register r, BitVector value); Timeline getTimeline(); + + MainMemory getMainMemory(); + + MicroInstructionMemory getMicroInstructionMemory(); + } diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java index cfed1ef3..0414b7ee 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java +++ b/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java @@ -2,6 +2,8 @@ package net.mograsim.machine; import java.util.Set; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + public interface MachineDefinition { /** @@ -47,4 +49,12 @@ public interface MachineDefinition { * @author Christian Femers */ MainMemoryDefinition getMainMemoryDefinition(); + + /** + * Returns the definition of the machines instruction memory. + * + * @return the {@link InstructionMemoryDefinition} that defines the instruction memory. + */ + MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition(); + } diff --git a/net.mograsim.machine/src/net/mograsim/machine/Memory.java b/net.mograsim.machine/src/net/mograsim/machine/Memory.java index 58798c39..77c0d48b 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/Memory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/Memory.java @@ -19,7 +19,7 @@ public interface Memory public default long size() { MemoryDefinition def = getDefinition(); - return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress()); + return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress() + 1); } /** diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java index b940e652..229c761f 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java @@ -1,7 +1,13 @@ package net.mograsim.machine.mi; +import java.math.BigInteger; + +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.ParameterClassification; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; public interface MicroInstructionDefinition { @@ -24,6 +30,33 @@ public interface MicroInstructionDefinition return getParameterClassifications().length; } + public default MicroInstruction createDefaultInstruction() + { + int size = size(); + MicroInstructionParameter[] params = new MicroInstructionParameter[size]; + ParameterClassification[] classes = getParameterClassifications(); + for(int i = 0; i < size; i++) + { + MicroInstructionParameter newParam; + ParameterClassification classification = classes[i]; + ParameterType type = classification.getExpectedType(); + switch(type) + { + case BOOLEAN_IMMEDIATE: + case MNEMONIC: + newParam = ((MnemonicFamily) classification).get(0); + break; + case INTEGER_IMMEDIATE: + newParam = new IntegerImmediate(BigInteger.valueOf(0), ((IntegerClassification) classification).getExpectedBits()); + break; + default: + throw new IllegalStateException("Unknown ParameterType " + type); + } + params[i] = newParam; + } + return new StandardMicroInstruction(params); + } + public static MicroInstructionDefinition create(ParameterClassification... classes) { return new StandardMicroInstructionDefinition(classes); diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java index 6d02f7be..5d4fac6b 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java @@ -1,12 +1,8 @@ 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); - } + public MicroInstructionMemoryDefinition getDefinition(); } diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java new file mode 100644 index 00000000..409d2816 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java @@ -0,0 +1,8 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.MemoryDefinition; + +public interface MicroInstructionMemoryDefinition extends MemoryDefinition +{ + MicroInstructionDefinition getMicroInstructionDefinition(); +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java index 44d00981..b5117a75 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -6,52 +6,44 @@ 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 + public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input)))) + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) { - return parseMemory(definition, reader); + parseMemory(memory, reader); } } - public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input) + public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) { - List instructions = new ArrayList<>(); + MicroInstructionMemoryDefinition def = memory.getDefinition(); + MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); + + long minAddr = def.getMinimalAddress(); + long maxAddr = def.getMaximalAddress(); + + String line; + long i = minAddr; try { - String line; - while (input.ready() && !"".equals((line = input.readLine()))) - instructions.add(parse(definition, line)); + for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) + memory.setCell(i, parse(miDef, 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; + + for(; i <= maxAddr; i++) + memory.setCell(i, miDef.createDefaultInstruction()); } - + public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) { int size = definition.size(); @@ -74,9 +66,9 @@ public class MicroInstructionMemoryParser } } - public static void write(MicroInstructionMemory memory, String output) throws IOException + public static void write(MicroInstructionMemory memory, String outputPath) throws IOException { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output))) + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) { write(memory, writer); } diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java index 6ef54bdb..6d38491c 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -2,17 +2,16 @@ 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 +public class StandardMicroInstructionMemory implements MicroInstructionMemory { private MicroInstruction[] data; - private MemoryDefinition definition; + private MicroInstructionMemoryDefinition definition; private HashSet observers = new HashSet<>(); - StandardMicroInstructionMemory(MemoryDefinition definition) + public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition) { if(definition.size() > Integer.MAX_VALUE) throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long"); @@ -28,7 +27,11 @@ class StandardMicroInstructionMemory implements MicroInstructionMemory @Override public MicroInstruction getCell(long address) { - return data[translate(address)]; + int translatedAddress = translate(address); + MicroInstruction actual = data[translatedAddress]; + if(actual == null) + actual = data[translatedAddress] = definition.getMicroInstructionDefinition().createDefaultInstruction(); + return actual; } @Override @@ -56,7 +59,7 @@ class StandardMicroInstructionMemory implements MicroInstructionMemory } @Override - public MemoryDefinition getDefinition() + public MicroInstructionMemoryDefinition getDefinition() { return definition; } diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java new file mode 100644 index 00000000..8a7faa76 --- /dev/null +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java @@ -0,0 +1,65 @@ +package net.mograsim.plugin; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineRegistry; + +public class MachineContext +{ + private Machine machine; + private Set observers; + private static MachineContext instance; + + private MachineContext() + { + observers = new HashSet<>(); + } + + public static MachineContext getInstance() + { + if (instance == null) + { + instance = new MachineContext(); + instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"))); + } + return instance; + } + + public Machine getMachine() + { + return machine; + } + + public void setMachine(Machine machine) + { + this.machine = machine; + notifyObservers(machine); + } + + public void registerObserver(ContextObserver ob) + { + observers.add(ob); + ob.setMachine(Optional.ofNullable(machine)); + } + + public void deregisterObserver(ContextObserver ob) + { + observers.remove(ob); + } + + private void notifyObservers(Machine machine) + { + observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine))); + } + + @FunctionalInterface + public static interface ContextObserver + { + void setMachine(Optional machine); + } +} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java index 7488ee90..ef685f4c 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java @@ -1,6 +1,7 @@ package net.mograsim.plugin.tables.memory; import java.math.BigInteger; +import java.util.Optional; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.TableViewer; @@ -16,22 +17,24 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.part.ViewPart; +import net.mograsim.machine.Machine; import net.mograsim.machine.MainMemory; import net.mograsim.machine.MainMemoryDefinition; import net.mograsim.machine.standard.memory.WordAddressableMemory; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; import net.mograsim.plugin.asm.AsmNumberUtil; import net.mograsim.plugin.tables.DisplaySettings; import net.mograsim.plugin.tables.NumberColumnLabelProvider; import net.mograsim.plugin.tables.RadixSelector; -public class MemoryView extends ViewPart +public class MemoryView extends ViewPart implements ContextObserver { private TableViewer viewer; private MemoryTableContentProvider provider; private DisplaySettings displaySettings; private String addressFormat; - @SuppressWarnings("unused") @Override public void createPartControl(Composite parent) { @@ -40,6 +43,18 @@ public class MemoryView extends ViewPart GridLayout layout = new GridLayout(6, false); parent.setLayout(layout); + + createHeader(parent); + createViewer(parent); + + displaySettings.addObserver(() -> viewer.refresh()); + + setupContextBinding(); + } + + @SuppressWarnings("unused") + private void createHeader(Composite parent) + { Label fromLabel = new Label(parent, SWT.NONE); fromLabel.setText("Address: "); Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH); @@ -79,9 +94,6 @@ public class MemoryView extends ViewPart } }); new RadixSelector(parent, displaySettings); - createViewer(parent); - - displaySettings.addObserver(() -> viewer.refresh()); } private void createViewer(Composite parent) @@ -93,7 +105,7 @@ public class MemoryView extends ViewPart table.setLinesVisible(true); viewer.setUseHashlookup(true); viewer.setContentProvider(provider); - setMemoryBinding(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); + bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); getSite().setSelectionProvider(viewer); GridData gd = new GridData(); @@ -152,10 +164,22 @@ public class MemoryView extends ViewPart viewer.getControl().setFocus(); } - public void setMemoryBinding(MainMemory m) + private void bindMainMemory(MainMemory m) { int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length(); addressFormat = "0x%0" + hexAddressLength + "X"; viewer.setInput(m); } + + private void setupContextBinding() + { + MachineContext.getInstance().registerObserver(this); + } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + bindMainMemory(machine.get().getMainMemory()); + } } 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 167a6276..931d1a60 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 @@ -2,6 +2,7 @@ package net.mograsim.plugin.tables.mi; import java.io.File; import java.io.IOException; +import java.util.Optional; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.EditingSupport; @@ -16,18 +17,21 @@ import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.part.ViewPart; +import net.mograsim.machine.Machine; import net.mograsim.machine.mi.MicroInstructionDefinition; 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.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; import net.mograsim.plugin.tables.DisplaySettings; import net.mograsim.plugin.tables.RadixSelector; import net.mograsim.plugin.util.DropDownMenu; import net.mograsim.plugin.util.DropDownMenu.DropDownEntry; -public class InstructionView extends ViewPart +public class InstructionView extends ViewPart implements ContextObserver { private String saveLoc = null; private TableViewer viewer; @@ -60,6 +64,7 @@ public class InstructionView extends ViewPart viewer.getTable().setLayoutData(viewerData); displaySettings.addObserver(() -> viewer.refresh()); + MachineContext.getInstance().registerObserver(this); } @SuppressWarnings("unused") @@ -97,22 +102,23 @@ public class InstructionView extends ViewPart saveLoc = d.getFilterPath() + File.separator + filename; } - public void bindMicroprogramMemory(MicroInstructionMemory memory) + public void bindMicroInstructionMemory(MicroInstructionMemory memory) { + deleteColumns(); this.memory = memory; viewer.setInput(memory); + this.miDef = memory.getDefinition().getMicroInstructionDefinition(); + createColumns(); } - public void bindMicroInstructionDef(MicroInstructionDefinition miDef) + private void deleteColumns() { - this.miDef = miDef; - createColumns(); + for (TableViewerColumn col : columns) + col.getColumn().dispose(); } private void createColumns() { - for (TableViewerColumn col : columns) - col.getColumn().dispose(); int size = miDef.size(); int bit = 0; columns = new TableViewerColumn[size]; @@ -178,8 +184,8 @@ public class InstructionView extends ViewPart } try { - MicroInstructionMemory newMemory = MicroInstructionMemoryParser.parseMemory(miDef, file); - bindMicroprogramMemory(newMemory); + MicroInstructionMemoryParser.parseMemory(memory, file); + viewer.refresh(); saveLoc = file; } catch (IOException | MicroInstructionMemoryParseException e) @@ -212,4 +218,14 @@ public class InstructionView extends ViewPart { viewer.getControl().setFocus(); } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + { + Machine actualMachine = machine.get(); + bindMicroInstructionMemory(actualMachine.getMicroInstructionMemory()); + } + } } -- 2.17.1