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