X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FWordAddressableMemory.java;h=3dddc2edaabc704bdb17f769224187d7dade2b0b;hb=939f37fb65d2057c3f370214cc2eebd3e9989f69;hp=516b01ff81e9904abd0883090c70d14934b4ae17;hpb=95e642d1252917f31021ae625c957c65d7215f32;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 516b01ff..3dddc2ed 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 @@ -1,150 +1,43 @@ 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.GenericMemory; import net.mograsim.machine.MainMemory; import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.MemoryObserver; -public class WordAddressableMemory implements MainMemory +public class WordAddressableMemory extends GenericMemory implements MainMemory { private final int cellWidth; - private final long minimalAddress, maximalAddress; private final MainMemoryDefinition definition; - private final int pageSize = 64; - private Set observers = new HashSet<>(); - - private HashMap pages; public WordAddressableMemory(MainMemoryDefinition definition) { - super(); + super(definition); this.cellWidth = definition.getCellWidth(); - this.minimalAddress = definition.getMinimalAddress(); - this.maximalAddress = definition.getMaximalAddress(); this.definition = definition; - this.pages = new HashMap<>(); - } - - private void inBoundsCheck(long address) - { - if (address < minimalAddress || address > maximalAddress) - throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maximum: %d Actual: %d", - minimalAddress, maximalAddress, address)); - } - - private long page(long address) - { - return address / pageSize; - } - - private int offset(long address) - { - return (int) (address % pageSize); - } - - @Override - public void setCell(long address, BitVector b) - { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - pages.put(page, p = new Page()); - p.setCell(offset, b); - notifyObservers(address); } @Override public BitVector getCell(long address) { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - return BitVector.of(Bit.ZERO, cellWidth); - return p.getCell(offset); + BitVector data = super.getCell(address); + return data == null ? BitVector.of(Bit.ZERO, cellWidth) : data; } @Override public BigInteger getCellAsBigInteger(long address) { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - return BigInteger.valueOf(0L); - return p.getCellAsBigInteger(offset); + BitVector data = getCell(address); + return data == null ? BigInteger.valueOf(0) : data.getUnsignedValue(); } @Override - public void setCellAsBigInteger(long address, BigInteger word) - { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - pages.put(page, p = new Page()); - p.setCellAsBigInteger(offset, word); - notifyObservers(address); - } - - private class Page + public void setCellAsBigInteger(long address, BigInteger data) { - private BitVector[] memory; - - public Page() - { - memory = new BitVector[pageSize]; - } - - public BitVector getCell(int index) - { - BitVector b = memory[index]; - if (b == null) - return BitVector.of(Bit.ZERO, cellWidth); - return memory[index]; - } - - public void setCell(int index, BitVector bits) - { - 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.length())); - memory[index] = bits; - } - - public void setCellAsBigInteger(int index, BigInteger bits) - { - setCell(index, BitVector.from(bits, cellWidth)); - } - - public BigInteger getCellAsBigInteger(int index) - { - try { - return getCell(index).getUnsignedValue(); - } - catch(NumberFormatException e) - { - throw new MemoryException(e); - } - } - - @Override - public String toString() - { - return Arrays.deepToString(memory); - } + setCell(address, BitVector.from(data, cellWidth)); } @Override @@ -152,22 +45,4 @@ 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)); - } }