X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fstandard%2Fmemory%2FCoreWordAddressableMemory.java;h=882b031ac194296e18b69fe3e9f43486dc1e14c5;hb=4ba119cab03498736851e6f3f32eec1957839a2e;hp=8181283fec5f5578807c07bd344ccbb94f65490c;hpb=52db0db90ba1361e96c0313b6e51817ef4891c49;p=Mograsim.git 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..882b031a 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,11 +17,11 @@ 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; - private ReadEnd rWBit, address, clock; + private ReadEnd rWBit, address; /** * @param data The bits of this ReadEnd are the value that is written to/read from memory; The bit width of this wire is the width of @@ -28,38 +29,39 @@ 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, - ReadEnd rWBit, ReadEnd address, ReadEnd clock) + public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemory memory, ReadWriteEnd data, ReadEnd rWBit, + ReadEnd address) { super(timeline, processTime); - 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) - throw new IllegalArgumentException(String.format("Bit width of read/write mode select wire is unexpected. Expected: 1 Actual: %d", rWBit.width())); - if(address.width() != definition.getMemoryAddressBits()) - throw new IllegalArgumentException(String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d", definition.getMemoryAddressBits(), address.width())); + 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) + throw new IllegalArgumentException( + String.format("Bit width of read/write mode select wire is unexpected. Expected: 1 Actual: %d", rWBit.width())); + if (address.width() != definition.getMemoryAddressBits()) + throw new IllegalArgumentException( + String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d", + definition.getMemoryAddressBits(), address.width())); this.data = data; this.rWBit = rWBit; this.address = address; - this.clock = clock; data.registerObserver(this); rWBit.registerObserver(this); address.registerObserver(this); - clock.registerObserver(this); - - memory = new WordAddressableMemory(definition); + + this.memory = memory; } @Override protected TimelineEventHandler compute() { - if(clock.getValue() != Bit.ONE) - return null; - if (!address.hasNumericValue()) { if (read.equals(rWBit.getValue())) - return e -> data.feedSignals(Bit.U.toVector(data.width())); + return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. return e -> data.clearSignals(); } long addressed = address.getUnsignedValue(); @@ -67,8 +69,7 @@ public class CoreWordAddressableMemory extends BasicCoreComponent { BitVector storedData = memory.getCell(addressed); return e -> data.feedSignals(storedData); - } - else + } else { BitVector transData = data.getValues(); return e ->