Implemented some infrastructure for MPROMs
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / AssignableMPROM.java
1 package net.mograsim.machine.mi;
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.Memory.MemoryCellModifiedListener;
9
10 public class AssignableMPROM implements MPROM, MemoryCellModifiedListener
11 {
12
13         private Set<MemoryCellModifiedListener> observers = new HashSet<>();
14
15         private Set<MPROMReassignedListener> reassignmentListeners = new HashSet<>();
16         private MPROM real = null;
17
18         public AssignableMPROM(MPROM standardMPROM)
19         {
20                 real = standardMPROM;
21                 real.registerCellModifiedListener(this);
22         }
23
24         public void bind(MPROM 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 void setCell(long address, BitVector data)
41         {
42                 real.setCell(address, data);
43         }
44
45         @Override
46         public BigInteger getCellAsBigInteger(long address)
47         {
48                 return real.getCellAsBigInteger(address);
49         }
50
51         @Override
52         public void registerCellModifiedListener(MemoryCellModifiedListener ob)
53         {
54                 observers.add(ob);
55         }
56
57         @Override
58         public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
59         {
60                 observers.remove(ob);
61         }
62
63         private void notifyMemoryChanged(long address)
64         {
65                 observers.forEach(o -> o.update(address));
66         }
67
68         @Override
69         public MPROMDefinition getDefinition()
70         {
71                 return real.getDefinition();
72         }
73
74         @Override
75         public void update(long address)
76         {
77                 notifyMemoryChanged(address);
78         }
79
80         public void registerMemoryReassignedListener(MPROMReassignedListener listener)
81         {
82                 reassignmentListeners.add(listener);
83         }
84
85         public void deregisterMemoryReassignedListener(MPROMReassignedListener listener)
86         {
87                 reassignmentListeners.remove(listener);
88         }
89
90         private void notifyMemoryReassigned(MPROM newAssignee)
91         {
92                 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
93         }
94
95         public static interface MPROMReassignedListener
96         {
97                 public void reassigned(MPROM newAssignee);
98         }
99 }