MemoryView is now updated when the memory is modified
authorFabian Stemmler <stemmler@in.tum.de>
Tue, 27 Aug 2019 21:09:29 +0000 (23:09 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Tue, 27 Aug 2019 21:09:29 +0000 (23:09 +0200)
net.mograsim.machine/src/net/mograsim/machine/Memory.java
net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java
net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java
net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryView.java

index 8297ebb..e421e47 100644 (file)
@@ -17,4 +17,13 @@ public interface Memory<T>
        public void setCell(long address, T data);
        
        public long size();
+       
+       /**
+        * Registers an observer to be notified when a memory cell is modified
+        */
+       public void registerObserver(MemoryObserver ob);
+       
+       public void deregisterObserver(MemoryObserver ob);
+       
+       public void notifyObservers(long address);
 }
diff --git a/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java b/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java
new file mode 100644 (file)
index 0000000..1d7fc4d
--- /dev/null
@@ -0,0 +1,6 @@
+package net.mograsim.machine;
+
+public interface MemoryObserver
+{
+       public void update(long address);
+}
index e828a24..516b01f 100644 (file)
@@ -3,11 +3,14 @@ package net.mograsim.machine.standard.memory;
 import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 
 import net.mograsim.logic.core.types.Bit;
 import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.machine.MainMemory;
 import net.mograsim.machine.MainMemoryDefinition;
+import net.mograsim.machine.MemoryObserver;
 
 public class WordAddressableMemory implements MainMemory
 {
@@ -15,6 +18,7 @@ public class WordAddressableMemory implements MainMemory
        private final long minimalAddress, maximalAddress;
        private final MainMemoryDefinition definition;
        private final int pageSize = 64;
+       private Set<MemoryObserver> observers = new HashSet<>();
 
        private HashMap<Long, Page> pages;
 
@@ -55,6 +59,7 @@ public class WordAddressableMemory implements MainMemory
                if (p == null)
                        pages.put(page, p = new Page());
                p.setCell(offset, b);
+               notifyObservers(address);
        }
 
        @Override
@@ -91,6 +96,7 @@ public class WordAddressableMemory implements MainMemory
                if (p == null)
                        pages.put(page, p = new Page());
                p.setCellAsBigInteger(offset, word);
+               notifyObservers(address);
        }
 
        private class Page
@@ -146,4 +152,22 @@ public class WordAddressableMemory implements MainMemory
        {
                return definition;
        }
+
+       @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));
+       }
 }
index 3ddb32f..9f2a9e1 100644 (file)
@@ -3,10 +3,12 @@ package net.mograsim.plugin.memory;
 import org.eclipse.jface.viewers.ILazyContentProvider;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
 
 import net.mograsim.machine.MainMemory;
+import net.mograsim.machine.MemoryObserver;
 
-public class MemoryTableContentProvider implements ILazyContentProvider
+public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver
 {
        private long lower;
        private TableViewer viewer;
@@ -62,6 +64,16 @@ public class MemoryTableContentProvider implements ILazyContentProvider
        {
                this.viewer = (TableViewer) viewer;
                this.memory = (MainMemory) newInput;
+               if (oldInput != null)
+                       ((MainMemory) oldInput).deregisterObserver(this);
+               if (memory != null)
+                       memory.registerObserver(this);
                setLowerBound(0L);
        }
+
+       @Override
+       public void update(long address)
+       {
+               Display.getDefault().asyncExec(() -> updateElement((int) (address - lower)));
+       }
 }
index f00f1c9..5254745 100644 (file)
@@ -57,7 +57,6 @@ public class MemoryView extends ViewPart
                        {
                                // Nothing to do here
                        }
-//                     fromText.setText(AsmNumberUtil.toString(BigInteger.valueOf(provider.getLowerBound()), NumberType.HEXADECIMAL));
                });
 
                Label amountLabel = new Label(parent, SWT.NONE);
@@ -77,7 +76,6 @@ public class MemoryView extends ViewPart
                        {
                                // Nothing to do here
                        }
-//                     amountText.setText(Integer.toString(provider.getAmount()));
                });
 
                setupRadixSelector(parent);