Updated Am2900Machine and -Definition; Added MachineContext
authorFabian Stemmler <stemmler@in.tum.de>
Fri, 6 Sep 2019 19:04:07 +0000 (21:04 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Fri, 6 Sep 2019 19:13:09 +0000 (21:13 +0200)
MemoryView and InstructionView were updated to depend on the
MachineContext

16 files changed:
net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java [new file with mode: 0644]
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/Machine.java
net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java
net.mograsim.machine/src/net/mograsim/machine/Memory.java
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java
net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java
net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java [new file with mode: 0644]
net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java
net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java

index fc90419..63beee2 100644 (file)
@@ -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
index f8abe44..ff0704a 100644 (file)
@@ -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;
+       }
+
 }
index 6f9b6d8..134997d 100644 (file)
@@ -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 (file)
index 0000000..1263aab
--- /dev/null
@@ -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 (file)
index 0000000..01b8321
--- /dev/null
@@ -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();
+       }
+}
index dc544da..621af8e 100644 (file)
@@ -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();
+       
 }
index cfed1ef..0414b7e 100644 (file)
@@ -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();
+       
 }
index 58798c3..77c0d48 100644 (file)
@@ -19,7 +19,7 @@ public interface Memory<T>
        public default long size()
        {
                MemoryDefinition def = getDefinition();
-               return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress());
+               return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress() + 1);
        }
        
        /**
index b940e65..229c761 100644 (file)
@@ -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);
index 6d02f7b..5d4fac6 100644 (file)
@@ -1,12 +1,8 @@
 package net.mograsim.machine.mi;
 
 import net.mograsim.machine.Memory;
-import net.mograsim.machine.MemoryDefinition;
 
 public interface MicroInstructionMemory extends Memory<MicroInstruction>
 {
-       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 (file)
index 0000000..409d281
--- /dev/null
@@ -0,0 +1,8 @@
+package net.mograsim.machine.mi;
+
+import net.mograsim.machine.MemoryDefinition;
+
+public interface MicroInstructionMemoryDefinition extends MemoryDefinition
+{
+       MicroInstructionDefinition getMicroInstructionDefinition();
+}
index 44d0098..b5117a7 100644 (file)
@@ -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<MicroInstruction> 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);
                }
index 6ef54bd..6d38491 100644 (file)
@@ -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<MemoryObserver> 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 (file)
index 0000000..8a7faa7
--- /dev/null
@@ -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<ContextObserver> 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> machine);
+       }
+}
index 7488ee9..ef685f4 100644 (file)
@@ -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> machine)
+       {
+               if (machine.isPresent())
+                       bindMainMemory(machine.get().getMainMemory());
+       }
 }
index 167a627..931d1a6 100644 (file)
@@ -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> machine)
+       {
+               if (machine.isPresent())
+               {
+                       Machine actualMachine = machine.get();
+                       bindMicroInstructionMemory(actualMachine.getMicroInstructionMemory());
+               }
+       }
 }