Added the possibility for having machine descriptions
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / components / ModelMicroInstructionMemory.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.MicroInstructionMemory;
15 import net.mograsim.machine.mi.MicroInstructionMemoryDefinition;
16
17 public abstract class ModelMicroInstructionMemory extends ModelMemory
18 {
19         private final Pin addrPin, dataPin;
20         private CoreMicroInstructionMemory memory;
21         private final MicroInstructionMemoryDefinition definition;
22
23         private final List<Consumer<Object>> memoryBindingListeners;
24
25         public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name)
26         {
27                 super(model, 120, 150, name, "MPM", 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.getMicroInstructionDefinition().sizeInBits(), PinUsage.OUTPUT, getWidth(),
31                                 50));
32
33                 memoryBindingListeners = new ArrayList<>();
34
35                 setHighLevelStateHandler(new HighLevelStateHandler()
36                 {
37                         @Override
38                         public Object get(String stateID)
39                         {
40                                 if (stateID.equals("memory_binding"))
41                                         return memory.getMemory();
42                                 throw new IllegalArgumentException("No high level state with ID " + stateID);
43                         }
44
45                         @Override
46                         public void set(String stateID, Object newState)
47                         {
48                                 if (stateID.equals("memory_binding"))
49                                 {
50                                         memory.setMemory((MicroInstructionMemory) newState);
51                                         memoryBindingListeners.forEach(l -> l.accept(newState));
52                                 } else
53                                         throw new IllegalArgumentException("No high level state with ID " + stateID);
54                         }
55
56                         @Override
57                         public void addListener(String stateID, Consumer<Object> stateChanged)
58                         {
59                                 if (stateID.equals("memory_binding"))
60                                         memoryBindingListeners.add(stateChanged);
61                                 else
62                                         throw new IllegalArgumentException("No high level state with ID " + stateID);
63                         }
64
65                         @Override
66                         public void removeListener(String stateID, Consumer<Object> stateChanged)
67                         {
68                                 if (stateID.equals("memory_binding"))
69                                         memoryBindingListeners.remove(stateChanged);
70                                 else
71                                         throw new IllegalArgumentException("No high level state with ID " + stateID);
72                         }
73
74                         @Override
75                         public String getIDForSerializing(IdentifyParams idParams)
76                         {
77                                 return null;
78                         }
79
80                         @Override
81                         public Object getParamsForSerializing(IdentifyParams idParams)
82                         {
83                                 return null;
84                         }
85                 });
86
87                 init();
88         }
89
90         public MicroInstructionMemoryDefinition getDefinition()
91         {
92                 return definition;
93         }
94
95         public Pin getAddressPin()
96         {
97                 return addrPin;
98         }
99
100         public Pin getDataPin()
101         {
102                 return dataPin;
103         }
104
105         public CoreMicroInstructionMemory getCoreMemory()
106         {
107                 return memory;
108         }
109
110         public void setCoreModelBinding(CoreMicroInstructionMemory memory)
111         {
112                 this.memory = memory;
113         }
114
115         static
116         {
117                 LogicCoreAdapter.addComponentAdapter(new MicroInstructionMemoryAdapter());
118         }
119 }