Removed duplicate code in GUIMemoryWA; removed obsolete TODO
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / standard / memory / GUIMemoryWA.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.ViewModelModifiable;
6 import net.mograsim.logic.model.model.components.GUIComponent;
7 import net.mograsim.logic.model.model.components.atomic.GUIAndGate;
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.ViewLogicModelAdapter;
11 import net.mograsim.logic.model.serializing.IdentifierGetter;
12 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
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 GUIMemoryWA extends GUIComponent
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 GUIMemoryWA(ViewModelModifiable model, MainMemoryDefinition definition, String name)
30         {
31                 super(model, name);
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(this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10));
43                 addPin(dataPin = new Pin(this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30));
44                 addPin(rWPin = new Pin(this, "RW", 1, PinUsage.INPUT, 0, 50));
45         }
46
47         public Pin getAddressPin()
48         {
49                 return addrPin;
50         }
51
52         public Pin getDataPin()
53         {
54                 return dataPin;
55         }
56
57         public Pin getReadWritePin()
58         {
59                 return rWPin;
60         }
61
62         public void setLogicModelBinding(WordAddressableMemoryComponent memory)
63         {
64                 this.memory = memory;
65         }
66
67         public MainMemoryDefinition getDefinition()
68         {
69                 return definition;
70         }
71
72         public WordAddressableMemoryComponent getMemory()
73         {
74                 return memory;
75         }
76
77         @Override
78         public void render(GeneralGC gc, Rectangle visibleRegion)
79         {
80                 symbolRenderer.render(gc, visibleRegion);
81                 outlineRenderer.render(gc, visibleRegion);
82         }
83
84         @Override
85         public GUIMemoryWAParams getParamsForSerializing(IdentifierGetter idGetter)
86         {
87                 GUIMemoryWAParams params = new GUIMemoryWAParams();
88                 params.addrBits = definition.getMemoryAddressBits();
89                 params.cellWidth = definition.getCellWidth();
90                 params.minAddr = definition.getMinimalAddress();
91                 params.maxAddr = definition.getMaximalAddress();
92                 return params;
93         }
94
95         static
96         {
97                 ViewLogicModelAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
98                 IndirectGUIComponentCreator.setComponentSupplier(GUIAndGate.class.getCanonicalName(), (m, p, n) ->
99                 {
100                         GUIMemoryWAParams params = JsonHandler.fromJsonTree(p, GUIMemoryWAParams.class);
101                         return new GUIMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
102                 });
103         }
104
105         public static class GUIMemoryWAParams
106         {
107                 public int      addrBits;
108                 public int      cellWidth;
109                 public long     minAddr;
110                 public long     maxAddr;
111         }
112 }