From 95e642d1252917f31021ae625c957c65d7215f32 Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Tue, 27 Aug 2019 23:09:29 +0200 Subject: [PATCH] MemoryView is now updated when the memory is modified --- .../src/net/mograsim/machine/Memory.java | 9 +++++++ .../net/mograsim/machine/MemoryObserver.java | 6 +++++ .../memory/WordAddressableMemory.java | 24 +++++++++++++++++++ .../memory/MemoryTableContentProvider.java | 14 ++++++++++- .../mograsim/plugin/memory/MemoryView.java | 2 -- 5 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java diff --git a/net.mograsim.machine/src/net/mograsim/machine/Memory.java b/net.mograsim.machine/src/net/mograsim/machine/Memory.java index 8297ebb9..e421e470 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/Memory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/Memory.java @@ -17,4 +17,13 @@ public interface Memory 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 index 00000000..1d7fc4dd --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java @@ -0,0 +1,6 @@ +package net.mograsim.machine; + +public interface MemoryObserver +{ + public void update(long address); +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java index e828a249..516b01ff 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java @@ -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 observers = new HashSet<>(); private HashMap 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)); + } } diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java index 3ddb32f4..9f2a9e13 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java @@ -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))); + } } diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryView.java index f00f1c95..52547453 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryView.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryView.java @@ -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); -- 2.17.1