Added Am2900 MainMemory and MicroInstructionMemory Core/Model Components
authorFabian Stemmler <stemmler@in.tum.de>
Sun, 15 Sep 2019 00:01:39 +0000 (02:01 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Sun, 15 Sep 2019 00:01:39 +0000 (02:01 +0200)
15 files changed:
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java [new file with mode: 0644]
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java [new file with mode: 0644]
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java [new file with mode: 0644]
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java [new file with mode: 0644]
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json
net.mograsim.machine/META-INF/MANIFEST.MF
net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java
net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java [deleted file]
net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java [new file with mode: 0644]
net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryAdapter.java [deleted file]
net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java

diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java
new file mode 100644 (file)
index 0000000..a673bc4
--- /dev/null
@@ -0,0 +1,32 @@
+package net.mograsim.logic.model.am2900.components;
+
+import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
+import net.mograsim.logic.model.serializing.IdentifyParams;
+import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
+import net.mograsim.machine.standard.memory.ModelWordAddressableMemory;
+
+public class ModelAm2900MainMemory extends ModelWordAddressableMemory
+{
+       public ModelAm2900MainMemory(LogicModelModifiable model, String name)
+       {
+               super(model, Am2900MachineDefinition.getInstance().getMainMemoryDefinition(), name);
+       }
+
+       static
+       {
+               LogicCoreAdapter.addComponentAdapter(new ModelAm2900MicroInstructionMemoryAdapter());
+               IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MainMemory.class.getCanonicalName(), (m, p, n) ->
+               {
+                       return new ModelAm2900MainMemory(m, n);
+               });
+       }
+
+       @Override
+       public String getIDForSerializing(IdentifyParams idParams)
+       {
+               return "Am2900MainMemory";
+       }
+
+}
diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java
new file mode 100644 (file)
index 0000000..5c4f52f
--- /dev/null
@@ -0,0 +1,36 @@
+package net.mograsim.logic.model.am2900.components;
+
+import java.util.Map;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.CoreWire;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.modeladapter.CoreModelParameters;
+import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter;
+import net.mograsim.machine.standard.memory.CoreWordAddressableMemory;
+import net.mograsim.machine.standard.memory.WordAddressableMemory;
+
+public class ModelAm2900MainMemoryAdapter implements ComponentAdapter<ModelAm2900MainMemory>
+{
+
+       @Override
+       public Class<ModelAm2900MainMemory> getSupportedClass()
+       {
+               return ModelAm2900MainMemory.class;
+       }
+
+       @Override
+       public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MainMemory modelComponent,
+                       Map<Pin, CoreWire> logicWiresPerPin)
+       {
+               ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd();
+               ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd();
+               ReadEnd mode = logicWiresPerPin.get(modelComponent.getReadWritePin()).createReadOnlyEnd();
+               ReadEnd clock = logicWiresPerPin.get(modelComponent.getClockPin()).createReadOnlyEnd();
+               CoreWordAddressableMemory mem = new CoreWordAddressableMemory(timeline, 2,
+                               new WordAddressableMemory(modelComponent.getDefinition()), data, mode, address, clock);
+               modelComponent.setCoreModelBinding(mem);
+       }
+}
diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java
new file mode 100644 (file)
index 0000000..ffaaf51
--- /dev/null
@@ -0,0 +1,31 @@
+package net.mograsim.logic.model.am2900.components;
+
+import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
+import net.mograsim.logic.model.serializing.IdentifyParams;
+import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
+import net.mograsim.machine.mi.components.ModelMicroInstructionMemory;
+
+public class ModelAm2900MicroInstructionMemory extends ModelMicroInstructionMemory
+{
+       public ModelAm2900MicroInstructionMemory(LogicModelModifiable model, String name)
+       {
+               super(model, Am2900MachineDefinition.getInstance().getMicroInstructionMemoryDefinition(), name);
+       }
+
+       static
+       {
+               LogicCoreAdapter.addComponentAdapter(new ModelAm2900MicroInstructionMemoryAdapter());
+               IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MicroInstructionMemory.class.getCanonicalName(), (m, p, n) ->
+               {
+                       return new ModelAm2900MicroInstructionMemory(m, n);
+               });
+       }
+
+       @Override
+       public String getIDForSerializing(IdentifyParams idParams)
+       {
+               return "Am2900MicroInstructionMemory";
+       }
+}
diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java
new file mode 100644 (file)
index 0000000..fde7321
--- /dev/null
@@ -0,0 +1,36 @@
+package net.mograsim.logic.model.am2900.components;
+
+import java.util.Map;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.CoreWire;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.modeladapter.CoreModelParameters;
+import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter;
+import net.mograsim.machine.mi.StandardMicroInstructionMemory;
+import net.mograsim.machine.mi.components.CoreMicroInstructionMemory;
+
+public class ModelAm2900MicroInstructionMemoryAdapter implements ComponentAdapter<ModelAm2900MicroInstructionMemory>
+{
+
+       @Override
+       public Class<ModelAm2900MicroInstructionMemory> getSupportedClass()
+       {
+               return ModelAm2900MicroInstructionMemory.class;
+       }
+
+       @Override
+       public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MicroInstructionMemory modelComponent,
+                       Map<Pin, CoreWire> logicWiresPerPin)
+       {
+               ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd();
+               ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd();
+               ReadEnd clock = logicWiresPerPin.get(modelComponent.getClockPin()).createReadOnlyEnd();
+               CoreMicroInstructionMemory mem = new CoreMicroInstructionMemory(timeline, 2,
+                               new StandardMicroInstructionMemory(modelComponent.getDefinition()), data, address, clock);
+               modelComponent.setCoreModelBinding(mem);
+       }
+
+}
index 134997d..0ac06ea 100644 (file)
@@ -1,10 +1,12 @@
 package net.mograsim.logic.model.am2900.machine;
 
+import java.util.Objects;
 import java.util.Set;
 
 import net.mograsim.machine.ISASchema;
 import net.mograsim.machine.Machine;
 import net.mograsim.machine.MachineDefinition;
+import net.mograsim.machine.MachineRegistry;
 import net.mograsim.machine.MainMemoryDefinition;
 import net.mograsim.machine.Register;
 import net.mograsim.machine.mi.MicroInstructionMemoryDefinition;
@@ -13,6 +15,13 @@ public class Am2900MachineDefinition implements MachineDefinition
 {
        private MainMemoryDefinition memoryDefinition = new Am2900MainMemoryDefinition();
        private MicroInstructionMemoryDefinition microInstMemoryDefinition = new Am2900MicroInstructionMemoryDefinition();
+       private final static Am2900MachineDefinition instance = new Am2900MachineDefinition();
+
+       public static Am2900MachineDefinition getInstance()
+       {
+               return Objects.requireNonNullElseGet((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"),
+                               () -> instance);
+       }
 
        @Override
        public Machine createNew()
index c3b221e..c0bce38 100644 (file)
@@ -1,5 +1,7 @@
 mograsim version: 0.1.3
 {
+  "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory",
+  "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory",
   "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode",
   "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode",
   "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA",
index d604d94..afbfc4c 100644 (file)
@@ -15,6 +15,7 @@ Export-Package: net.mograsim.machine,
  net.mograsim.machine.isa,
  net.mograsim.machine.isa.types,
  net.mograsim.machine.mi,
+ net.mograsim.machine.mi.components,
  net.mograsim.machine.mi.parameters,
  net.mograsim.machine.standard.memory
 Bundle-Activator: net.mograsim.machine.MachineLoader
diff --git a/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java b/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java
new file mode 100644 (file)
index 0000000..4150318
--- /dev/null
@@ -0,0 +1,45 @@
+package net.mograsim.machine;
+
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.snippets.Renderer;
+import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
+import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer;
+import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams;
+
+public abstract class ModelMemory extends ModelComponent
+{
+       private Renderer symbolRenderer;
+       private Renderer outlineRenderer;
+       protected final int width, height;
+
+       protected ModelMemory(LogicModelModifiable model, int width, int height, String name, String centerText, boolean callInit)
+       {
+               super(model, name, false);
+               this.width = width;
+               this.height = height;
+
+               SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams();
+               rendererParams.centerText = centerText;
+               rendererParams.centerTextHeight = 24;
+               rendererParams.horizontalComponentCenter = width / 100;
+               rendererParams.pinLabelHeight = 17.5;
+               rendererParams.pinLabelMargin = 2.5;
+               this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams);
+               this.outlineRenderer = new DefaultOutlineRenderer(this);
+
+               setSize(width, height);
+
+               if (callInit)
+                       init();
+       }
+
+       @Override
+       public void render(GeneralGC gc, Rectangle visibleRegion)
+       {
+               symbolRenderer.render(gc, visibleRegion);
+               outlineRenderer.render(gc, visibleRegion);
+       }
+}
diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java
new file mode 100644 (file)
index 0000000..29793c5
--- /dev/null
@@ -0,0 +1,61 @@
+package net.mograsim.machine.mi.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.components.BasicCoreComponent;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.TimelineEventHandler;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+import net.mograsim.machine.mi.MicroInstructionMemory;
+
+public class CoreMicroInstructionMemory extends BasicCoreComponent
+{
+       private final ReadWriteEnd data;
+       private final ReadEnd address, clock;
+       private final MicroInstructionMemory memory;
+       
+       
+       public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address, ReadEnd clock)
+       {
+               super(timeline, processTime);
+               this.memory = memory;
+               this.data = data;
+               this.address = address;
+               this.clock = clock;
+       }
+
+       public MicroInstructionMemory getMemory()
+       {
+               return memory;
+       }
+       
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(address, clock);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(data);
+       }
+
+       @Override
+       protected TimelineEventHandler compute()
+       {
+               if(clock.getValue() != Bit.ONE)
+                       return null;
+               
+               if (!address.hasNumericValue())
+               {
+                       return e -> data.feedSignals(Bit.U.toVector(data.width()));
+               }
+               long addressed = address.getUnsignedValue();
+               BitVector storedData = memory.getCell(addressed).toBitVector();
+               return e -> data.feedSignals(storedData);
+       }
+}
diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java
new file mode 100644 (file)
index 0000000..34e7e80
--- /dev/null
@@ -0,0 +1,55 @@
+package net.mograsim.machine.mi.components;
+
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.model.wires.PinUsage;
+import net.mograsim.machine.ModelMemory;
+import net.mograsim.machine.mi.MicroInstructionMemoryDefinition;
+
+public abstract class ModelMicroInstructionMemory extends ModelMemory
+{
+       private final Pin addrPin, dataPin, clock;
+       private CoreMicroInstructionMemory memory;
+       private final MicroInstructionMemoryDefinition definition;
+       
+       public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name)
+       {
+               super(model, 200, 100, name, "MPM", false);
+               this.definition = definition;
+               addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, width / 2, 0));
+               addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionDefinition().sizeInBits(), PinUsage.OUTPUT, 0, 30));
+               addPin(clock = new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 60));
+
+               init();
+       }
+
+       public MicroInstructionMemoryDefinition getDefinition()
+       {
+               return definition;
+       }
+       
+       public Pin getAddressPin()
+       {
+               return addrPin;
+       }
+
+       public Pin getDataPin()
+       {
+               return dataPin;
+       }
+
+       public Pin getClockPin()
+       {
+               return clock;
+       }
+
+       public CoreMicroInstructionMemory getCoreMemory()
+       {
+               return memory;
+       }
+       
+       public void setCoreModelBinding(CoreMicroInstructionMemory memory)
+       {
+               this.memory = memory;
+       }
+}
index 8181283..addb34c 100644 (file)
@@ -9,6 +9,7 @@ import net.mograsim.logic.core.types.Bit;
 import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+import net.mograsim.machine.MainMemory;
 import net.mograsim.machine.MainMemoryDefinition;
 
 /**
@@ -16,7 +17,7 @@ import net.mograsim.machine.MainMemoryDefinition;
  */
 public class CoreWordAddressableMemory extends BasicCoreComponent
 {
-       private final WordAddressableMemory memory;
+       private final MainMemory memory;
        private final static Bit read = Bit.ONE;
 
        private ReadWriteEnd data;
@@ -28,10 +29,11 @@ public class CoreWordAddressableMemory extends BasicCoreComponent
         * @param rWBit   The value of the 0th bit dictates the mode: 0: Write, 1: Read
         * @param address The bits of this ReadEnd address the memory cell to read/write
         */
-       public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemoryDefinition definition, ReadWriteEnd data,
+       public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemory memory, ReadWriteEnd data,
                        ReadEnd rWBit, ReadEnd address, ReadEnd clock)
        {
                super(timeline, processTime);
+               MainMemoryDefinition definition = memory.getDefinition();
                if(data.width() != definition.getCellWidth())
                        throw new IllegalArgumentException(String.format("Bit width of data wire does not match main memory definition. Expected: %d Actual: %d", definition.getCellWidth(), data.width()));
                if(rWBit.width() != 1)
@@ -47,7 +49,7 @@ public class CoreWordAddressableMemory extends BasicCoreComponent
                address.registerObserver(this);
                clock.registerObserver(this);
                
-               memory = new WordAddressableMemory(definition);
+               this.memory = memory;
        }
 
        @Override
diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java
deleted file mode 100644 (file)
index 20f27fb..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-package net.mograsim.machine.standard.memory;
-
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-import net.mograsim.logic.model.model.LogicModelModifiable;
-import net.mograsim.logic.model.model.components.ModelComponent;
-import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.logic.model.model.wires.PinUsage;
-import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
-import net.mograsim.logic.model.serializing.IdentifyParams;
-import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
-import net.mograsim.logic.model.snippets.Renderer;
-import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
-import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer;
-import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams;
-import net.mograsim.logic.model.util.JsonHandler;
-import net.mograsim.machine.MainMemoryDefinition;
-
-public class ModelMemoryWA extends ModelComponent
-{
-       private final MainMemoryDefinition              definition;
-       private final Pin                                               addrPin, dataPin, rWPin, clock;
-       private CoreWordAddressableMemory               memory;
-       private final static int                                width   = 100, height = 300;
-       private Renderer                                                symbolRenderer;
-       private Renderer                                                outlineRenderer;
-
-       public ModelMemoryWA(LogicModelModifiable model, MainMemoryDefinition definition, String name)
-       {
-               super(model, name, false);
-               this.definition = definition;
-
-               SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams();
-               rendererParams.centerText = "RAM";
-               rendererParams.centerTextHeight = 24;
-               rendererParams.horizontalComponentCenter = width / 100;
-               rendererParams.pinLabelHeight = 17.5;
-               rendererParams.pinLabelMargin = 2.5;
-               this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams);
-               this.outlineRenderer = new DefaultOutlineRenderer(this);
-
-               setSize(width, height);
-               //TODO check the usages
-               addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10));
-               addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30));
-               addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, 0, 50));
-               addPin(clock = new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 70));
-               
-               init();
-       }
-
-       public Pin getAddressPin()
-       {
-               return addrPin;
-       }
-
-       public Pin getDataPin()
-       {
-               return dataPin;
-       }
-
-       public Pin getReadWritePin()
-       {
-               return rWPin;
-       }
-       
-       public Pin getClockPin()
-       {
-               return clock;
-       }
-
-       public void setCoreModelBinding(CoreWordAddressableMemory memory)
-       {
-               this.memory = memory;
-       }
-
-       public MainMemoryDefinition getDefinition()
-       {
-               return definition;
-       }
-
-       public CoreWordAddressableMemory getMemory()
-       {
-               return memory;
-       }
-
-       @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
-       {
-               symbolRenderer.render(gc, visibleRegion);
-               outlineRenderer.render(gc, visibleRegion);
-       }
-
-       @Override
-       public String getIDForSerializing(IdentifyParams idParams)
-       {
-               return "MemoryWA";
-       }
-
-       @Override
-       public ModelMemoryWAParams getParamsForSerializing(IdentifyParams idParams)
-       {
-               ModelMemoryWAParams params = new ModelMemoryWAParams();
-               params.addrBits = definition.getMemoryAddressBits();
-               params.cellWidth = definition.getCellWidth();
-               params.minAddr = definition.getMinimalAddress();
-               params.maxAddr = definition.getMaximalAddress();
-               return params;
-       }
-
-       static
-       {
-               LogicCoreAdapter.addComponentAdapter(new WordAddressableMemoryAdapter());
-               IndirectModelComponentCreator.setComponentSupplier(ModelMemoryWA.class.getCanonicalName(), (m, p, n) ->
-               {
-                       ModelMemoryWAParams params = JsonHandler.fromJsonTree(p, ModelMemoryWAParams.class);
-                       return new ModelMemoryWA(m, MainMemoryDefinition.create(params.addrBits, params.cellWidth, params.minAddr, params.maxAddr), n);
-               });
-       }
-
-       public static class ModelMemoryWAParams
-       {
-               public int      addrBits;
-               public int      cellWidth;
-               public long     minAddr;
-               public long     maxAddr;
-       }
-}
diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java
new file mode 100644 (file)
index 0000000..7e5296d
--- /dev/null
@@ -0,0 +1,62 @@
+package net.mograsim.machine.standard.memory;
+
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.model.wires.PinUsage;
+import net.mograsim.machine.MainMemoryDefinition;
+import net.mograsim.machine.ModelMemory;
+
+public abstract class ModelWordAddressableMemory extends ModelMemory
+{
+       private final Pin addrPin, dataPin, rWPin, clock;
+       private CoreWordAddressableMemory memory;
+       private MainMemoryDefinition definition;
+
+       public ModelWordAddressableMemory(LogicModelModifiable model, MainMemoryDefinition definition, String name)
+       {
+               super(model, 100, 300, name, "RAM", false);
+               this.definition = definition;
+               
+               addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, width, 20));
+               addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, width, 50));
+               addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, width, 80));
+               addPin(clock = new Pin(model, this, "C", 1, PinUsage.INPUT, width, 110));
+
+               init();
+       }
+       
+       public MainMemoryDefinition getDefinition()
+       {
+               return definition;
+       }
+
+       public Pin getAddressPin()
+       {
+               return addrPin;
+       }
+
+       public Pin getDataPin()
+       {
+               return dataPin;
+       }
+
+       public Pin getReadWritePin()
+       {
+               return rWPin;
+       }
+
+       public Pin getClockPin()
+       {
+               return clock;
+       }
+
+       public void setCoreModelBinding(CoreWordAddressableMemory memory)
+       {
+               this.memory = memory;
+       }
+
+       public CoreWordAddressableMemory getCoreMemory()
+       {
+               return memory;
+       }
+}
diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryAdapter.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryAdapter.java
deleted file mode 100644 (file)
index a227266..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package net.mograsim.machine.standard.memory;
-
-import java.util.Map;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.CoreWire;
-import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
-import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
-import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.logic.model.modeladapter.CoreModelParameters;
-import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter;
-
-public class WordAddressableMemoryAdapter implements ComponentAdapter<ModelMemoryWA>
-{
-
-       @Override
-       public Class<ModelMemoryWA> getSupportedClass()
-       {
-               return ModelMemoryWA.class;
-       }
-
-       @Override
-       public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMemoryWA modelComponent,
-                       Map<Pin, CoreWire> logicWiresPerPin)
-       {
-               ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd();
-               ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd();
-               ReadEnd mode = logicWiresPerPin.get(modelComponent.getReadWritePin()).createReadOnlyEnd();
-               ReadEnd clock = logicWiresPerPin.get(modelComponent.getClockPin()).createReadOnlyEnd();
-               CoreWordAddressableMemory mem = new CoreWordAddressableMemory(timeline, 2, modelComponent.getDefinition(), data, mode, address, clock);
-               modelComponent.setCoreModelBinding(mem);
-       }
-
-}
index e23ec2d..02a4090 100644 (file)
@@ -31,7 +31,7 @@ class WordAddressableMemoryTest {
                ReadWriteEnd clockI = clock.createReadWriteEnd();
 
                @SuppressWarnings("unused")
-               CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4, MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE), data.createReadWriteEnd(),
+               CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4, new WordAddressableMemory(MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE)), data.createReadWriteEnd(),
                                rW.createReadOnlyEnd(), address.createReadOnlyEnd(), clock.createReadOnlyEnd());
 
                clockI.feedSignals(Bit.ONE);