Timeline now passed via constructor
authorFabian Stemmler <stemmler@in.tum.de>
Mon, 27 May 2019 18:06:29 +0000 (20:06 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Mon, 27 May 2019 18:06:29 +0000 (20:06 +0200)
The Timeline is now passed into each Component and Wire via the
constructor. It is no longer statically accessed through the Simulation
class. Made SampleERCP and LogicUI compatible with this change.

32 files changed:
LogicUI/src/era/mi/gui/LogicUIStandalone.java
LogicUI/src/era/mi/gui/components/GUIAndGate.java
LogicUI/src/era/mi/gui/components/GUIManualSwitch.java
LogicUI/src/era/mi/gui/components/GUIMerger.java
LogicUI/src/era/mi/gui/components/GUIMux.java
LogicUI/src/era/mi/gui/components/GUINotGate.java
LogicUI/src/era/mi/gui/components/GUIOrGate.java
LogicUI/src/era/mi/gui/components/GUISplitter.java
LogicUI/src/era/mi/gui/examples/RSLatchGUIExample.java
SampleERCP/src/sampleercp/parts/LogicUIPart.java
era.mi/src/era/mi/logic/Simulation.java [deleted file]
era.mi/src/era/mi/logic/components/BasicComponent.java
era.mi/src/era/mi/logic/components/BitDisplay.java
era.mi/src/era/mi/logic/components/Clock.java
era.mi/src/era/mi/logic/components/Component.java
era.mi/src/era/mi/logic/components/Connector.java
era.mi/src/era/mi/logic/components/Demux.java
era.mi/src/era/mi/logic/components/ManualSwitch.java
era.mi/src/era/mi/logic/components/Merger.java
era.mi/src/era/mi/logic/components/Mux.java
era.mi/src/era/mi/logic/components/Splitter.java
era.mi/src/era/mi/logic/components/TriStateBuffer.java
era.mi/src/era/mi/logic/components/gates/AndGate.java
era.mi/src/era/mi/logic/components/gates/MultiInputGate.java
era.mi/src/era/mi/logic/components/gates/NotGate.java
era.mi/src/era/mi/logic/components/gates/OrGate.java
era.mi/src/era/mi/logic/components/gates/XorGate.java
era.mi/src/era/mi/logic/tests/ComponentTest.java
era.mi/src/era/mi/logic/tests/GUITest.java
era.mi/src/era/mi/logic/tests/TestBitDisplay.java
era.mi/src/era/mi/logic/timeline/Timeline.java
era.mi/src/era/mi/logic/wires/Wire.java

index fea7e18..3b3c740 100644 (file)
@@ -7,7 +7,7 @@ import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;
 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
 
@@ -21,9 +21,11 @@ public class LogicUIStandalone
        private final Display display;
        private final Shell shell;
        private final LogicUICanvas ui;
+       private Timeline timeline;
 
-       public LogicUIStandalone()
+       public LogicUIStandalone(Timeline timeline)
        {
+               this.timeline = timeline;
                display = new Display();
                shell = new Shell(display);
                shell.setLayout(new FillLayout());
@@ -52,10 +54,10 @@ public class LogicUIStandalone
                        while (running.get())
                        {
                                // always execute to keep timeline from "hanging behind" for too long
-                               Simulation.TIMELINE.executeUpTo(System.currentTimeMillis(), System.currentTimeMillis() + 10);
+                               timeline.executeUpTo(System.currentTimeMillis(), System.currentTimeMillis() + 10);
                                long sleepTime;
-                               if (Simulation.TIMELINE.hasNext())
-                                       sleepTime = Simulation.TIMELINE.nextEventTime() - System.currentTimeMillis();
+                               if (timeline.hasNext())
+                                       sleepTime = timeline.nextEventTime() - System.currentTimeMillis();
                                else
                                        sleepTime = 10;
                                try
@@ -69,7 +71,7 @@ public class LogicUIStandalone
                        }
                });
                simulationThread.start();
-               Simulation.TIMELINE.addEventAddedListener(event ->
+               timeline.addEventAddedListener(event ->
                {
                        if (event.getTiming() <= System.currentTimeMillis())
                                simulationThread.interrupt();
index aa3b3c6..c76d65a 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 
 import era.mi.logic.components.gates.AndGate;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -22,9 +23,9 @@ public class GUIAndGate extends AndGate implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> wireEndConnectionPoints;
 
-       public GUIAndGate(int processTime, ReadWriteEnd out, ReadEnd... in)
+       public GUIAndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime, out, in);
+               super(timeline, processTime, out, in);
 
                List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
                List<Point> wireEndConnectionPointsModifiable = new ArrayList<>();
index 48662d3..7dcb025 100644 (file)
@@ -7,6 +7,7 @@ import java.util.List;
 import java.util.Map;
 
 import era.mi.logic.components.ManualSwitch;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
@@ -33,9 +34,9 @@ public class GUIManualSwitch extends ManualSwitch implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> wireEndConnectionPoints;
 
-       public GUIManualSwitch(ReadWriteEnd output)
+       public GUIManualSwitch(Timeline timeline, ReadWriteEnd output)
        {
-               super(output);
+               super(timeline, output);
 
                this.we = output;
 
index 480da35..240855c 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 
 import era.mi.logic.components.Merger;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -19,9 +20,9 @@ public class GUIMerger extends Merger implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> WireEndConnectionPoints;
 
-       public GUIMerger(ReadWriteEnd union, ReadEnd... inputs)
+       public GUIMerger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)
        {
-               super(union, inputs);
+               super(timeline, union, inputs);
 
                List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
                List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
index 5f6dde7..0eba8f5 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 
 import era.mi.logic.components.Mux;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -18,9 +19,9 @@ public class GUIMux extends Mux implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> WireEndConnectionPoints;
 
-       public GUIMux(int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
+       public GUIMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
        {
-               super(processTime, out, select, inputs);
+               super(timeline, processTime, out, select, inputs);
 
                double height = inputs.length * 5;
                if (height < 10)
index 526e270..fa4730a 100644 (file)
@@ -5,6 +5,7 @@ import java.util.Collections;
 import java.util.List;
 
 import era.mi.logic.components.gates.NotGate;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -19,9 +20,9 @@ public class GUINotGate extends NotGate implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> WireEndConnectionPoints;
 
-       public GUINotGate(int processTime, ReadEnd in, ReadWriteEnd out)
+       public GUINotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)
        {
-               super(processTime, in, out);
+               super(timeline, processTime, in, out);
 
                List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
                List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
index 6eac295..549cb40 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 
 import era.mi.logic.components.gates.OrGate;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -22,9 +23,9 @@ public class GUIOrGate extends OrGate implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> WireEndConnectionPoints;
 
-       public GUIOrGate(int processTime, ReadWriteEnd out, ReadEnd... in)
+       public GUIOrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime, out, in);
+               super(timeline, processTime, out, in);
 
                List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
                List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
index 1e39983..6873e63 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 
 import era.mi.logic.components.Splitter;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -19,9 +20,9 @@ public class GUISplitter extends Splitter implements BasicGUIComponent
        private final List<ReadEnd> connectedWireEnds;
        private final List<Point> WireEndConnectionPoints;
 
-       public GUISplitter(ReadEnd input, ReadWriteEnd... outputs)
+       public GUISplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
        {
-               super(input, outputs);
+               super(timeline, input, outputs);
 
                List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
                List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
index c36ba3a..cb5f178 100644 (file)
@@ -6,7 +6,7 @@ import era.mi.gui.components.GUIManualSwitch;
 import era.mi.gui.components.GUINotGate;
 import era.mi.gui.components.GUIOrGate;
 import era.mi.gui.wires.WireConnectionPoint;
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 
@@ -15,30 +15,32 @@ public class RSLatchGUIExample
        private static final int WIRE_DELAY = 10;
        private static final int OR_DELAY = 50;
        private static final int NOT_DELAY = 50;
+       private static final Timeline t = new Timeline(11);
 
        public static void main(String[] args)
        {
-               LogicUIStandalone ui = new LogicUIStandalone();
+               LogicUIStandalone ui = new LogicUIStandalone(t);
                addComponentsAndWires(ui.getLogicUICanvas());
                ui.run();
        }
 
        public static void addComponentsAndWires(LogicUICanvas ui)
        {
-               Simulation.TIMELINE.reset();
-               Wire r = new Wire(1, WIRE_DELAY);
-               Wire s = new Wire(1, WIRE_DELAY);
-               Wire t2 = new Wire(1, WIRE_DELAY);
-               Wire t1 = new Wire(1, WIRE_DELAY);
-               Wire q = new Wire(1, WIRE_DELAY);
-               Wire nq = new Wire(1, WIRE_DELAY);
+               Wire r = new Wire(t, 1, WIRE_DELAY);
+               Wire s = new Wire(t, 1, WIRE_DELAY);
+               Wire t2 = new Wire(t, 1, WIRE_DELAY);
+               Wire t1 = new Wire(t, 1, WIRE_DELAY);
+               Wire q = new Wire(t, 1, WIRE_DELAY);
+               Wire nq = new Wire(t, 1, WIRE_DELAY);
 
-               GUIManualSwitch rIn = ui.addComponent(new GUIManualSwitch(r.createReadWriteEnd()), 100, 100);
-               GUIManualSwitch sIn = ui.addComponent(new GUIManualSwitch(s.createReadWriteEnd()), 100, 200);
-               GUIOrGate or1 = ui.addComponent(new GUIOrGate(OR_DELAY, t1.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()), 160, 102.5);
-               GUIOrGate or2 = ui.addComponent(new GUIOrGate(OR_DELAY, t2.createReadWriteEnd(), q.createReadOnlyEnd(), s.createReadOnlyEnd()), 160, 192.5);
-               GUINotGate not1 = ui.addComponent(new GUINotGate(NOT_DELAY, t1.createReadOnlyEnd(), q.createReadWriteEnd()), 200, 107.5);
-               GUINotGate not2 = ui.addComponent(new GUINotGate(NOT_DELAY, t2.createReadOnlyEnd(), nq.createReadWriteEnd()), 200, 197.5);
+               GUIManualSwitch rIn = ui.addComponent(new GUIManualSwitch(t, r.createReadWriteEnd()), 100, 100);
+               GUIManualSwitch sIn = ui.addComponent(new GUIManualSwitch(t, s.createReadWriteEnd()), 100, 200);
+               GUIOrGate or1 = ui.addComponent(new GUIOrGate(t, OR_DELAY, t1.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()),
+                               160, 102.5);
+               GUIOrGate or2 = ui.addComponent(new GUIOrGate(t, OR_DELAY, t2.createReadWriteEnd(), q.createReadOnlyEnd(), s.createReadOnlyEnd()),
+                               160, 192.5);
+               GUINotGate not1 = ui.addComponent(new GUINotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), q.createReadWriteEnd()), 200, 107.5);
+               GUINotGate not2 = ui.addComponent(new GUINotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), nq.createReadWriteEnd()), 200, 197.5);
 
                WireConnectionPoint p1 = ui.addComponent(new WireConnectionPoint(q, 3), 250, 112.5);
                WireConnectionPoint p2 = ui.addComponent(new WireConnectionPoint(nq, 3), 250, 202.5);
index c142cb6..481879c 100644 (file)
@@ -9,7 +9,7 @@ import org.eclipse.swt.widgets.Composite;
 
 import era.mi.gui.LogicUICanvas;
 import era.mi.gui.examples.RSLatchGUIExample;
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
 
 public class LogicUIPart
@@ -20,6 +20,7 @@ public class LogicUIPart
        @PostConstruct
        public void create(Composite parent)
        {
+               Timeline timeline = new Timeline(11);
                LogicUICanvas ui = new LogicUICanvas(parent, SWT.NONE);
                RSLatchGUIExample.addComponentsAndWires(ui);
                ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
@@ -33,10 +34,10 @@ public class LogicUIPart
                        while (!ui.isDisposed())
                        {
                                // always execute to keep timeline from "hanging behind" for too long
-                               Simulation.TIMELINE.executeUpTo(System.currentTimeMillis(), System.currentTimeMillis() + 10);
+                               timeline.executeUpTo(System.currentTimeMillis(), System.currentTimeMillis() + 10);
                                long sleepTime;
-                               if (Simulation.TIMELINE.hasNext())
-                                       sleepTime = Simulation.TIMELINE.nextEventTime() - System.currentTimeMillis();
+                               if (timeline.hasNext())
+                                       sleepTime = timeline.nextEventTime() - System.currentTimeMillis();
                                else
                                        sleepTime = 10;
                                try
@@ -50,7 +51,7 @@ public class LogicUIPart
                        }
                });
                simulationThread.start();
-               Simulation.TIMELINE.addEventAddedListener(event ->
+               timeline.addEventAddedListener(event ->
                {
                        if (event.getTiming() <= System.currentTimeMillis())
                                simulationThread.interrupt();
diff --git a/era.mi/src/era/mi/logic/Simulation.java b/era.mi/src/era/mi/logic/Simulation.java
deleted file mode 100644 (file)
index 0468ec1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package era.mi.logic;
-
-import era.mi.logic.timeline.Timeline;
-
-public class Simulation
-{
-       public final static Timeline TIMELINE = new Timeline(11);
-
-}
\ No newline at end of file
index f89a72c..47a3057 100644 (file)
@@ -1,6 +1,6 @@
 package era.mi.logic.components;
 
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.WireObserver;
@@ -10,7 +10,7 @@ import era.mi.logic.wires.WireObserver;
  * 
  * @author Fabian Stemmler
  */
-public abstract class BasicComponent implements WireObserver, Component
+public abstract class BasicComponent extends Component implements WireObserver
 {
        private int processTime;
 
@@ -20,15 +20,16 @@ public abstract class BasicComponent implements WireObserver, Component
         * 
         * @author Fabian Stemmler
         */
-       public BasicComponent(int processTime)
+       public BasicComponent(Timeline timeline, int processTime)
        {
+               super(timeline);
                this.processTime = processTime > 0 ? processTime : 1;
        }
 
        @Override
        public void update(ReadEnd initiator, BitVector oldValues)
        {
-               Simulation.TIMELINE.addEvent(e -> compute(), processTime);
+               timeline.addEvent(e -> compute(), processTime);
        }
 
        protected abstract void compute();
index f34c923..d8691f3 100644 (file)
@@ -2,6 +2,7 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.wires.Wire.ReadEnd;
@@ -12,9 +13,9 @@ public class BitDisplay extends BasicComponent
        private final ReadEnd in;
        private BitVector displayedValue;
 
-       public BitDisplay(ReadEnd in)
+       public BitDisplay(Timeline timeline, ReadEnd in)
        {
-               super(1);
+               super(timeline, 1);
                this.in = in;
                in.addObserver(this);
                compute();
index f764855..01795e0 100644 (file)
@@ -2,7 +2,7 @@ package era.mi.logic.components;
 
 import java.util.List;
 
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.timeline.TimelineEvent;
 import era.mi.logic.timeline.TimelineEventHandler;
 import era.mi.logic.types.Bit;
@@ -10,7 +10,7 @@ import era.mi.logic.wires.Wire;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 
-public class Clock implements TimelineEventHandler, Component
+public class Clock extends Component implements TimelineEventHandler
 {
        private boolean toggle = false;
        private ReadWriteEnd out;
@@ -21,8 +21,9 @@ public class Clock implements TimelineEventHandler, Component
         * @param out   {@link Wire} the clock's impulses are fed into
         * @param delta ticks between rising and falling edge
         */
-       public Clock(ReadWriteEnd out, int delta)
+       public Clock(Timeline timeline, ReadWriteEnd out, int delta)
        {
+               super(timeline);
                this.delta = delta;
                this.out = out;
                addToTimeline();
@@ -43,7 +44,7 @@ public class Clock implements TimelineEventHandler, Component
 
        private void addToTimeline()
        {
-               Simulation.TIMELINE.addEvent(this, delta);
+               timeline.addEvent(this, delta);
        }
 
        @Override
index f104e5f..e26b6cd 100644 (file)
@@ -2,20 +2,27 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 
-public interface Component
+public abstract class Component
 {
+       protected Timeline timeline;
+
+       public Component(Timeline timeline)
+       {
+               this.timeline = timeline;
+       }
 
        /**
         * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX). Intended for visualization
         * in the UI.
         */
-       public List<ReadEnd> getAllInputs();
+       public abstract List<ReadEnd> getAllInputs();
 
        /**
         * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI.
         */
-       public List<ReadWriteEnd> getAllOutputs();
+       public abstract List<ReadWriteEnd> getAllOutputs();
 }
index 19367a5..5fd7ee4 100644 (file)
@@ -2,20 +2,21 @@ package era.mi.logic.components;
 
 import java.util.List;
 
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import era.mi.logic.wires.WireObserver;
 
-public class Connector implements WireObserver, Component
+public class Connector extends Component implements WireObserver
 {
        private boolean connected;
        private final ReadWriteEnd a;
        private final ReadWriteEnd b;
 
-       public Connector(ReadWriteEnd a, ReadWriteEnd b)
+       public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)
        {
+               super(timeline);
                if (a.length() != b.length())
                        throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));
                this.a = a;
@@ -50,7 +51,7 @@ public class Connector implements WireObserver, Component
        public void update(ReadEnd initiator, BitVector oldValues)
        {
                if (connected)
-                       Simulation.TIMELINE.addEvent(e -> update(initiator), 1);
+                       timeline.addEvent(e -> update(initiator), 1);
        }
 
        private void update(ReadEnd initiator)
index 2182596..3b267df 100644 (file)
@@ -2,6 +2,7 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
@@ -27,9 +28,9 @@ public class Demux extends BasicComponent
         * @param select  Indexes the output array to which the input is mapped. Must have enough bits to index all outputs.
         * @param outputs One of these outputs receives the input signal, depending on the select bits
         */
-       public Demux(int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)
+       public Demux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)
        {
-               super(processTime);
+               super(timeline, processTime);
                outputSize = in.length();
 
                this.in = in;
index caaf49b..9ae08eb 100644 (file)
@@ -2,6 +2,7 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
@@ -12,13 +13,14 @@ import era.mi.logic.wires.Wire.ReadWriteEnd;
  * @author Christian Femers
  *
  */
-public class ManualSwitch implements Component
+public class ManualSwitch extends Component
 {
        private ReadWriteEnd output;
        private boolean isOn;
 
-       public ManualSwitch(ReadWriteEnd output)
+       public ManualSwitch(Timeline timeline, ReadWriteEnd output)
        {
+               super(timeline);
                if (output.length() != 1)
                        throw new IllegalArgumentException("Switch output can be only a single wire");
                this.output = output;
index a9d1410..ab38066 100644 (file)
@@ -2,13 +2,14 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.wires.Wire;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import era.mi.logic.wires.WireObserver;
 
-public class Merger implements WireObserver, Component
+public class Merger extends Component implements WireObserver
 {
        private ReadWriteEnd out;
        private ReadEnd[] inputs;
@@ -19,8 +20,9 @@ public class Merger implements WireObserver, Component
         * @param union  The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
         * @param inputs The inputs to be merged into the union
         */
-       public Merger(ReadWriteEnd union, ReadEnd... inputs)
+       public Merger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)
        {
+               super(timeline);
                this.inputs = inputs;
                this.out = union;
                this.beginningIndex = new int[inputs.length];
index b7cb674..5391e65 100644 (file)
@@ -5,6 +5,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
@@ -30,9 +31,9 @@ public class Mux extends BasicComponent
         * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs.
         * @param inputs One of these inputs is mapped to the output, depending on the select bits
         */
-       public Mux(int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
+       public Mux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
        {
-               super(processTime);
+               super(timeline, processTime);
                outputSize = out.length();
 
                this.inputs = inputs.clone();
index 32841ab..8c54d0f 100644 (file)
@@ -2,18 +2,20 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 import era.mi.logic.wires.WireObserver;
 
-public class Splitter implements WireObserver, Component
+public class Splitter extends Component implements WireObserver
 {
        private ReadEnd input;
        private ReadWriteEnd[] outputs;
 
-       public Splitter(ReadEnd input, ReadWriteEnd... outputs)
+       public Splitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
        {
+               super(timeline);
                this.input = input;
                this.outputs = outputs;
                input.addObserver(this);
index ee42056..123e2c5 100644 (file)
@@ -2,6 +2,7 @@ package era.mi.logic.components;
 
 import java.util.List;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
@@ -11,9 +12,9 @@ public class TriStateBuffer extends BasicComponent
        ReadEnd in, enable;
        ReadWriteEnd out;
 
-       public TriStateBuffer(int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)
+       public TriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)
        {
-               super(processTime);
+               super(timeline, processTime);
                if (in.length() != out.length())
                        throw new IllegalArgumentException(
                                        "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());
index e045982..edd34d7 100644 (file)
@@ -1,13 +1,14 @@
 package era.mi.logic.components.gates;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector.BitVectorMutator;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 
 public class AndGate extends MultiInputGate
 {
-       public AndGate(int processTime, ReadWriteEnd out, ReadEnd... in)
+       public AndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime, BitVectorMutator::and, out, in);
+               super(timeline, processTime, BitVectorMutator::and, out, in);
        }
 }
index dd8a6d6..038e227 100644 (file)
@@ -3,6 +3,7 @@ package era.mi.logic.components.gates;
 import java.util.List;
 
 import era.mi.logic.components.BasicComponent;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector.BitVectorMutator;
 import era.mi.logic.types.MutationOperation;
 import era.mi.logic.wires.Wire.ReadEnd;
@@ -15,9 +16,9 @@ public abstract class MultiInputGate extends BasicComponent
        protected final int length;
        protected MutationOperation op;
 
-       protected MultiInputGate(int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
+       protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime);
+               super(timeline, processTime);
                this.op = op;
                length = out.length();
                this.in = in.clone();
index 150785b..685bc22 100644 (file)
@@ -3,6 +3,7 @@ package era.mi.logic.components.gates;
 import java.util.List;
 
 import era.mi.logic.components.BasicComponent;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 
@@ -11,9 +12,9 @@ public class NotGate extends BasicComponent
        private ReadEnd in;
        private ReadWriteEnd out;
 
-       public NotGate(int processTime, ReadEnd in, ReadWriteEnd out)
+       public NotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)
        {
-               super(processTime);
+               super(timeline, processTime);
                this.in = in;
                in.addObserver(this);
                this.out = out;
index 7450d8f..f34206f 100644 (file)
@@ -1,13 +1,14 @@
 package era.mi.logic.components.gates;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector.BitVectorMutator;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 
 public class OrGate extends MultiInputGate
 {
-       public OrGate(int processTime, ReadWriteEnd out, ReadEnd... in)
+       public OrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime, BitVectorMutator::or, out, in);
+               super(timeline, processTime, BitVectorMutator::or, out, in);
        }
 }
index 7c8d740..a177695 100644 (file)
@@ -1,5 +1,6 @@
 package era.mi.logic.components.gates;
 
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.BitVector.BitVectorMutator;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
@@ -11,9 +12,9 @@ import era.mi.logic.wires.Wire.ReadWriteEnd;
  */
 public class XorGate extends MultiInputGate
 {
-       public XorGate(int processTime, ReadWriteEnd out, ReadEnd... in)
+       public XorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
        {
-               super(processTime, BitVectorMutator::xor, out, in);
+               super(timeline, processTime, BitVectorMutator::xor, out, in);
        }
 
 }
index b4e9697..c52833c 100644 (file)
@@ -8,7 +8,6 @@ import java.util.function.LongConsumer;
 
 import org.junit.jupiter.api.Test;
 
-import era.mi.logic.Simulation;
 import era.mi.logic.components.Connector;
 import era.mi.logic.components.Demux;
 import era.mi.logic.components.Merger;
@@ -19,6 +18,7 @@ import era.mi.logic.components.gates.AndGate;
 import era.mi.logic.components.gates.NotGate;
 import era.mi.logic.components.gates.OrGate;
 import era.mi.logic.components.gates.XorGate;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.wires.Wire;
@@ -27,18 +27,19 @@ import era.mi.logic.wires.Wire.ReadWriteEnd;
 
 class ComponentTest
 {
+       private Timeline t = new Timeline(11);
 
        @Test
        void circuitExampleTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(1, 1), b = new Wire(1, 1), c = new Wire(1, 10), d = new Wire(2, 1), e = new Wire(1, 1), f = new Wire(1, 1),
-                               g = new Wire(1, 1), h = new Wire(2, 1), i = new Wire(2, 1), j = new Wire(1, 1), k = new Wire(1, 1);
-               new AndGate(1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
-               new NotGate(1, f.createReadOnlyEnd(), g.createReadWriteEnd());
-               new Merger(h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
-               new Mux(1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
-               new Splitter(i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
+               Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
+                               f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
+                               k = new Wire(t, 1, 1);
+               new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
+               new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
+               new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
+               new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
 
                a.createReadWriteEnd().feedSignals(Bit.ZERO);
                b.createReadWriteEnd().feedSignals(Bit.ONE);
@@ -46,7 +47,7 @@ class ComponentTest
                d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
                e.createReadWriteEnd().feedSignals(Bit.ZERO);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(Bit.ONE, j.getValue());
                assertEquals(Bit.ZERO, k.getValue());
@@ -55,12 +56,12 @@ class ComponentTest
        @Test
        void splitterTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(3, 1), b = new Wire(2, 1), c = new Wire(3, 1), in = new Wire(8, 1);
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
                in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-               new Splitter(in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
+               new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
                assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
@@ -70,15 +71,15 @@ class ComponentTest
        @Test
        void mergerTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(3, 1), b = new Wire(2, 1), c = new Wire(3, 1), out = new Wire(8, 1);
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(t, 8, 1);
                a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
                b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
                c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
 
-               new Merger(out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
        }
@@ -86,23 +87,23 @@ class ComponentTest
        @Test
        void triStateBufferTest()
        {
-               Wire a = new Wire(1, 1), b = new Wire(1, 1), en = new Wire(1, 1), notEn = new Wire(1, 1);
-               new NotGate(1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
-               new TriStateBuffer(1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
-               new TriStateBuffer(1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
+               Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
+               new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
+               new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
+               new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
 
                ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
                enI.feedSignals(Bit.ONE);
                aI.feedSignals(Bit.ONE);
                bI.feedSignals(Bit.Z);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(Bit.ONE, b.getValue());
 
                bI.feedSignals(Bit.ZERO);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(Bit.X, b.getValue());
                assertEquals(Bit.ONE, a.getValue());
@@ -110,7 +111,7 @@ class ComponentTest
                aI.clearSignals();
                enI.feedSignals(Bit.ZERO);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(Bit.ZERO, a.getValue());
 
@@ -119,25 +120,26 @@ class ComponentTest
        @Test
        void muxTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(4, 3), b = new Wire(4, 6), c = new Wire(4, 4), select = new Wire(2, 5), out = new Wire(4, 1);
+               t.reset();
+               Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(t, 4, 1);
                ReadWriteEnd selectIn = select.createReadWriteEnd();
 
                selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
                a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
                c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
 
-               new Mux(1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
-               Simulation.TIMELINE.executeAll();
+               new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
+                               c.createReadOnlyEnd());
+               t.executeAll();
 
                assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
                selectIn.feedSignals(Bit.ZERO, Bit.ONE);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
 
                selectIn.feedSignals(Bit.ONE, Bit.ONE);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
 
@@ -146,28 +148,29 @@ class ComponentTest
        @Test
        void demuxTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(4, 3), b = new Wire(4, 6), c = new Wire(4, 4), select = new Wire(2, 5), in = new Wire(4, 1);
+               t.reset();
+               Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(t, 4, 1);
                ReadWriteEnd selectIn = select.createReadWriteEnd();
 
                selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
                in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
 
-               new Demux(1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
-               Simulation.TIMELINE.executeAll();
+               new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
+                               c.createReadWriteEnd());
+               t.executeAll();
 
                assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
                assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
                assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
                selectIn.feedSignals(Bit.ZERO, Bit.ONE);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
                assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
                assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
 
                selectIn.feedSignals(Bit.ONE, Bit.ONE);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
                assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
@@ -178,13 +181,13 @@ class ComponentTest
        @Test
        void andTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(4, 1), b = new Wire(4, 3), c = new Wire(4, 1);
-               new AndGate(1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               t.reset();
+               Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
+               new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
                a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
                b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
        }
@@ -192,13 +195,13 @@ class ComponentTest
        @Test
        void orTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(4, 1), b = new Wire(4, 3), c = new Wire(4, 1);
-               new OrGate(1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               t.reset();
+               Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
+               new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
                a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
                b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
        }
@@ -206,14 +209,14 @@ class ComponentTest
        @Test
        void xorTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(3, 1), b = new Wire(3, 2), c = new Wire(3, 1), d = new Wire(3, 1);
-               new XorGate(1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
+               new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
                a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
                b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
                c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
        }
@@ -221,12 +224,12 @@ class ComponentTest
        @Test
        void notTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire a = new Wire(3, 1), b = new Wire(3, 2);
-               new NotGate(1, a.createReadOnlyEnd(), b.createReadWriteEnd());
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
+               new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
                a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
        }
@@ -234,33 +237,34 @@ class ComponentTest
        @Test
        void rsLatchCircuitTest()
        {
-               Simulation.TIMELINE.reset();
-               Wire r = new Wire(1, 1), s = new Wire(1, 1), t1 = new Wire(1, 15), t2 = new Wire(1, 1), q = new Wire(1, 1), nq = new Wire(1, 1);
+               t.reset();
+               Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
+                               nq = new Wire(t, 1, 1);
 
-               new OrGate(1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
-               new OrGate(1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
-               new NotGate(1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
-               new NotGate(1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+               new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+               new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+               new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+               new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
 
                ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
 
                sIn.feedSignals(Bit.ONE);
                rIn.feedSignals(Bit.ZERO);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(Bit.ONE, q.getValue());
                assertEquals(Bit.ZERO, nq.getValue());
 
                sIn.feedSignals(Bit.ZERO);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
                assertEquals(Bit.ONE, q.getValue());
                assertEquals(Bit.ZERO, nq.getValue());
 
                rIn.feedSignals(Bit.ONE);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(Bit.ZERO, q.getValue());
                assertEquals(Bit.ONE, nq.getValue());
@@ -269,12 +273,12 @@ class ComponentTest
        @Test
        void numericValueTest()
        {
-               Simulation.TIMELINE.reset();
+               t.reset();
 
-               Wire a = new Wire(4, 1);
+               Wire a = new Wire(t, 4, 1);
                a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
 
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
 
                assertEquals(15, a.getUnsignedValue());
                assertEquals(-1, a.getSignedValue());
@@ -283,29 +287,29 @@ class ComponentTest
        @Test
        void multipleInputs()
        {
-               Simulation.TIMELINE.reset();
-               Wire w = new Wire(2, 1);
+               t.reset();
+               Wire w = new Wire(t, 2, 1);
                ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
                wI1.feedSignals(Bit.ONE, Bit.Z);
                wI2.feedSignals(Bit.Z, Bit.X);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
                assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
 
                wI2.feedSignals(Bit.ZERO, Bit.Z);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
                assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
 
                wI2.feedSignals(Bit.Z, Bit.Z);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
                assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
 
                wI2.feedSignals(Bit.ONE, Bit.Z);
                ReadEnd rE = w.createReadOnlyEnd();
                rE.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
                rE.close();
                wI1.feedSignals(Bit.X, Bit.X);
-               Simulation.TIMELINE.executeAll();
+               t.executeAll();
                wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));
                wI1.close();
                assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
@@ -316,17 +320,17 @@ class ComponentTest
        {
                // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
 
-               Simulation.TIMELINE.reset();
+               t.reset();
 
-               Wire a = new Wire(1, 2);
-               Wire b = new Wire(1, 2);
-               Wire c = new Wire(1, 2);
+               Wire a = new Wire(t, 1, 2);
+               Wire b = new Wire(t, 1, 2);
+               Wire c = new Wire(t, 1, 2);
                ReadWriteEnd aI = a.createReadWriteEnd();
                ReadWriteEnd bI = b.createReadWriteEnd();
                ReadWriteEnd cI = c.createReadWriteEnd();
 
-               TestBitDisplay test = new TestBitDisplay(c.createReadOnlyEnd());
-               TestBitDisplay test2 = new TestBitDisplay(a.createReadOnlyEnd());
+               TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
+               TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
                LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);
 
                cI.feedSignals(Bit.ONE);
@@ -339,7 +343,7 @@ class ComponentTest
                cI.feedSignals(Bit.Z);
                test.assertAfterSimulationIs(print, Bit.Z);
 
-               new Connector(b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
+               new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
                test.assertAfterSimulationIs(print, Bit.Z);
                System.err.println("ONE");
                bI.feedSignals(Bit.ONE);
@@ -351,7 +355,7 @@ class ComponentTest
                bI.feedSignals(Bit.Z);
                test.assertAfterSimulationIs(print, Bit.Z);
 
-               new Connector(a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
+               new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
                System.err.println("Z 2");
                aI.feedSignals(Bit.Z);
                test.assertAfterSimulationIs(print, Bit.Z);
index a135e58..78421c4 100644 (file)
@@ -15,10 +15,10 @@ import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.WindowConstants;
 
-import era.mi.logic.Simulation;
 import era.mi.logic.components.ManualSwitch;
 import era.mi.logic.components.gates.NotGate;
 import era.mi.logic.components.gates.OrGate;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.timeline.Timeline.ExecutionResult;
 import era.mi.logic.wires.Wire;
 
@@ -31,20 +31,22 @@ public class GUITest extends JPanel
        private static final int OR_DELAY = 100;
        private static final int NOT_DELAY = 100;
 
-       Wire r = new Wire(1, WIRE_DELAY);
-       Wire s = new Wire(1, WIRE_DELAY);
-       Wire t1 = new Wire(1, WIRE_DELAY);
-       Wire t2 = new Wire(1, WIRE_DELAY);
-       Wire q = new Wire(1, WIRE_DELAY);
-       Wire nq = new Wire(1, WIRE_DELAY);
+       private Timeline t = new Timeline(11);
 
-       ManualSwitch rIn = new ManualSwitch(r.createReadWriteEnd());
-       ManualSwitch sIn = new ManualSwitch(s.createReadWriteEnd());
+       Wire r = new Wire(t, 1, WIRE_DELAY);
+       Wire s = new Wire(t, 1, WIRE_DELAY);
+       Wire t1 = new Wire(t, 1, WIRE_DELAY);
+       Wire t2 = new Wire(t, 1, WIRE_DELAY);
+       Wire q = new Wire(t, 1, WIRE_DELAY);
+       Wire nq = new Wire(t, 1, WIRE_DELAY);
 
-       OrGate or1 = new OrGate(OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
-       OrGate or2 = new OrGate(OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
-       NotGate not1 = new NotGate(NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
-       NotGate not2 = new NotGate(NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+       ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());
+       ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());
+
+       OrGate or1 = new OrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+       OrGate or2 = new OrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+       NotGate not1 = new NotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+       NotGate not2 = new NotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
 
        Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();
 
@@ -109,6 +111,11 @@ public class GUITest extends JPanel
                });
        }
 
+       public Timeline getTimeline()
+       {
+               return t;
+       };
+
        @Override
        public void paint(Graphics some_g)
        {
@@ -275,9 +282,9 @@ public class GUITest extends JPanel
 
                while (f.isVisible())
                {
-                       ExecutionResult er = Simulation.TIMELINE.executeUpTo((lastFrame - begin) * 3, lastFrame + 14);
-//                             if (Simulation.TIMELINE.hasNext()) 
-//                             Simulation.TIMELINE.executeNext();
+                       ExecutionResult er = gt.getTimeline().executeUpTo((lastFrame - begin) * 3, lastFrame + 14);
+//                             if (t.hasNext()) 
+//                             t.executeNext();
                        if (er != ExecutionResult.NOTHING_DONE)
                                gt.repaint(12);
                        try
index 82c0854..28dc1cc 100644 (file)
@@ -4,17 +4,17 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 
 import java.util.function.LongConsumer;
 
-import era.mi.logic.Simulation;
 import era.mi.logic.components.BitDisplay;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.wires.Wire.ReadEnd;
 
 public final class TestBitDisplay extends BitDisplay
 {
 
-       public TestBitDisplay(ReadEnd in)
+       public TestBitDisplay(Timeline timeline, ReadEnd in)
        {
-               super(in);
+               super(timeline, in);
        }
 
        public void assertDisplays(Bit... expected)
@@ -24,16 +24,16 @@ public final class TestBitDisplay extends BitDisplay
 
        public void assertAfterSimulationIs(Bit... expected)
        {
-               Simulation.TIMELINE.executeAll();
+               timeline.executeAll();
                assertDisplays(expected);
        }
 
        public void assertAfterSimulationIs(LongConsumer r, Bit... expected)
        {
-               while (Simulation.TIMELINE.hasNext())
+               while (timeline.hasNext())
                {
-                       Simulation.TIMELINE.executeNext();
-                       r.accept(Simulation.TIMELINE.getSimulationTime());
+                       timeline.executeNext();
+                       r.accept(timeline.getSimulationTime());
                }
                assertDisplays(expected);
        }
index 88aa197..c22e1a4 100644 (file)
@@ -48,7 +48,7 @@ public class Timeline
         * 
         * @param timestamp  the simulation timestamp up to which the events will be processed
         * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout.
-        * @return if it was possible to fulfil the goal in the given real world time.
+        * @return if it was possible to fulfill the goal in the given real world time.
         * @author Christian Femers
         */
        public ExecutionResult executeUpTo(long timestamp, long stopMillis)
index 823e032..9a17387 100644 (file)
@@ -6,7 +6,7 @@ import static era.mi.logic.types.Bit.Z;
 import java.util.ArrayList;
 import java.util.List;
 
-import era.mi.logic.Simulation;
+import era.mi.logic.timeline.Timeline;
 import era.mi.logic.types.Bit;
 import era.mi.logic.types.BitVector;
 import era.mi.logic.types.BitVector.BitVectorMutator;
@@ -24,12 +24,14 @@ public class Wire
        private List<ReadEnd> attached = new ArrayList<ReadEnd>();
        public final int length;
        private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();
+       private Timeline timeline;
 
-       public Wire(int length, int travelTime)
+       public Wire(Timeline timeline, int length, int travelTime)
        {
                if (length < 1)
                        throw new IllegalArgumentException(
                                        String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
+               this.timeline = timeline;
                this.length = length;
                this.travelTime = travelTime;
                initValues();
@@ -379,7 +381,7 @@ public class Wire
                                                String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), length));
                        if (!open)
                                throw new RuntimeException("Attempted to write to closed WireArrayEnd.");
-                       Simulation.TIMELINE.addEvent(e -> setValues(newValues), travelTime);
+                       timeline.addEvent(e -> setValues(newValues), travelTime);
                }
 
                /**
@@ -394,7 +396,7 @@ public class Wire
                {
                        if (!open)
                                throw new RuntimeException("Attempted to write to closed WireArrayEnd.");
-                       Simulation.TIMELINE.addEvent(e -> setValues(startingBit, bitVector), travelTime);
+                       timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime);
                }
 
                private void setValues(int startingBit, BitVector newValues)