Fixed two problems causing memory updates to get "missed" by observers
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Sun, 15 Sep 2019 13:42:31 +0000 (15:42 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Sun, 15 Sep 2019 13:43:58 +0000 (15:43 +0200)
net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java
net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java
net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java
net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java
net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java
net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java

index 369a05f..c82f2b3 100644 (file)
@@ -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)
index ec1efa0..d45c277 100644 (file)
@@ -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()
index fcdbdc4..5221e3e 100644 (file)
@@ -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<String> getParameterDescription(int index);
index cacf799..d049e37 100644 (file)
@@ -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)
                {
index a151042..c565432 100644 (file)
@@ -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();
        }
 
 }
index 7ef53d9..519c9b3 100644 (file)
@@ -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;
        }
 
index 60902af..12b44dd 100644 (file)
@@ -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);
        }
 
index 882b031..6dc5da2 100644 (file)
@@ -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