import java.util.HashSet;
import java.util.Set;
-import net.mograsim.machine.MemoryObserver;
+import net.mograsim.machine.Memory.MemoryCellModifiedListener;
+import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
-public class AssignableMicroInstructionMemory implements MicroInstructionMemory, MemoryObserver
+public class AssignableMicroInstructionMemory
+ implements MicroInstructionMemory, MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
{
- private Set<MemoryObserver> observers = new HashSet<>();
- MicroInstructionMemory real = null;
+
+ private Set<MemoryCellModifiedListener> observers = new HashSet<>();
+ private Set<ActiveMicroInstructionChangedListener> activeInstructionListeners = new HashSet<>();
+ private Set<MIMemoryReassignedListener> reassignmentListeners = new HashSet<>();
+ private MicroInstructionMemory real = null;
public AssignableMicroInstructionMemory(StandardMicroInstructionMemory standardMicroInstructionMemory)
{
real = standardMicroInstructionMemory;
- real.registerObserver(this);
+ real.registerCellModifiedListener(this);
}
public void bind(MicroInstructionMemory real)
{
- this.real.deregisterObserver(this);
+ this.real.deregisterCellModifiedListener(this);
this.real = real;
- real.registerObserver(this);
+ real.registerCellModifiedListener(this);
+ notifyMemoryChanged(-1);
+ notifyMemoryReassigned(real);
}
@Override
}
@Override
- public void registerObserver(MemoryObserver ob)
+ public void registerCellModifiedListener(MemoryCellModifiedListener ob)
{
observers.add(ob);
}
@Override
- public void deregisterObserver(MemoryObserver ob)
+ public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
{
observers.remove(ob);
}
@Override
- public void notifyObservers(long address)
+ public void registerActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
+ {
+ activeInstructionListeners.add(ob);
+ }
+
+ @Override
+ public void deregisterActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
+ {
+ activeInstructionListeners.remove(ob);
+ }
+
+ private void notifyMemoryChanged(long address)
{
observers.forEach(o -> o.update(address));
}
+ private void notifyActiveInstructionChanged(long address)
+ {
+ activeInstructionListeners.forEach(o -> o.activeMicroInstructionChanged(address));
+ }
+
@Override
public MicroInstructionMemoryDefinition getDefinition()
{
@Override
public void update(long address)
{
- notifyObservers(address);
+ notifyMemoryChanged(address);
+ }
+
+ @Override
+ public void setActiveInstruction(long address)
+ {
+ real.setActiveInstruction(address);
+ }
+
+ @Override
+ public void activeMicroInstructionChanged(long address)
+ {
+ notifyActiveInstructionChanged(address);
+ }
+
+ public void registerMemoryReassignedListener(MIMemoryReassignedListener listener)
+ {
+ reassignmentListeners.add(listener);
+ }
+
+ public void deregisterMemoryReassignedListener(MIMemoryReassignedListener listener)
+ {
+ reassignmentListeners.remove(listener);
+ }
+
+ private void notifyMemoryReassigned(MicroInstructionMemory newAssignee)
+ {
+ reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
+ }
+
+ public static interface MIMemoryReassignedListener
+ {
+ public void reassigned(MicroInstructionMemory newAssignee);
}
}