X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FModelMemoryWA.java;fp=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FModelMemoryWA.java;h=8da1dbb28a68c5574e3f0923f7f8529b7eeffc82;hb=93b398d6271a538a2a4c9f4de07a3b4a8a2a7fd4;hp=0000000000000000000000000000000000000000;hpb=0a04a4ed66ecebd4254541c4977599f6052c115a;p=Mograsim.git diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java new file mode 100644 index 00000000..8da1dbb2 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java @@ -0,0 +1,118 @@ +package net.mograsim.machine.standard.memory; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.ViewModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelAndGate; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.machine.MainMemoryDefinition; + +public class ModelMemoryWA extends ModelComponent +{ + private final MainMemoryDefinition definition; + private final Pin addrPin, dataPin, rWPin; + private WordAddressableMemoryComponent memory; + private final static int width = 100, height = 300; + private Renderer symbolRenderer; + private Renderer outlineRenderer; + + public ModelMemoryWA(ViewModelModifiable model, MainMemoryDefinition definition, String name) + { + super(model, name); + this.definition = definition; + + CenteredTextParams renderer1Params = new CenteredTextParams(); + renderer1Params.text = "RAM"; + renderer1Params.fontHeight = 24; + this.symbolRenderer = new CenteredTextSymbolRenderer(this, renderer1Params); + this.outlineRenderer = new DefaultOutlineRenderer(this); + + setSize(width, height); + //TODO check the usages + addPin(addrPin = new Pin(this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10)); + addPin(dataPin = new Pin(this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30)); + addPin(rWPin = new Pin(this, "RW", 1, PinUsage.INPUT, 0, 50)); + } + + public Pin getAddressPin() + { + return addrPin; + } + + public Pin getDataPin() + { + return dataPin; + } + + public Pin getReadWritePin() + { + return rWPin; + } + + public void setLogicModelBinding(WordAddressableMemoryComponent memory) + { + this.memory = memory; + } + + public MainMemoryDefinition getDefinition() + { + return definition; + } + + public WordAddressableMemoryComponent getMemory() + { + return memory; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + symbolRenderer.render(gc, visibleRegion); + outlineRenderer.render(gc, visibleRegion); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "MemoryWA"; + } + + @Override + public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams) + { + ModelMemoryWAParams params = new ModelMemoryWAParams(); + params.addrBits = definition.getMemoryAddressBits(); + params.cellWidth = definition.getCellWidth(); + params.minAddr = definition.getMinimalAddress(); + params.maxAddr = definition.getMaximalAddress(); + return params; + } + + static + { + ViewLogicModelAdapter.addComponentAdapter(new WordAddressableMemoryAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), (m, p, n) -> + { + ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class); + return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n); + }); + } + + public static class ModelMemoryWAParams + { + public int addrBits; + public int cellWidth; + public long minAddr; + public long maxAddr; + } +}