Generalized WireObserver to LogicObserver
authorFabian Stemmler <stemmler@in.tum.de>
Sun, 2 Jun 2019 09:33:57 +0000 (11:33 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Sun, 2 Jun 2019 09:38:09 +0000 (11:38 +0200)
15 files changed:
net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java
net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java [deleted file]

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 (file)
index 0000000..bab49d2
--- /dev/null
@@ -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 (file)
index 0000000..5955656
--- /dev/null
@@ -0,0 +1,6 @@
+package net.mograsim.logic.core;
+
+public interface LogicObserver
+{
+       public void update(LogicObservable initiator);
+}
index 426c6a1..56dc687 100644 (file)
@@ -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);
        }
index 268d157..bc54c23 100644 (file)
@@ -17,7 +17,7 @@ public class BitDisplay extends BasicComponent
        {
                super(timeline, 1);
                this.in = in;
-               in.addObserver(this);
+               in.registerObserver(this);
                compute();
        }
 
index 16b8e70..7315e13 100644 (file)
@@ -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());
index 5da1bf6..704fa9b 100644 (file)
@@ -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
index c4c7170..6fa5b93 100644 (file)
@@ -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)
index bbb10f5..5e75f96 100644 (file)
@@ -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)
index 9eb5b2c..8a1ba20 100644 (file)
@@ -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();
        }
index f4f1b49..ac2e422 100644 (file)
@@ -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;
        }
 
index afc8951..322ccce 100644 (file)
@@ -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;
        }
index b1cfefe..14fe85d 100644 (file)
@@ -16,7 +16,7 @@ public class NotGate extends BasicComponent
        {
                super(timeline, processTime);
                this.in = in;
-               in.addObserver(this);
+               in.registerObserver(this);
                this.out = out;
        }
 
index a47f792..5fb7d9c 100644 (file)
@@ -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);
        }
index d73ee61..12f0f8a 100644 (file)
@@ -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<WireObserver> observers = new ArrayList<WireObserver>();
+               private List<LogicObserver> observers = new ArrayList<LogicObserver>();
 
                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 (file)
index 66914b4..0000000
+++ /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);
-}