From d7f31fafc300b0c7fd1265574507c37a697aadab Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Sun, 15 Sep 2019 15:42:31 +0200 Subject: [PATCH] Fixed two problems causing memory updates to get "missed" by observers --- .../logic/core/components/BasicCoreComponent.java | 5 +++++ .../net/mograsim/machine/mi/MicroInstruction.java | 4 ++-- .../machine/mi/MicroInstructionDefinition.java | 6 +++--- .../machine/mi/MicroInstructionMemoryParser.java | 14 ++++++++++---- .../machine/mi/StandardMicroInstruction.java | 5 ++++- .../machine/mi/StandardMicroInstructionMemory.java | 3 ++- .../mi/components/CoreMicroInstructionMemory.java | 1 + .../standard/memory/CoreWordAddressableMemory.java | 4 ++-- 8 files changed, 29 insertions(+), 13 deletions(-) diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java index 369a05fe..c82f2b37 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java @@ -28,6 +28,11 @@ public abstract class BasicCoreComponent extends CoreComponent implements LogicO @Override public final void update(LogicObservable initiator) + { + update(); + } + + public void update() { TimelineEventHandler delayedUpdates = compute(); if (delayedUpdates != null) diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java index ec1efa0a..d45c2772 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java @@ -16,9 +16,9 @@ public interface MicroInstruction */ public int getSize(); - public static MicroInstruction create(MicroInstructionParameter... parameters) + public static MicroInstruction create(Runnable updateCallback, MicroInstructionParameter... parameters) { - return new StandardMicroInstruction(parameters); + return new StandardMicroInstruction(updateCallback, parameters); } default BitVector toBitVector() diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java index fcdbdc48..5221e3e9 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java @@ -8,9 +8,9 @@ import net.mograsim.logic.core.types.Bit; import net.mograsim.machine.mi.parameters.IntegerClassification; import net.mograsim.machine.mi.parameters.IntegerImmediate; import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; import net.mograsim.machine.mi.parameters.MnemonicFamily; import net.mograsim.machine.mi.parameters.ParameterClassification; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; public interface MicroInstructionDefinition { @@ -40,7 +40,7 @@ public interface MicroInstructionDefinition return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b); } - public default MicroInstruction createDefaultInstruction() + public default MicroInstruction createDefaultInstruction(Runnable updateCallback) { int size = size(); MicroInstructionParameter[] params = new MicroInstructionParameter[size]; @@ -64,7 +64,7 @@ public interface MicroInstructionDefinition } params[i] = newParam; } - return new StandardMicroInstruction(params); + return new StandardMicroInstruction(updateCallback, params); } public Optional getParameterDescription(int index); diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java index cacf7998..d049e377 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -34,7 +34,10 @@ public class MicroInstructionMemoryParser try { for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) - memory.setCell(i, parse(miDef, line)); + { + long iFinal = i; + memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line)); + } } catch (IOException e) { @@ -42,10 +45,13 @@ public class MicroInstructionMemoryParser } for (; i <= maxAddr; i++) - memory.setCell(i, miDef.createDefaultInstruction()); + { + long iFinal = i; + memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); + } } - public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) + public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse) { int size = definition.size(); String[] strings = toParse.split(","); @@ -59,7 +65,7 @@ public class MicroInstructionMemoryParser { params[i] = classes[i].parse(strings[i]); } - return new StandardMicroInstruction(params); + return new StandardMicroInstruction(updateCallback, params); } catch (Exception e) { diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java index a151042d..c565432f 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java @@ -4,10 +4,12 @@ import net.mograsim.machine.mi.parameters.MicroInstructionParameter; class StandardMicroInstruction implements MicroInstruction { + private final Runnable updateCallback; private MicroInstructionParameter[] parameters; - StandardMicroInstruction(MicroInstructionParameter... parameters) + StandardMicroInstruction(Runnable updateCallback, MicroInstructionParameter... parameters) { + this.updateCallback = updateCallback; this.parameters = parameters; } @@ -33,6 +35,7 @@ class StandardMicroInstruction implements MicroInstruction public void setParameter(int index, MicroInstructionParameter param) { parameters[index] = param; + updateCallback.run(); } } diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java index 7ef53d90..519c9b3a 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -30,7 +30,8 @@ public class StandardMicroInstructionMemory implements MicroInstructionMemory int translatedAddress = translate(address); MicroInstruction actual = data[translatedAddress]; if (actual == null) - actual = data[translatedAddress] = definition.getMicroInstructionDefinition().createDefaultInstruction(); + actual = data[translatedAddress] = definition.getMicroInstructionDefinition() + .createDefaultInstruction(() -> notifyObservers(address)); return actual; } 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 index 60902af2..12b44ddd 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java @@ -23,6 +23,7 @@ public class CoreMicroInstructionMemory extends BasicCoreComponent this.memory = memory; this.data = data; this.address = address; + memory.registerObserver(a -> update()); address.registerObserver(this); } 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 882b031a..6dc5da2d 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 @@ -45,14 +45,14 @@ public class CoreWordAddressableMemory extends BasicCoreComponent 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.memory = memory; this.data = data; this.rWBit = rWBit; this.address = address; + memory.registerObserver(a -> update()); data.registerObserver(this); rWBit.registerObserver(this); address.registerObserver(this); - - this.memory = memory; } @Override -- 2.17.1