X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FAbstractAssignableBitVectorMemory.java;fp=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FAbstractAssignableBitVectorMemory.java;h=782a5b694fcec2055e40af0633207b7ba7529c63;hb=b5d55c59d7069171bd928e4a945d9185ee4bc2b0;hp=0000000000000000000000000000000000000000;hpb=f098cd47d06be0cc654532a5fad0e5e89f0ef93c;p=Mograsim.git diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/AbstractAssignableBitVectorMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/AbstractAssignableBitVectorMemory.java new file mode 100644 index 00000000..782a5b69 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/AbstractAssignableBitVectorMemory.java @@ -0,0 +1,110 @@ +package net.mograsim.machine.standard.memory; + +import java.math.BigInteger; +import java.util.HashSet; +import java.util.Set; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.BitVectorMemory; +import net.mograsim.machine.BitVectorMemoryDefinition; +import net.mograsim.machine.Memory.MemoryCellModifiedListener; + +public class AbstractAssignableBitVectorMemory implements BitVectorMemory, MemoryCellModifiedListener +{ + private Set observers = new HashSet<>(); + private Set> reassignmentListeners = new HashSet<>(); + private M real = null; + + public AbstractAssignableBitVectorMemory(M memory) + { + real = memory; + real.registerCellModifiedListener(this); + } + + public void bind(M real) + { + this.real.deregisterCellModifiedListener(this); + this.real = real; + real.registerCellModifiedListener(this); + notifyMemoryChanged(-1); + notifyMemoryReassigned(real); + } + + @Override + public BitVector getCell(long address) + { + return real.getCell(address); + } + + @Override + public BigInteger getCellAsBigInteger(long address) + { + return real.getCellAsBigInteger(address); + } + + @Override + public void setCell(long address, BitVector data) + { + real.setCell(address, data); + } + + @Override + public void setCellAsBigInteger(long address, BigInteger word) + { + real.setCellAsBigInteger(address, word); + } + + @Override + public void registerCellModifiedListener(MemoryCellModifiedListener ob) + { + observers.add(ob); + } + + protected M getReal() + { + return real; + } + + @Override + public BitVectorMemoryDefinition getDefinition() + { + return real.getDefinition(); + } + + @Override + public void deregisterCellModifiedListener(MemoryCellModifiedListener ob) + { + observers.remove(ob); + } + + private void notifyMemoryChanged(long address) + { + observers.forEach(o -> o.update(address)); + } + + @Override + public void update(long address) + { + notifyMemoryChanged(address); + } + + public void registerMemoryReassignedListener(BitVectorMemoryReassignedListener listener) + { + reassignmentListeners.add(listener); + } + + public void deregisterMemoryReassignedListener(BitVectorMemoryReassignedListener listener) + { + reassignmentListeners.remove(listener); + } + + private void notifyMemoryReassigned(M newAssignee) + { + reassignmentListeners.forEach(l -> l.reassigned(newAssignee)); + } + + public interface BitVectorMemoryReassignedListener + { + public void reassigned(M newAssignee); + } +}