Added active instruction preview to LogicUIPart
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / AssignableMicroInstructionMemory.java
1 package net.mograsim.machine.mi;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
7 import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
8
9 public class AssignableMicroInstructionMemory
10                 implements MicroInstructionMemory, MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
11 {
12
13         private Set<MemoryCellModifiedListener> observers = new HashSet<>();
14         private Set<ActiveMicroInstructionChangedListener> activeInstructionListeners = new HashSet<>();
15         private Set<MIMemoryReassignedListener> reassignmentListeners = new HashSet<>();
16         private MicroInstructionMemory real = null;
17
18         public AssignableMicroInstructionMemory(StandardMicroInstructionMemory standardMicroInstructionMemory)
19         {
20                 real = standardMicroInstructionMemory;
21                 real.registerCellModifiedListener(this);
22         }
23
24         public void bind(MicroInstructionMemory real)
25         {
26                 this.real.deregisterCellModifiedListener(this);
27                 this.real = real;
28                 real.registerCellModifiedListener(this);
29                 notifyMemoryChanged(-1);
30                 notifyMemoryReassigned(real);
31         }
32
33         @Override
34         public MicroInstruction getCell(long address)
35         {
36                 return real.getCell(address);
37         }
38
39         @Override
40         public void setCell(long address, MicroInstruction data)
41         {
42                 real.setCell(address, data);
43         }
44
45         @Override
46         public void registerCellModifiedListener(MemoryCellModifiedListener ob)
47         {
48                 observers.add(ob);
49         }
50
51         @Override
52         public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
53         {
54                 observers.remove(ob);
55         }
56
57         @Override
58         public void registerActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
59         {
60                 activeInstructionListeners.add(ob);
61         }
62
63         @Override
64         public void deregisterActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
65         {
66                 activeInstructionListeners.remove(ob);
67         }
68
69         private void notifyMemoryChanged(long address)
70         {
71                 observers.forEach(o -> o.update(address));
72         }
73
74         private void notifyActiveInstructionChanged(long address)
75         {
76                 activeInstructionListeners.forEach(o -> o.activeMicroInstructionChanged(address));
77         }
78
79         @Override
80         public MicroInstructionMemoryDefinition getDefinition()
81         {
82                 return real.getDefinition();
83         }
84
85         @Override
86         public void update(long address)
87         {
88                 notifyMemoryChanged(address);
89         }
90
91         @Override
92         public void setActiveInstruction(long address)
93         {
94                 real.setActiveInstruction(address);
95         }
96
97         @Override
98         public void activeMicroInstructionChanged(long address)
99         {
100                 notifyActiveInstructionChanged(address);
101         }
102
103         public void registerMemoryReassignedListener(MIMemoryReassignedListener listener)
104         {
105                 reassignmentListeners.add(listener);
106         }
107
108         public void deregisterMemoryReassignedListener(MIMemoryReassignedListener listener)
109         {
110                 reassignmentListeners.remove(listener);
111         }
112
113         private void notifyMemoryReassigned(MicroInstructionMemory newAssignee)
114         {
115                 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
116         }
117
118         public static interface MIMemoryReassignedListener
119         {
120                 public void reassigned(MicroInstructionMemory newAssignee);
121         }
122 }