1 package net.mograsim.machine;
3 import java.util.Arrays;
4 import java.util.HashMap;
5 import java.util.HashSet;
8 public abstract class GenericMemory<T, D extends MemoryDefinition> implements Memory<T>
10 private final long minimalAddress, maximalAddress;
11 private final D definition;
12 private final int pageSize = 64;
13 private Set<MemoryCellModifiedListener> observers = new HashSet<>();
15 private HashMap<Long, Page> pages;
17 public GenericMemory(D definition)
20 this.definition = definition;
21 this.minimalAddress = definition.getMinimalAddress();
22 this.maximalAddress = definition.getMaximalAddress();
23 this.pages = new HashMap<>();
26 private void inBoundsCheck(long address)
28 if (address < minimalAddress || address > maximalAddress)
29 throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maximum: %d Actual: %d",
30 minimalAddress, maximalAddress, address));
33 private long page(long address)
35 return address / pageSize;
38 private int offset(long address)
40 return (int) (address % pageSize);
44 public void setCell(long address, T data)
46 inBoundsCheck(address);
47 long page = page(address);
48 int offset = offset(address);
49 Page p = pages.get(Long.valueOf(page));
51 pages.put(page, p = new Page());
52 p.setCell(offset, data);
53 notifyObservers(address);
57 public T getCell(long address)
59 inBoundsCheck(address);
60 long page = page(address);
61 int offset = offset(address);
62 Page p = pages.get(Long.valueOf(page));
65 return p.getCell(offset);
72 @SuppressWarnings("unchecked")
75 memory = (T[]) new Object[pageSize];
78 public T getCell(int index)
83 public void setCell(int index, T data)
89 public String toString()
91 return Arrays.deepToString(memory);
96 public void registerCellModifiedListener(MemoryCellModifiedListener ob)
102 public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
104 observers.remove(ob);
107 protected void notifyObservers(long address)
109 observers.forEach(ob -> ob.update(address));
113 public D getDefinition()