1 package net.mograsim.machine.standard.memory;
3 import net.haspamelodica.swt.helper.gcs.GeneralGC;
4 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
5 import net.mograsim.logic.model.model.LogicModelModifiable;
6 import net.mograsim.logic.model.model.components.ModelComponent;
7 import net.mograsim.logic.model.model.wires.Pin;
8 import net.mograsim.logic.model.model.wires.PinUsage;
9 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
10 import net.mograsim.logic.model.serializing.IdentifyParams;
11 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
12 import net.mograsim.logic.model.snippets.Renderer;
13 import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
14 import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer;
15 import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams;
16 import net.mograsim.logic.model.util.JsonHandler;
17 import net.mograsim.machine.MainMemoryDefinition;
19 public class ModelMemoryWA extends ModelComponent
21 private final MainMemoryDefinition definition;
22 private final Pin addrPin, dataPin, rWPin;
23 private WordAddressableMemoryComponent memory;
24 private final static int width = 100, height = 300;
25 private Renderer symbolRenderer;
26 private Renderer outlineRenderer;
28 public ModelMemoryWA(LogicModelModifiable model, MainMemoryDefinition definition, String name)
30 super(model, name, false);
31 this.definition = definition;
33 SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams();
34 rendererParams.centerText = "RAM";
35 rendererParams.centerTextHeight = 24;
36 rendererParams.horizontalComponentCenter = width / 100;
37 rendererParams.pinLabelHeight = 17.5;
38 rendererParams.pinLabelMargin = 2.5;
39 this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams);
40 this.outlineRenderer = new DefaultOutlineRenderer(this);
42 setSize(width, height);
43 //TODO check the usages
44 addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10));
45 addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30));
46 addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, 0, 50));
51 public Pin getAddressPin()
56 public Pin getDataPin()
61 public Pin getReadWritePin()
66 public void setCoreModelBinding(WordAddressableMemoryComponent memory)
71 public MainMemoryDefinition getDefinition()
76 public WordAddressableMemoryComponent getMemory()
82 public void render(GeneralGC gc, Rectangle visibleRegion)
84 symbolRenderer.render(gc, visibleRegion);
85 outlineRenderer.render(gc, visibleRegion);
89 public String getIDForSerializing(IdentifyParams idParams)
95 public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
97 ModelMemoryWAParams params = new ModelMemoryWAParams();
98 params.addrBits = definition.getMemoryAddressBits();
99 params.cellWidth = definition.getCellWidth();
100 params.minAddr = definition.getMinimalAddress();
101 params.maxAddr = definition.getMaximalAddress();
107 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
108 IndirectModelComponentCreator.setComponentSupplier(ModelMemoryWA.class.getCanonicalName(), (m, p, n) ->
110 ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
111 return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
115 public static class ModelMemoryWAParams
118 public int cellWidth;