Added Clock input to CoreWordAddressableMemory
[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, clock;
24         private CoreWordAddressableMemory       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                 addPin(clock = new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 70));
46                 
47                 init();
48         }
49
50         public Pin getAddressPin()
51         {
52                 return addrPin;
53         }
54
55         public Pin getDataPin()
56         {
57                 return dataPin;
58         }
59
60         public Pin getReadWritePin()
61         {
62                 return rWPin;
63         }
64         
65         public Pin getClockPin()
66         {
67                 return clock;
68         }
69
70         public void setCoreModelBinding(CoreWordAddressableMemory memory)
71         {
72                 this.memory = memory;
73         }
74
75         public MainMemoryDefinition getDefinition()
76         {
77                 return definition;
78         }
79
80         public CoreWordAddressableMemory getMemory()
81         {
82                 return memory;
83         }
84
85         @Override
86         public void render(GeneralGC gc, Rectangle visibleRegion)
87         {
88                 symbolRenderer.render(gc, visibleRegion);
89                 outlineRenderer.render(gc, visibleRegion);
90         }
91
92         @Override
93         public String getIDForSerializing(IdentifyParams idParams)
94         {
95                 return "MemoryWA";
96         }
97
98         @Override
99         public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
100         {
101                 ModelMemoryWAParams params = new ModelMemoryWAParams();
102                 params.addrBits = definition.getMemoryAddressBits();
103                 params.cellWidth = definition.getCellWidth();
104                 params.minAddr = definition.getMinimalAddress();
105                 params.maxAddr = definition.getMaximalAddress();
106                 return params;
107         }
108
109         static
110         {
111                 LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
112                 IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), (m, p, n) ->
113                 {
114                         ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
115                         return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
116                 });
117         }
118
119         public static class ModelMemoryWAParams
120         {
121                 public int      addrBits;
122                 public int      cellWidth;
123                 public long     minAddr;
124                 public long     maxAddr;
125         }
126 }