Renamed logic to core where appropiate
[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.ViewModelModifiable;
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(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 setCoreModelBinding(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 String getIDForSerializing(IdentifyParams idParams)
86         {
87                 return "MemoryWA";
88         }
89
90         @Override
91         public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
92         {
93                 ModelMemoryWAParams params = new ModelMemoryWAParams();
94                 params.addrBits = definition.getMemoryAddressBits();
95                 params.cellWidth = definition.getCellWidth();
96                 params.minAddr = definition.getMinimalAddress();
97                 params.maxAddr = definition.getMaximalAddress();
98                 return params;
99         }
100
101         static
102         {
103                 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
104                 IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), (m, p, n) ->
105                 {
106                         ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
107                         return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
108                 });
109         }
110
111         public static class ModelMemoryWAParams
112         {
113                 public int      addrBits;
114                 public int      cellWidth;
115                 public long     minAddr;
116                 public long     maxAddr;
117         }
118 }