From: Fabian Stemmler Date: Sun, 15 Sep 2019 00:01:39 +0000 (+0200) Subject: Added Am2900 MainMemory and MicroInstructionMemory Core/Model Components X-Git-Url: https://mograsim.net/gitweb/?p=Mograsim.git;a=commitdiff_plain;h=7b8035a065c7b64f38850907d519f9a7dfb67e24 Added Am2900 MainMemory and MicroInstructionMemory Core/Model Components --- 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 index 00000000..a673bc42 --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java @@ -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 index 00000000..5c4f52f2 --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java @@ -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 +{ + + @Override + public Class getSupportedClass() + { + return ModelAm2900MainMemory.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MainMemory modelComponent, + Map 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 index 00000000..ffaaf510 --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java @@ -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 index 00000000..fde7321f --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java @@ -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 +{ + + @Override + public Class getSupportedClass() + { + return ModelAm2900MicroInstructionMemory.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MicroInstructionMemory modelComponent, + Map 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); + } + +} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java index 134997dd..0ac06ea7 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java @@ -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() diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json index c3b221ec..c0bce38b 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json @@ -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", diff --git a/net.mograsim.machine/META-INF/MANIFEST.MF b/net.mograsim.machine/META-INF/MANIFEST.MF index d604d946..afbfc4c4 100644 --- a/net.mograsim.machine/META-INF/MANIFEST.MF +++ b/net.mograsim.machine/META-INF/MANIFEST.MF @@ -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 index 00000000..41503189 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java @@ -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 index 00000000..29793c5c --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java @@ -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 getAllInputs() + { + return List.of(address, clock); + } + + @Override + public List 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 index 00000000..34e7e806 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java @@ -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; + } +} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java index 8181283f..addb34cb 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java @@ -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 index 20f27fb9..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java +++ /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 index 00000000..7e5296d4 --- /dev/null +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java @@ -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 index a2272669..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryAdapter.java +++ /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 -{ - - @Override - public Class getSupportedClass() - { - return ModelMemoryWA.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMemoryWA modelComponent, - Map 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); - } - -} diff --git a/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java b/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java index e23ec2d0..02a4090d 100644 --- a/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java +++ b/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java @@ -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);