1 package net.mograsim.machine.mi;
3 import java.math.BigInteger;
4 import java.util.HashSet;
6 import net.mograsim.logic.core.types.BitVector;
7 import net.mograsim.machine.standard.memory.MemoryException;
9 public class StandardMPROM implements MPROM
11 private BitVector[] data;
12 private MPROMDefinition definition;
13 private HashSet<MemoryCellModifiedListener> observers = new HashSet<>();
15 public StandardMPROM(MPROMDefinition definition)
17 if (definition.size() > Integer.MAX_VALUE)
18 throw new MemoryException("Size of MPROM must be an int, not a long");
19 this.definition = definition;
20 data = new BitVector[(int) definition.size()];
23 private int translate(long address)
25 return (int) (address - definition.getMinimalAddress());
29 public BitVector getCell(long address)
31 int translatedAddress = translate(address);
32 BitVector cell = data[translatedAddress];
34 cell = data[translatedAddress] = BitVector.from(address * 16, definition.getMicroInstructionMemoryAddressBits());
39 public BigInteger getCellAsBigInteger(long address)
41 return getCell(address).getUnsignedValue();
45 public void setCell(long address, BitVector data)
47 this.data[translate(address)] = data;
48 notifyMemoryChanged(address);
52 public void registerCellModifiedListener(MemoryCellModifiedListener ob)
58 public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
63 private void notifyMemoryChanged(long address)
65 observers.forEach(ob -> ob.update(address));
69 public MPROMDefinition getDefinition()