Fixed a missing space in a Am2900Teaching's description
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / standard / memory / AssignableMainMemory.java
1 package net.mograsim.machine.standard.memory;
2
3 import java.math.BigInteger;
4 import java.util.HashSet;
5 import java.util.Set;
6
7 import net.mograsim.logic.core.types.BitVector;
8 import net.mograsim.machine.MainMemory;
9 import net.mograsim.machine.MainMemoryDefinition;
10 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
11
12 public class AssignableMainMemory implements MainMemory, MemoryCellModifiedListener
13 {
14         private Set<MemoryCellModifiedListener> observers = new HashSet<>();
15         private Set<MainMemoryReassignedListener> reassignmentListeners = new HashSet<>();
16         private MainMemory real = null;
17
18         public AssignableMainMemory(MainMemory mainMemory)
19         {
20                 real = mainMemory;
21                 real.registerCellModifiedListener(this);
22         }
23
24         public void bind(MainMemory 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 BitVector getCell(long address)
35         {
36                 return real.getCell(address);
37         }
38
39         @Override
40         public BigInteger getCellAsBigInteger(long address)
41         {
42                 return real.getCellAsBigInteger(address);
43         }
44
45         @Override
46         public void setCell(long address, BitVector data)
47         {
48                 real.setCell(address, data);
49         }
50
51         @Override
52         public void setCellAsBigInteger(long address, BigInteger word)
53         {
54                 real.setCellAsBigInteger(address, word);
55         }
56
57         @Override
58         public void registerCellModifiedListener(MemoryCellModifiedListener ob)
59         {
60                 observers.add(ob);
61         }
62
63         @Override
64         public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
65         {
66                 observers.remove(ob);
67         }
68
69         private void notifyMemoryChanged(long address)
70         {
71                 observers.forEach(o -> o.update(address));
72         }
73
74         @Override
75         public MainMemoryDefinition getDefinition()
76         {
77                 return real.getDefinition();
78         }
79
80         @Override
81         public void update(long address)
82         {
83                 notifyMemoryChanged(address);
84         }
85
86         public void registerMemoryReassignedListener(MainMemoryReassignedListener listener)
87         {
88                 reassignmentListeners.add(listener);
89         }
90
91         public void deregisterMemoryReassignedListener(MainMemoryReassignedListener listener)
92         {
93                 reassignmentListeners.remove(listener);
94         }
95
96         private void notifyMemoryReassigned(MainMemory newAssignee)
97         {
98                 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
99         }
100
101         public static interface MainMemoryReassignedListener
102         {
103                 public void reassigned(MainMemory newAssignee);
104         }
105 }