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, clock;
24 private CoreWordAddressableMemory 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));
45 addPin(clock = new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 70));
50 public Pin getAddressPin()
55 public Pin getDataPin()
60 public Pin getReadWritePin()
65 public Pin getClockPin()
70 public void setCoreModelBinding(CoreWordAddressableMemory memory)
75 public MainMemoryDefinition getDefinition()
80 public CoreWordAddressableMemory getMemory()
86 public void render(GeneralGC gc, Rectangle visibleRegion)
88 symbolRenderer.render(gc, visibleRegion);
89 outlineRenderer.render(gc, visibleRegion);
93 public String getIDForSerializing(IdentifyParams idParams)
99 public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
101 ModelMemoryWAParams params = new ModelMemoryWAParams();
102 params.addrBits = definition.getMemoryAddressBits();
103 params.cellWidth = definition.getCellWidth();
104 params.minAddr = definition.getMinimalAddress();
105 params.maxAddr = definition.getMaximalAddress();
111 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
112 IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), (m, p, n) ->
114 ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
115 return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
119 public static class ModelMemoryWAParams
122 public int cellWidth;