1 package net.mograsim.machine.mi.components;
3 import java.util.ArrayList;
5 import java.util.function.Consumer;
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;
17 public abstract class ModelMicroInstructionMemory extends ModelMemory
19 private final Pin addrPin, dataPin;
20 private CoreMicroInstructionMemory memory;
21 private final MicroInstructionMemoryDefinition definition;
23 private final List<Consumer<Object>> memoryBindingListeners;
25 public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name)
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(),
33 memoryBindingListeners = new ArrayList<>();
35 setHighLevelStateHandler(new HighLevelStateHandler()
38 public Object get(String stateID)
40 if (stateID.equals("memory_binding"))
41 return memory.getMemory();
42 throw new IllegalArgumentException("No high level state with ID " + stateID);
46 public void set(String stateID, Object newState)
48 if (stateID.equals("memory_binding"))
50 memory.setMemory((MicroInstructionMemory) newState);
51 memoryBindingListeners.forEach(l -> l.accept(newState));
53 throw new IllegalArgumentException("No high level state with ID " + stateID);
57 public void addListener(String stateID, Consumer<Object> stateChanged)
59 if (stateID.equals("memory_binding"))
60 memoryBindingListeners.add(stateChanged);
62 throw new IllegalArgumentException("No high level state with ID " + stateID);
66 public void removeListener(String stateID, Consumer<Object> stateChanged)
68 if (stateID.equals("memory_binding"))
69 memoryBindingListeners.remove(stateChanged);
71 throw new IllegalArgumentException("No high level state with ID " + stateID);
75 public String getIDForSerializing(IdentifyParams idParams)
81 public Object getParamsForSerializing(IdentifyParams idParams)
90 public MicroInstructionMemoryDefinition getDefinition()
95 public Pin getAddressPin()
100 public Pin getDataPin()
105 public CoreMicroInstructionMemory getCoreMemory()
110 public void setCoreModelBinding(CoreMicroInstructionMemory memory)
112 this.memory = memory;
117 LogicCoreAdapter.addComponentAdapter(new MicroInstructionMemoryAdapter());