1 package net.mograsim.machine.mi;
3 import java.math.BigInteger;
4 import java.util.HashSet;
7 import net.mograsim.logic.core.types.BitVector;
8 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
10 public class AssignableMPROM implements MPROM, MemoryCellModifiedListener
13 private Set<MemoryCellModifiedListener> observers = new HashSet<>();
15 private Set<MPROMReassignedListener> reassignmentListeners = new HashSet<>();
16 private MPROM real = null;
18 public AssignableMPROM(MPROM standardMPROM)
21 real.registerCellModifiedListener(this);
24 public void bind(MPROM real)
26 this.real.deregisterCellModifiedListener(this);
28 real.registerCellModifiedListener(this);
29 notifyMemoryChanged(-1);
30 notifyMemoryReassigned(real);
34 public BitVector getCell(long address)
36 return real.getCell(address);
40 public void setCell(long address, BitVector data)
42 real.setCell(address, data);
46 public BigInteger getCellAsBigInteger(long address)
48 return real.getCellAsBigInteger(address);
52 public void registerCellModifiedListener(MemoryCellModifiedListener ob)
58 public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
63 private void notifyMemoryChanged(long address)
65 observers.forEach(o -> o.update(address));
69 public MPROMDefinition getDefinition()
71 return real.getDefinition();
75 public void update(long address)
77 notifyMemoryChanged(address);
80 public void registerMemoryReassignedListener(MPROMReassignedListener listener)
82 reassignmentListeners.add(listener);
85 public void deregisterMemoryReassignedListener(MPROMReassignedListener listener)
87 reassignmentListeners.remove(listener);
90 private void notifyMemoryReassigned(MPROM newAssignee)
92 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
95 public static interface MPROMReassignedListener
97 public void reassigned(MPROM newAssignee);