1 package net.mograsim.machine.standard.memory;
3 import java.math.BigInteger;
4 import java.util.HashSet;
7 import net.mograsim.logic.core.types.BitVector;
8 import net.mograsim.machine.BitVectorMemory;
9 import net.mograsim.machine.BitVectorMemoryDefinition;
10 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
12 public class AbstractAssignableBitVectorMemory<M extends BitVectorMemory> implements BitVectorMemory, MemoryCellModifiedListener
14 private Set<MemoryCellModifiedListener> observers = new HashSet<>();
15 private Set<BitVectorMemoryReassignedListener<M>> reassignmentListeners = new HashSet<>();
16 private M real = null;
18 public AbstractAssignableBitVectorMemory(M memory)
21 real.registerCellModifiedListener(this);
24 public void bind(M 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 BigInteger getCellAsBigInteger(long address)
42 return real.getCellAsBigInteger(address);
46 public void setCell(long address, BitVector data)
48 real.setCell(address, data);
52 public void setCellAsBigInteger(long address, BigInteger word)
54 real.setCellAsBigInteger(address, word);
58 public void registerCellModifiedListener(MemoryCellModifiedListener ob)
69 public BitVectorMemoryDefinition getDefinition()
71 return real.getDefinition();
75 public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
80 private void notifyMemoryChanged(long address)
82 observers.forEach(o -> o.update(address));
86 public void update(long address)
88 notifyMemoryChanged(address);
91 public void registerMemoryReassignedListener(BitVectorMemoryReassignedListener<M> listener)
93 reassignmentListeners.add(listener);
96 public void deregisterMemoryReassignedListener(BitVectorMemoryReassignedListener<M> listener)
98 reassignmentListeners.remove(listener);
101 private void notifyMemoryReassigned(M newAssignee)
103 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
106 public interface BitVectorMemoryReassignedListener<M extends BitVectorMemory>
108 public void reassigned(M newAssignee);