From e202298a91603f3b8cfae3c1192e5be796db2786 Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Sun, 2 Jun 2019 11:33:57 +0200 Subject: [PATCH] Generalized WireObserver to LogicObserver --- .../mograsim/logic/core/LogicObservable.java | 10 ++++++ .../mograsim/logic/core/LogicObserver.java | 6 ++++ .../logic/core/components/BasicComponent.java | 9 +++--- .../logic/core/components/BitDisplay.java | 2 +- .../logic/core/components/Connector.java | 16 +++++----- .../mograsim/logic/core/components/Demux.java | 4 +-- .../logic/core/components/Merger.java | 12 +++---- .../mograsim/logic/core/components/Mux.java | 4 +-- .../logic/core/components/Splitter.java | 9 +++--- .../logic/core/components/TriStateBuffer.java | 4 +-- .../core/components/gates/MultiInputGate.java | 2 +- .../logic/core/components/gates/NotGate.java | 2 +- .../logic/core/tests/ComponentTest.java | 12 +++---- .../net/mograsim/logic/core/wires/Wire.java | 32 ++++++++++++------- .../logic/core/wires/WireObserver.java | 9 ------ 15 files changed, 74 insertions(+), 59 deletions(-) create mode 100644 net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java create mode 100644 net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java delete mode 100644 net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java new file mode 100644 index 00000000..bab49d27 --- /dev/null +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java @@ -0,0 +1,10 @@ +package net.mograsim.logic.core; + +public interface LogicObservable +{ + public void registerObserver(LogicObserver ob); + + public void notifyObservers(); + +// public InnerState getInnerState(); +} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java new file mode 100644 index 00000000..5955656f --- /dev/null +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java @@ -0,0 +1,6 @@ +package net.mograsim.logic.core; + +public interface LogicObserver +{ + public void update(LogicObservable initiator); +} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java index 426c6a11..56dc6875 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java @@ -1,16 +1,15 @@ 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.types.BitVector; -import net.mograsim.logic.core.wires.WireObserver; -import net.mograsim.logic.core.wires.Wire.ReadEnd; /** * A basic component that recomputes all outputs (with a delay), when it is updated. * * @author Fabian Stemmler */ -public abstract class BasicComponent extends Component implements WireObserver +public abstract class BasicComponent extends Component implements LogicObserver { private int processTime; @@ -27,7 +26,7 @@ public abstract class BasicComponent extends Component implements WireObserver } @Override - public void update(ReadEnd initiator, BitVector oldValues) + public void update(LogicObservable initiator) { timeline.addEvent(e -> compute(), processTime); } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java index 268d1572..bc54c232 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java @@ -17,7 +17,7 @@ public class BitDisplay extends BasicComponent { super(timeline, 1); this.in = in; - in.addObserver(this); + in.registerObserver(this); compute(); } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java index 16b8e709..7315e135 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java @@ -2,13 +2,13 @@ package net.mograsim.logic.core.components; 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.types.BitVector; -import net.mograsim.logic.core.wires.WireObserver; import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; -public class Connector extends Component implements WireObserver +public class Connector extends Component implements LogicObserver { private boolean connected; private final ReadWriteEnd a; @@ -21,8 +21,8 @@ public class Connector extends Component implements WireObserver throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length())); this.a = a; this.b = b; - a.addObserver(this); - b.addObserver(this); + a.registerObserver(this); + b.registerObserver(this); } public void connect() @@ -48,13 +48,13 @@ public class Connector extends Component implements WireObserver } @Override - public void update(ReadEnd initiator, BitVector oldValues) + public void update(LogicObservable initiator) { if (connected) - timeline.addEvent(e -> update(initiator), 1); + timeline.addEvent(e -> innerUpdate(initiator), 1); } - private void update(ReadEnd initiator) + private void innerUpdate(LogicObservable initiator) { if (initiator == a) b.feedSignals(a.wireValuesExcludingMe()); diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java index 5da1bf6a..704fa9bd 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java @@ -43,13 +43,13 @@ public class Demux extends BasicComponent } this.select = select; - select.addObserver(this); + select.registerObserver(this); int maxInputs = 1 << select.length(); if (this.outputs.length > maxInputs) throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by " + select.length() + " select bits (" + maxInputs + ")."); - in.addObserver(this); + in.registerObserver(this); } @Override diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java index c4c71701..6fa5b93c 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java @@ -2,14 +2,14 @@ package net.mograsim.logic.core.components; 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.types.BitVector; import net.mograsim.logic.core.wires.Wire; -import net.mograsim.logic.core.wires.WireObserver; import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; -public class Merger extends Component implements WireObserver +public class Merger extends Component implements LogicObserver { private ReadWriteEnd out; private ReadEnd[] inputs; @@ -32,7 +32,7 @@ public class Merger extends Component implements WireObserver { beginningIndex[i] = length; length += inputs[i].length(); - inputs[i].addObserver(this); + inputs[i].registerObserver(this); } if (length != union.length()) @@ -51,14 +51,14 @@ public class Merger extends Component implements WireObserver } @Override - public void update(ReadEnd initiator, BitVector oldValues) + public void update(LogicObservable initiator) { int index = find(initiator); int beginning = beginningIndex[index]; out.feedSignals(beginning, inputs[index].getValues()); } - private int find(ReadEnd r) + private int find(LogicObservable r) { for (int i = 0; i < inputs.length; i++) if (inputs[i] == r) diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java index bbb10f5e..5e75f96d 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java @@ -41,11 +41,11 @@ public class Mux extends BasicComponent { if (inputs[i].length() != outputSize) throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!"); - inputs[i].addObserver(this); + inputs[i].registerObserver(this); } this.select = select; - select.addObserver(this); + select.registerObserver(this); int maxInputs = 1 << select.length(); if (this.inputs.length > maxInputs) diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java index 9eb5b2c0..8a1ba20a 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java @@ -2,13 +2,14 @@ package net.mograsim.logic.core.components; 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.types.BitVector; -import net.mograsim.logic.core.wires.WireObserver; import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; -public class Splitter extends Component implements WireObserver +public class Splitter extends Component implements LogicObserver { private ReadEnd input; private ReadWriteEnd[] outputs; @@ -18,7 +19,7 @@ public class Splitter extends Component implements WireObserver super(timeline); this.input = input; this.outputs = outputs; - input.addObserver(this); + input.registerObserver(this); int length = 0; for (ReadEnd out : outputs) length += out.length(); @@ -40,7 +41,7 @@ public class Splitter extends Component implements WireObserver } @Override - public void update(ReadEnd initiator, BitVector oldValues) + public void update(LogicObservable initiator) { compute(); } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java index f4f1b491..ac2e4225 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java @@ -21,9 +21,9 @@ public class TriStateBuffer extends BasicComponent if (enable.length() != 1) throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + "."); this.in = in; - in.addObserver(this); + in.registerObserver(this); this.enable = enable; - enable.addObserver(this); + enable.registerObserver(this); this.out = out; } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java index afc89511..322ccce7 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java @@ -28,7 +28,7 @@ public abstract class MultiInputGate extends BasicComponent { if (w.length() != length) throw new IllegalArgumentException("All wires connected to the gate must be of uniform length."); - w.addObserver(this); + w.registerObserver(this); } this.out = out; } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java index b1cfefee..14fe85d6 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java @@ -16,7 +16,7 @@ public class NotGate extends BasicComponent { super(timeline, processTime); this.in = in; - in.addObserver(this); + in.registerObserver(this); this.out = out; } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java index a47f7921..5fb7d9c6 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java @@ -295,19 +295,19 @@ class ComponentTest t.addEvent((e) -> { if (!flag) - fail(); + fail("Events executed out of order!"); flag = false; }, 15); t.addEvent((e) -> { if (flag) - fail(); + fail("Events executed out of order!"); flag = true; }, 10); t.addEvent((e) -> { if (flag) - fail(); + fail("Events executed out of order!"); flag = true; }, 20); t.addEvent((e) -> @@ -318,7 +318,7 @@ class ComponentTest t.executeUntil(t.laterThan(20), 100); if (!flag) - fail(); + fail("Not all events were executed in order!"); } @Test @@ -342,12 +342,12 @@ class ComponentTest wI2.feedSignals(Bit.ONE, Bit.Z); ReadEnd rE = w.createReadOnlyEnd(); - rE.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change.")); + rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change.")); t.executeAll(); rE.close(); wI1.feedSignals(Bit.X, Bit.X); t.executeAll(); - wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed.")); + wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed.")); wI1.close(); assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); } diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java index d73ee61c..12f0f8a9 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java @@ -6,6 +6,8 @@ import static net.mograsim.logic.core.types.Bit.Z; import java.util.ArrayList; 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.types.Bit; import net.mograsim.logic.core.types.BitVector; @@ -165,10 +167,10 @@ public class Wire } /** - * Adds an {@link WireObserver}, who will be notified when the value of the {@link Wire} is updated. + * Adds an {@link LogicObserver}, who will be notified when the value of the {@link Wire} is updated. * - * @param ob The {@link WireObserver} to be notified of changes. - * @return true if the given {@link WireObserver} was not already registered, false otherwise + * @param ob The {@link LogicObserver} to be notified of changes. + * @return true if the given {@link LogicObserver} was not already registered, false otherwise * * @author Fabian Stemmler */ @@ -216,9 +218,9 @@ public class Wire * * @author Fabian Stemmler */ - public class ReadEnd + public class ReadEnd implements LogicObservable { - private List observers = new ArrayList(); + private List observers = new ArrayList(); private ReadEnd() { @@ -228,8 +230,7 @@ public class Wire public void update(BitVector oldValues) { - for (WireObserver ob : observers) - ob.update(this, oldValues); + notifyObservers(); } /** @@ -333,14 +334,22 @@ public class Wire return length; } - public boolean addObserver(WireObserver ob) + public Wire getWire() { - return observers.add(ob); + return Wire.this; } - public Wire getWire() + @Override + public void registerObserver(LogicObserver ob) { - return Wire.this; + observers.add(ob); + } + + @Override + public void notifyObservers() + { + for (LogicObserver ob : observers) + ob.update(this); } } @@ -479,7 +488,6 @@ public class Wire public String toString() { return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs); - // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2) } public static ReadEnd[] extractEnds(Wire[] w) diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java deleted file mode 100644 index 66914b48..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.mograsim.logic.core.wires; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.Wire.ReadEnd; - -public interface WireObserver -{ - public void update(ReadEnd initiator, BitVector oldValues); -} -- 2.17.1