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.components.atomic.ModelAndGate;
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.serializing.IndirectModelComponentCreator;
13 import net.mograsim.logic.model.snippets.Renderer;
14 import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
15 import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer;
16 import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams;
17 import net.mograsim.logic.model.util.JsonHandler;
18 import net.mograsim.machine.MainMemoryDefinition;
20 public class ModelMemoryWA extends ModelComponent
22 private final MainMemoryDefinition definition;
23 private final Pin addrPin, dataPin, rWPin;
24 private WordAddressableMemoryComponent memory;
25 private final static int width = 100, height = 300;
26 private Renderer symbolRenderer;
27 private Renderer outlineRenderer;
29 public ModelMemoryWA(LogicModelModifiable model, MainMemoryDefinition definition, String name)
31 super(model, name,false);
32 this.definition = definition;
34 CenteredTextParams renderer1Params = new CenteredTextParams();
35 renderer1Params.text = "RAM";
36 renderer1Params.fontHeight = 24;
37 this.symbolRenderer = new CenteredTextSymbolRenderer(this, renderer1Params);
38 this.outlineRenderer = new DefaultOutlineRenderer(this);
40 setSize(width, height);
41 //TODO check the usages
42 addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10));
43 addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30));
44 addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, 0, 50));
49 public Pin getAddressPin()
54 public Pin getDataPin()
59 public Pin getReadWritePin()
64 public void setCoreModelBinding(WordAddressableMemoryComponent memory)
69 public MainMemoryDefinition getDefinition()
74 public WordAddressableMemoryComponent getMemory()
80 public void render(GeneralGC gc, Rectangle visibleRegion)
82 symbolRenderer.render(gc, visibleRegion);
83 outlineRenderer.render(gc, visibleRegion);
87 public String getIDForSerializing(IdentifyParams idParams)
93 public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
95 ModelMemoryWAParams params = new ModelMemoryWAParams();
96 params.addrBits = definition.getMemoryAddressBits();
97 params.cellWidth = definition.getCellWidth();
98 params.minAddr = definition.getMinimalAddress();
99 params.maxAddr = definition.getMaximalAddress();
105 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
106 IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), (m, p, n) ->
108 ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
109 return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
113 public static class ModelMemoryWAParams
116 public int cellWidth;