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, clock;
23 private CoreWordAddressableMemory 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));
47 addPin(clock = new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 70));
52 public Pin getAddressPin()
57 public Pin getDataPin()
62 public Pin getReadWritePin()
67 public Pin getClockPin()
72 public void setCoreModelBinding(CoreWordAddressableMemory memory)
77 public MainMemoryDefinition getDefinition()
82 public CoreWordAddressableMemory getMemory()
88 public void render(GeneralGC gc, Rectangle visibleRegion)
90 symbolRenderer.render(gc, visibleRegion);
91 outlineRenderer.render(gc, visibleRegion);
95 public String getIDForSerializing(IdentifyParams idParams)
101 public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
103 ModelMemoryWAParams params = new ModelMemoryWAParams();
104 params.addrBits = definition.getMemoryAddressBits();
105 params.cellWidth = definition.getCellWidth();
106 params.minAddr = definition.getMinimalAddress();
107 params.maxAddr = definition.getMaximalAddress();
113 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
114 IndirectModelComponentCreator.setComponentSupplier(ModelMemoryWA.class.getCanonicalName(), (m, p, n) ->
116 ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
117 return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
121 public static class ModelMemoryWAParams
124 public int cellWidth;