Finished MPROM support. Fixes #10
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / standard / memory / AbstractAssignableBitVectorMemory.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.BitVectorMemory;
9 import net.mograsim.machine.BitVectorMemoryDefinition;
10 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
11
12 public class AbstractAssignableBitVectorMemory<M extends BitVectorMemory> implements BitVectorMemory, MemoryCellModifiedListener
13 {
14         private Set<MemoryCellModifiedListener> observers = new HashSet<>();
15         private Set<BitVectorMemoryReassignedListener<M>> reassignmentListeners = new HashSet<>();
16         private M real = null;
17
18         public AbstractAssignableBitVectorMemory(M memory)
19         {
20                 real = memory;
21                 real.registerCellModifiedListener(this);
22         }
23
24         public void bind(M 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         protected M getReal()
64         {
65                 return real;
66         }
67
68         @Override
69         public BitVectorMemoryDefinition getDefinition()
70         {
71                 return real.getDefinition();
72         }
73
74         @Override
75         public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
76         {
77                 observers.remove(ob);
78         }
79
80         private void notifyMemoryChanged(long address)
81         {
82                 observers.forEach(o -> o.update(address));
83         }
84
85         @Override
86         public void update(long address)
87         {
88                 notifyMemoryChanged(address);
89         }
90
91         public void registerMemoryReassignedListener(BitVectorMemoryReassignedListener<M> listener)
92         {
93                 reassignmentListeners.add(listener);
94         }
95
96         public void deregisterMemoryReassignedListener(BitVectorMemoryReassignedListener<M> listener)
97         {
98                 reassignmentListeners.remove(listener);
99         }
100
101         private void notifyMemoryReassigned(M newAssignee)
102         {
103                 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
104         }
105
106         public interface BitVectorMemoryReassignedListener<M extends BitVectorMemory>
107         {
108                 public void reassigned(M newAssignee);
109         }
110 }