X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2Fcomponents%2FModelMPROM.java;fp=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2Fcomponents%2FModelMPROM.java;h=b1f791c2d40b03cd81dcf7fba0ae877a75663c26;hb=d8745744bfff69076608f30e60c0d86d1f115833;hp=0000000000000000000000000000000000000000;hpb=1c5ecbd9dc7fd2f410aeacf9532d57b3637e938e;p=Mograsim.git diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMPROM.java new file mode 100644 index 00000000..b1f791c2 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMPROM.java @@ -0,0 +1,118 @@ +package net.mograsim.machine.mi.components; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.machine.ModelMemory; +import net.mograsim.machine.mi.MPROM; +import net.mograsim.machine.mi.MPROMDefinition; + +public abstract class ModelMPROM extends ModelMemory +{ + private final Pin addrPin, dataPin; + private CoreMPROM memory; + private final MPROMDefinition definition; + + private final List> memoryBindingListeners; + + public ModelMPROM(LogicModelModifiable model, MPROMDefinition definition, String name) + { + super(model, 30, 80, name, "MPROM", false); + this.definition = definition; + addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); + addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionMemoryAddressBits(), PinUsage.OUTPUT, getWidth(), 50)); + + memoryBindingListeners = new ArrayList<>(); + + setHighLevelStateHandler(new HighLevelStateHandler() + { + @Override + public Object get(String stateID) + { + if (stateID.equals("memory_binding")) + return memory.getMemory(); + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void set(String stateID, Object newState) + { + if (stateID.equals("memory_binding")) + { + memory.setMemory((MPROM) newState); + memoryBindingListeners.forEach(l -> l.accept(newState)); + } else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void addListener(String stateID, Consumer stateChanged) + { + if (stateID.equals("memory_binding")) + memoryBindingListeners.add(stateChanged); + else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void removeListener(String stateID, Consumer stateChanged) + { + if (stateID.equals("memory_binding")) + memoryBindingListeners.remove(stateChanged); + else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + }); + + init(); + } + + public MPROMDefinition getDefinition() + { + return definition; + } + + public Pin getAddressPin() + { + return addrPin; + } + + public Pin getDataPin() + { + return dataPin; + } + + public CoreMPROM getCoreMemory() + { + return memory; + } + + public void setCoreModelBinding(CoreMPROM memory) + { + this.memory = memory; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new MPROMAdapter()); + } +} \ No newline at end of file