From: Fabian Stemmler Date: Sun, 8 Sep 2019 14:21:39 +0000 (+0200) Subject: CoreComponents now have a transport delay X-Git-Url: https://mograsim.net/gitweb/?p=Mograsim.git;a=commitdiff_plain;h=62435458a06f909dc66eaac01c5b53e2dc4fa59f CoreComponents now have a transport delay There is now an issue with simultaneous signal changes, because the generated events might not be executed in the order in which they are created. --- 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 9f3da4a2..369a05fe 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 @@ -3,6 +3,7 @@ package net.mograsim.logic.core.components; import net.mograsim.logic.core.LogicObservable; import net.mograsim.logic.core.LogicObserver; import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; /** * A basic component that recomputes all outputs (with a delay), when it is updated. @@ -26,10 +27,12 @@ public abstract class BasicCoreComponent extends CoreComponent implements LogicO } @Override - public void update(LogicObservable initiator) + public final void update(LogicObservable initiator) { - timeline.addEvent(e -> compute(), processTime); + TimelineEventHandler delayedUpdates = compute(); + if (delayedUpdates != null) + timeline.addEvent(delayedUpdates, processTime); } - protected abstract void compute(); + protected abstract TimelineEventHandler compute(); } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java index 8cd509c4..345bc0ab 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java @@ -7,6 +7,7 @@ import java.util.List; import net.mograsim.logic.core.LogicObservable; import net.mograsim.logic.core.LogicObserver; 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; @@ -28,10 +29,14 @@ public class CoreBitDisplay extends BasicCoreComponent implements LogicObservabl } @Override - protected void compute() + protected TimelineEventHandler compute() { - displayedValue = in.getValues(); - notifyObservers(); + BitVector newValues = in.getValues(); + return e -> + { + displayedValue = newValues; + notifyObservers(); + }; } public BitVector getDisplayedValue() diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java index a5bb0fc6..76982e00 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java @@ -3,6 +3,8 @@ package net.mograsim.logic.core.components; import java.util.List; import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.core.wires.CoreWire; import net.mograsim.logic.core.wires.CoreWire.ReadEnd; import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; @@ -53,19 +55,27 @@ public class CoreDemux extends BasicCoreComponent } @Override - public void compute() + public TimelineEventHandler compute() { int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1; if (selectValue >= outputs.length) selectValue = -1; - if (selected != selectValue && selected != -1) - outputs[selected].clearSignals(); + boolean hasOldSelection = selected != selectValue && selected != -1; + int oldSelection = selected; + boolean hasNewSelection = selectValue != -1; + int newSelection = selectValue; + BitVector inputValues = in.getValues(); selected = selectValue; - if (selectValue != -1) - outputs[selectValue].feedSignals(in.getValues()); + return e -> + { + if (hasOldSelection) + outputs[oldSelection].clearSignals(); + if (hasNewSelection) + outputs[newSelection].feedSignals(inputValues); + }; } @Override diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java index b85168d6..a47ad6b5 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java @@ -6,6 +6,8 @@ import java.util.Collections; import java.util.List; import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.core.wires.CoreWire; import net.mograsim.logic.core.wires.CoreWire.ReadEnd; import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; @@ -66,17 +68,16 @@ public class CoreMux extends BasicCoreComponent } @Override - public void compute() + public TimelineEventHandler compute() { int selectValue; if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length) { - out.clearSignals(); - return; + return e -> out.clearSignals(); } - ReadEnd active = inputs[selectValue]; - out.feedSignals(active.getValues()); + BitVector activeValues = inputs[selectValue].getValues(); + return e -> out.feedSignals(activeValues); } @Override diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java index 6568d1bf..4b7a339f 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java @@ -3,7 +3,9 @@ package net.mograsim.logic.core.components; import java.util.List; 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; @@ -28,12 +30,14 @@ public class CoreTriStateBuffer extends BasicCoreComponent } @Override - protected void compute() + protected TimelineEventHandler compute() { if (enable.getValue() == Bit.ONE) - out.feedSignals(in.getValues()); - else - out.clearSignals(); + { + BitVector inValues = in.getValues(); + return e -> out.feedSignals(inValues); + } + return e -> out.clearSignals(); } @Override diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java index 57f3a187..b7808be9 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java @@ -4,6 +4,8 @@ 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.BitVector; import net.mograsim.logic.core.wires.CoreWire.ReadEnd; import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; @@ -21,9 +23,10 @@ public class CoreNotGate extends BasicCoreComponent } @Override - protected void compute() + protected TimelineEventHandler compute() { - out.feedSignals(in.getValues().not()); + BitVector values = in.getValues().not(); + return e -> out.feedSignals(values); } public ReadEnd getIn() diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java index 59fc3cdc..010ae74f 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java @@ -4,6 +4,7 @@ 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.BitVector.BitVectorMutator; import net.mograsim.logic.core.types.MutationOperation; import net.mograsim.logic.core.wires.CoreWire.ReadEnd; @@ -53,11 +54,11 @@ public abstract class MultiInputCoreGate extends BasicCoreComponent } @Override - protected void compute() + public TimelineEventHandler compute() { BitVectorMutator mutator = BitVectorMutator.empty(); for (ReadEnd w : in) op.apply(mutator, w.getValues()); - out.feedSignals(invert ? mutator.toBitVector().not() : mutator.toBitVector()); + return e -> out.feedSignals(invert ? mutator.toBitVector().not() : mutator.toBitVector()); } } diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java index 2e5e5fd6..5056345f 100644 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java +++ b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java @@ -6,6 +6,7 @@ import java.util.function.LongConsumer; import net.mograsim.logic.core.components.CoreBitDisplay; 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.wires.CoreWire.ReadEnd; @@ -39,9 +40,13 @@ public final class TestCoreBitDisplay extends CoreBitDisplay } @Override - protected void compute() + protected TimelineEventHandler compute() { - super.compute(); - System.out.println("update: value is " + getDisplayedValue()); + TimelineEventHandler handler = super.compute(); + return e -> + { + handler.handle(e); + System.out.println("update: value is " + getDisplayedValue()); + }; } } diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryComponent.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryComponent.java index 3c135ec4..b965dbad 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryComponent.java +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemoryComponent.java @@ -4,7 +4,9 @@ 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.MainMemoryDefinition; @@ -47,23 +49,28 @@ public class WordAddressableMemoryComponent extends BasicCoreComponent } @Override - protected void compute() + protected TimelineEventHandler compute() { if (!address.hasNumericValue()) { if (read.equals(rWBit.getValue())) - data.feedSignals(Bit.U.toVector(data.width())); - else - data.clearSignals(); - return; + return e -> data.feedSignals(Bit.U.toVector(data.width())); + return e -> data.clearSignals(); } long addressed = address.getUnsignedValue(); if (read.equals(rWBit.getValue())) - data.feedSignals(memory.getCell(addressed)); + { + BitVector storedData = memory.getCell(addressed); + return e -> data.feedSignals(storedData); + } else { - data.clearSignals(); - memory.setCell(addressed, data.getValues()); + BitVector transData = data.getValues(); + return e -> + { + data.clearSignals(); + memory.setCell(addressed, transData); + }; } }