Merge branch 'development' of
[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         }
25
26         @Override
27         public MicroInstruction getCell(long address)
28         {
29                 return real.getCell(address);
30         }
31
32         @Override
33         public void setCell(long address, MicroInstruction data)
34         {
35                 real.setCell(address, data);
36         }
37
38         @Override
39         public void registerObserver(MemoryObserver ob)
40         {
41                 observers.add(ob);
42         }
43
44         @Override
45         public void deregisterObserver(MemoryObserver ob)
46         {
47                 observers.remove(ob);
48         }
49
50         @Override
51         public void notifyObservers(long address)
52         {
53                 observers.forEach(o -> o.update(address));
54         }
55
56         @Override
57         public MicroInstructionMemoryDefinition getDefinition()
58         {
59                 return real.getDefinition();
60         }
61
62         @Override
63         public void update(long address)
64         {
65                 notifyObservers(address);
66         }
67 }