Implemented some infrastructure for MPROMs
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / components / ModelMPROM.java
1 package net.mograsim.machine.mi.components;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.function.Consumer;
6
7 import net.mograsim.logic.model.model.LogicModelModifiable;
8 import net.mograsim.logic.model.model.wires.Pin;
9 import net.mograsim.logic.model.model.wires.PinUsage;
10 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
11 import net.mograsim.logic.model.serializing.IdentifyParams;
12 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
13 import net.mograsim.machine.ModelMemory;
14 import net.mograsim.machine.mi.MPROM;
15 import net.mograsim.machine.mi.MPROMDefinition;
16
17 public abstract class ModelMPROM extends ModelMemory
18 {
19         private final Pin addrPin, dataPin;
20         private CoreMPROM memory;
21         private final MPROMDefinition definition;
22
23         private final List<Consumer<Object>> memoryBindingListeners;
24
25         public ModelMPROM(LogicModelModifiable model, MPROMDefinition definition, String name)
26         {
27                 super(model, 30, 80, name, "MPROM", false);
28                 this.definition = definition;
29                 addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30));
30                 addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionMemoryAddressBits(), PinUsage.OUTPUT, getWidth(), 50));
31
32                 memoryBindingListeners = new ArrayList<>();
33
34                 setHighLevelStateHandler(new HighLevelStateHandler()
35                 {
36                         @Override
37                         public Object get(String stateID)
38                         {
39                                 if (stateID.equals("memory_binding"))
40                                         return memory.getMemory();
41                                 throw new IllegalArgumentException("No high level state with ID " + stateID);
42                         }
43
44                         @Override
45                         public void set(String stateID, Object newState)
46                         {
47                                 if (stateID.equals("memory_binding"))
48                                 {
49                                         memory.setMemory((MPROM) newState);
50                                         memoryBindingListeners.forEach(l -> l.accept(newState));
51                                 } else
52                                         throw new IllegalArgumentException("No high level state with ID " + stateID);
53                         }
54
55                         @Override
56                         public void addListener(String stateID, Consumer<Object> stateChanged)
57                         {
58                                 if (stateID.equals("memory_binding"))
59                                         memoryBindingListeners.add(stateChanged);
60                                 else
61                                         throw new IllegalArgumentException("No high level state with ID " + stateID);
62                         }
63
64                         @Override
65                         public void removeListener(String stateID, Consumer<Object> stateChanged)
66                         {
67                                 if (stateID.equals("memory_binding"))
68                                         memoryBindingListeners.remove(stateChanged);
69                                 else
70                                         throw new IllegalArgumentException("No high level state with ID " + stateID);
71                         }
72
73                         @Override
74                         public String getIDForSerializing(IdentifyParams idParams)
75                         {
76                                 return null;
77                         }
78
79                         @Override
80                         public Object getParamsForSerializing(IdentifyParams idParams)
81                         {
82                                 return null;
83                         }
84                 });
85
86                 init();
87         }
88
89         public MPROMDefinition getDefinition()
90         {
91                 return definition;
92         }
93
94         public Pin getAddressPin()
95         {
96                 return addrPin;
97         }
98
99         public Pin getDataPin()
100         {
101                 return dataPin;
102         }
103
104         public CoreMPROM getCoreMemory()
105         {
106                 return memory;
107         }
108
109         public void setCoreModelBinding(CoreMPROM memory)
110         {
111                 this.memory = memory;
112         }
113
114         static
115         {
116                 LogicCoreAdapter.addComponentAdapter(new MPROMAdapter());
117         }
118 }