9f5b1cc9ab8c95c158377f5f9c165f0cfbca1477
[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.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;
19
20 public class ModelMemoryWA extends ModelComponent
21 {
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;
28
29         public ModelMemoryWA(LogicModelModifiable model, MainMemoryDefinition definition, String name)
30         {
31                 super(model, name,false);
32                 this.definition = definition;
33
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);
39
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                 
46                 init();
47         }
48
49         public Pin getAddressPin()
50         {
51                 return addrPin;
52         }
53
54         public Pin getDataPin()
55         {
56                 return dataPin;
57         }
58
59         public Pin getReadWritePin()
60         {
61                 return rWPin;
62         }
63
64         public void setCoreModelBinding(WordAddressableMemoryComponent memory)
65         {
66                 this.memory = memory;
67         }
68
69         public MainMemoryDefinition getDefinition()
70         {
71                 return definition;
72         }
73
74         public WordAddressableMemoryComponent getMemory()
75         {
76                 return memory;
77         }
78
79         @Override
80         public void render(GeneralGC gc, Rectangle visibleRegion)
81         {
82                 symbolRenderer.render(gc, visibleRegion);
83                 outlineRenderer.render(gc, visibleRegion);
84         }
85
86         @Override
87         public String getIDForSerializing(IdentifyParams idParams)
88         {
89                 return "MemoryWA";
90         }
91
92         @Override
93         public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
94         {
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();
100                 return params;
101         }
102
103         static
104         {
105                 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
106                 IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), (m, p, n) ->
107                 {
108                         ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
109                         return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
110                 });
111         }
112
113         public static class ModelMemoryWAParams
114         {
115                 public int      addrBits;
116                 public int      cellWidth;
117                 public long     minAddr;
118                 public long     maxAddr;
119         }
120 }