X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FWordAddressableMemory.java;h=516b01ff81e9904abd0883090c70d14934b4ae17;hb=4c9a2240352c246c76a056687a2d68208137b667;hp=2e209f1c172f0515e9ca279e4925b6574cc041b5;hpb=f37f1f93f2c1ceb780f1c7ecab888bcb8f4f8b89;p=Mograsim.git 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 2e209f1c..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 @@ -112,9 +118,9 @@ public class WordAddressableMemory implements MainMemory public void setCell(int index, BitVector bits) { - if (bits.width() != cellWidth) + if (bits.length() != cellWidth) throw new IllegalArgumentException(String.format( - "BitVector to be saved in memory cell has unexpected width. Expected: %d Actual: %d", cellWidth, bits.width())); + "BitVector to be saved in memory cell has unexpected width. Expected: %d Actual: %d", cellWidth, bits.length())); memory[index] = bits; } @@ -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)); + } }