b0ab5a4e2d6be07803f36b02f5c9fcc57de329fa
[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.MemoryObserver;
7
8 public class AssignableMicroInstructionMemory implements MicroInstructionMemory, MemoryObserver
9 {
10         private Set<MemoryObserver> observers = new HashSet<>();
11         MicroInstructionMemory real = null;
12
13         public AssignableMicroInstructionMemory(StandardMicroInstructionMemory standardMicroInstructionMemory)
14         {
15                 real = standardMicroInstructionMemory;
16                 real.registerObserver(this);
17         }
18
19         public void bind(MicroInstructionMemory real)
20         {
21                 this.real.deregisterObserver(this);
22                 this.real = real;
23                 real.registerObserver(this);
24                 notifyObservers(-1);
25         }
26
27         @Override
28         public MicroInstruction getCell(long address)
29         {
30                 return real.getCell(address);
31         }
32
33         @Override
34         public void setCell(long address, MicroInstruction data)
35         {
36                 real.setCell(address, data);
37         }
38
39         @Override
40         public void registerObserver(MemoryObserver ob)
41         {
42                 observers.add(ob);
43         }
44
45         @Override
46         public void deregisterObserver(MemoryObserver ob)
47         {
48                 observers.remove(ob);
49         }
50
51         @Override
52         public void notifyObservers(long address)
53         {
54                 observers.forEach(o -> o.update(address));
55         }
56
57         @Override
58         public MicroInstructionMemoryDefinition getDefinition()
59         {
60                 return real.getDefinition();
61         }
62
63         @Override
64         public void update(long address)
65         {
66                 notifyObservers(address);
67         }
68 }