20f27fb92ab722e11a3a961c91c31ac26bb7e4fd
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / standard / memory / ModelMemoryWA.java
1 package net.mograsim.machine.standard.memory;
2
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;
18
19 public class ModelMemoryWA extends ModelComponent
20 {
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;
27
28         public ModelMemoryWA(LogicModelModifiable model, MainMemoryDefinition definition, String name)
29         {
30                 super(model, name, false);
31                 this.definition = definition;
32
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);
41
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));
48                 
49                 init();
50         }
51
52         public Pin getAddressPin()
53         {
54                 return addrPin;
55         }
56
57         public Pin getDataPin()
58         {
59                 return dataPin;
60         }
61
62         public Pin getReadWritePin()
63         {
64                 return rWPin;
65         }
66         
67         public Pin getClockPin()
68         {
69                 return clock;
70         }
71
72         public void setCoreModelBinding(CoreWordAddressableMemory memory)
73         {
74                 this.memory = memory;
75         }
76
77         public MainMemoryDefinition getDefinition()
78         {
79                 return definition;
80         }
81
82         public CoreWordAddressableMemory getMemory()
83         {
84                 return memory;
85         }
86
87         @Override
88         public void render(GeneralGC gc, Rectangle visibleRegion)
89         {
90                 symbolRenderer.render(gc, visibleRegion);
91                 outlineRenderer.render(gc, visibleRegion);
92         }
93
94         @Override
95         public String getIDForSerializing(IdentifyParams idParams)
96         {
97                 return "MemoryWA";
98         }
99
100         @Override
101         public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
102         {
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();
108                 return params;
109         }
110
111         static
112         {
113                 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
114                 IndirectModelComponentCreator.setComponentSupplier(ModelMemoryWA.class.getCanonicalName(), (m, p, n) ->
115                 {
116                         ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
117                         return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
118                 });
119         }
120
121         public static class ModelMemoryWAParams
122         {
123                 public int      addrBits;
124                 public int      cellWidth;
125                 public long     minAddr;
126                 public long     maxAddr;
127         }
128 }