From: Fabian Stemmler Date: Mon, 27 May 2019 18:06:29 +0000 (+0200) Subject: Timeline now passed via constructor X-Git-Url: https://mograsim.net/gitweb/?a=commitdiff_plain;h=6c67a9ff8361cd9fc082f40e2676f2c8b5911fe4;p=Mograsim.git Timeline now passed via constructor 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. --- diff --git a/LogicUI/src/era/mi/gui/LogicUIStandalone.java b/LogicUI/src/era/mi/gui/LogicUIStandalone.java index fea7e184..3b3c740f 100644 --- a/LogicUI/src/era/mi/gui/LogicUIStandalone.java +++ b/LogicUI/src/era/mi/gui/LogicUIStandalone.java @@ -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(); diff --git a/LogicUI/src/era/mi/gui/components/GUIAndGate.java b/LogicUI/src/era/mi/gui/components/GUIAndGate.java index aa3b3c66..c76d65a0 100644 --- a/LogicUI/src/era/mi/gui/components/GUIAndGate.java +++ b/LogicUI/src/era/mi/gui/components/GUIAndGate.java @@ -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 connectedWireEnds; private final List 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 connectedWireEndsModifiable = new ArrayList<>(); List wireEndConnectionPointsModifiable = new ArrayList<>(); diff --git a/LogicUI/src/era/mi/gui/components/GUIManualSwitch.java b/LogicUI/src/era/mi/gui/components/GUIManualSwitch.java index 48662d30..7dcb025f 100644 --- a/LogicUI/src/era/mi/gui/components/GUIManualSwitch.java +++ b/LogicUI/src/era/mi/gui/components/GUIManualSwitch.java @@ -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 connectedWireEnds; private final List wireEndConnectionPoints; - public GUIManualSwitch(ReadWriteEnd output) + public GUIManualSwitch(Timeline timeline, ReadWriteEnd output) { - super(output); + super(timeline, output); this.we = output; diff --git a/LogicUI/src/era/mi/gui/components/GUIMerger.java b/LogicUI/src/era/mi/gui/components/GUIMerger.java index 480da351..240855c3 100644 --- a/LogicUI/src/era/mi/gui/components/GUIMerger.java +++ b/LogicUI/src/era/mi/gui/components/GUIMerger.java @@ -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 connectedWireEnds; private final List WireEndConnectionPoints; - public GUIMerger(ReadWriteEnd union, ReadEnd... inputs) + public GUIMerger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs) { - super(union, inputs); + super(timeline, union, inputs); List connectedWireEndsModifiable = new ArrayList<>(); List WireEndConnectionPointsModifiable = new ArrayList<>(); diff --git a/LogicUI/src/era/mi/gui/components/GUIMux.java b/LogicUI/src/era/mi/gui/components/GUIMux.java index 5f6dde77..0eba8f55 100644 --- a/LogicUI/src/era/mi/gui/components/GUIMux.java +++ b/LogicUI/src/era/mi/gui/components/GUIMux.java @@ -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 connectedWireEnds; private final List 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) diff --git a/LogicUI/src/era/mi/gui/components/GUINotGate.java b/LogicUI/src/era/mi/gui/components/GUINotGate.java index 526e2704..fa4730a1 100644 --- a/LogicUI/src/era/mi/gui/components/GUINotGate.java +++ b/LogicUI/src/era/mi/gui/components/GUINotGate.java @@ -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 connectedWireEnds; private final List 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 connectedWireEndsModifiable = new ArrayList<>(); List WireEndConnectionPointsModifiable = new ArrayList<>(); diff --git a/LogicUI/src/era/mi/gui/components/GUIOrGate.java b/LogicUI/src/era/mi/gui/components/GUIOrGate.java index 6eac2957..549cb402 100644 --- a/LogicUI/src/era/mi/gui/components/GUIOrGate.java +++ b/LogicUI/src/era/mi/gui/components/GUIOrGate.java @@ -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 connectedWireEnds; private final List 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 connectedWireEndsModifiable = new ArrayList<>(); List WireEndConnectionPointsModifiable = new ArrayList<>(); diff --git a/LogicUI/src/era/mi/gui/components/GUISplitter.java b/LogicUI/src/era/mi/gui/components/GUISplitter.java index 1e39983a..6873e637 100644 --- a/LogicUI/src/era/mi/gui/components/GUISplitter.java +++ b/LogicUI/src/era/mi/gui/components/GUISplitter.java @@ -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 connectedWireEnds; private final List WireEndConnectionPoints; - public GUISplitter(ReadEnd input, ReadWriteEnd... outputs) + public GUISplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs) { - super(input, outputs); + super(timeline, input, outputs); List connectedWireEndsModifiable = new ArrayList<>(); List WireEndConnectionPointsModifiable = new ArrayList<>(); diff --git a/LogicUI/src/era/mi/gui/examples/RSLatchGUIExample.java b/LogicUI/src/era/mi/gui/examples/RSLatchGUIExample.java index c36ba3a9..cb5f1780 100644 --- a/LogicUI/src/era/mi/gui/examples/RSLatchGUIExample.java +++ b/LogicUI/src/era/mi/gui/examples/RSLatchGUIExample.java @@ -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); diff --git a/SampleERCP/src/sampleercp/parts/LogicUIPart.java b/SampleERCP/src/sampleercp/parts/LogicUIPart.java index c142cb67..481879c6 100644 --- a/SampleERCP/src/sampleercp/parts/LogicUIPart.java +++ b/SampleERCP/src/sampleercp/parts/LogicUIPart.java @@ -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 index 0468ec1e..00000000 --- a/era.mi/src/era/mi/logic/Simulation.java +++ /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 diff --git a/era.mi/src/era/mi/logic/components/BasicComponent.java b/era.mi/src/era/mi/logic/components/BasicComponent.java index f89a72c7..47a3057a 100644 --- a/era.mi/src/era/mi/logic/components/BasicComponent.java +++ b/era.mi/src/era/mi/logic/components/BasicComponent.java @@ -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(); diff --git a/era.mi/src/era/mi/logic/components/BitDisplay.java b/era.mi/src/era/mi/logic/components/BitDisplay.java index f34c9239..d8691f3b 100644 --- a/era.mi/src/era/mi/logic/components/BitDisplay.java +++ b/era.mi/src/era/mi/logic/components/BitDisplay.java @@ -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(); diff --git a/era.mi/src/era/mi/logic/components/Clock.java b/era.mi/src/era/mi/logic/components/Clock.java index f7648554..01795e01 100644 --- a/era.mi/src/era/mi/logic/components/Clock.java +++ b/era.mi/src/era/mi/logic/components/Clock.java @@ -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 diff --git a/era.mi/src/era/mi/logic/components/Component.java b/era.mi/src/era/mi/logic/components/Component.java index f104e5fc..e26b6cd3 100644 --- a/era.mi/src/era/mi/logic/components/Component.java +++ b/era.mi/src/era/mi/logic/components/Component.java @@ -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 getAllInputs(); + public abstract List getAllInputs(); /** * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI. */ - public List getAllOutputs(); + public abstract List getAllOutputs(); } diff --git a/era.mi/src/era/mi/logic/components/Connector.java b/era.mi/src/era/mi/logic/components/Connector.java index 19367a57..5fd7ee4c 100644 --- a/era.mi/src/era/mi/logic/components/Connector.java +++ b/era.mi/src/era/mi/logic/components/Connector.java @@ -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) diff --git a/era.mi/src/era/mi/logic/components/Demux.java b/era.mi/src/era/mi/logic/components/Demux.java index 21825961..3b267dfe 100644 --- a/era.mi/src/era/mi/logic/components/Demux.java +++ b/era.mi/src/era/mi/logic/components/Demux.java @@ -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; diff --git a/era.mi/src/era/mi/logic/components/ManualSwitch.java b/era.mi/src/era/mi/logic/components/ManualSwitch.java index caaf49b4..9ae08eba 100644 --- a/era.mi/src/era/mi/logic/components/ManualSwitch.java +++ b/era.mi/src/era/mi/logic/components/ManualSwitch.java @@ -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; diff --git a/era.mi/src/era/mi/logic/components/Merger.java b/era.mi/src/era/mi/logic/components/Merger.java index a9d14101..ab380665 100644 --- a/era.mi/src/era/mi/logic/components/Merger.java +++ b/era.mi/src/era/mi/logic/components/Merger.java @@ -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]; diff --git a/era.mi/src/era/mi/logic/components/Mux.java b/era.mi/src/era/mi/logic/components/Mux.java index b7cb6744..5391e655 100644 --- a/era.mi/src/era/mi/logic/components/Mux.java +++ b/era.mi/src/era/mi/logic/components/Mux.java @@ -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(); diff --git a/era.mi/src/era/mi/logic/components/Splitter.java b/era.mi/src/era/mi/logic/components/Splitter.java index 32841ab9..8c54d0f9 100644 --- a/era.mi/src/era/mi/logic/components/Splitter.java +++ b/era.mi/src/era/mi/logic/components/Splitter.java @@ -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); diff --git a/era.mi/src/era/mi/logic/components/TriStateBuffer.java b/era.mi/src/era/mi/logic/components/TriStateBuffer.java index ee420566..123e2c54 100644 --- a/era.mi/src/era/mi/logic/components/TriStateBuffer.java +++ b/era.mi/src/era/mi/logic/components/TriStateBuffer.java @@ -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()); diff --git a/era.mi/src/era/mi/logic/components/gates/AndGate.java b/era.mi/src/era/mi/logic/components/gates/AndGate.java index e045982f..edd34d70 100644 --- a/era.mi/src/era/mi/logic/components/gates/AndGate.java +++ b/era.mi/src/era/mi/logic/components/gates/AndGate.java @@ -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); } } diff --git a/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java b/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java index dd8a6d6f..038e2272 100644 --- a/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java +++ b/era.mi/src/era/mi/logic/components/gates/MultiInputGate.java @@ -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(); diff --git a/era.mi/src/era/mi/logic/components/gates/NotGate.java b/era.mi/src/era/mi/logic/components/gates/NotGate.java index 150785b2..685bc229 100644 --- a/era.mi/src/era/mi/logic/components/gates/NotGate.java +++ b/era.mi/src/era/mi/logic/components/gates/NotGate.java @@ -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; diff --git a/era.mi/src/era/mi/logic/components/gates/OrGate.java b/era.mi/src/era/mi/logic/components/gates/OrGate.java index 7450d8fb..f34206fa 100644 --- a/era.mi/src/era/mi/logic/components/gates/OrGate.java +++ b/era.mi/src/era/mi/logic/components/gates/OrGate.java @@ -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); } } diff --git a/era.mi/src/era/mi/logic/components/gates/XorGate.java b/era.mi/src/era/mi/logic/components/gates/XorGate.java index 7c8d740c..a177695e 100644 --- a/era.mi/src/era/mi/logic/components/gates/XorGate.java +++ b/era.mi/src/era/mi/logic/components/gates/XorGate.java @@ -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); } } diff --git a/era.mi/src/era/mi/logic/tests/ComponentTest.java b/era.mi/src/era/mi/logic/tests/ComponentTest.java index b4e9697c..c52833c0 100644 --- a/era.mi/src/era/mi/logic/tests/ComponentTest.java +++ b/era.mi/src/era/mi/logic/tests/ComponentTest.java @@ -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); diff --git a/era.mi/src/era/mi/logic/tests/GUITest.java b/era.mi/src/era/mi/logic/tests/GUITest.java index a135e58d..78421c4f 100644 --- a/era.mi/src/era/mi/logic/tests/GUITest.java +++ b/era.mi/src/era/mi/logic/tests/GUITest.java @@ -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 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 diff --git a/era.mi/src/era/mi/logic/tests/TestBitDisplay.java b/era.mi/src/era/mi/logic/tests/TestBitDisplay.java index 82c0854d..28dc1cc1 100644 --- a/era.mi/src/era/mi/logic/tests/TestBitDisplay.java +++ b/era.mi/src/era/mi/logic/tests/TestBitDisplay.java @@ -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); } diff --git a/era.mi/src/era/mi/logic/timeline/Timeline.java b/era.mi/src/era/mi/logic/timeline/Timeline.java index 88aa1976..c22e1a4a 100644 --- a/era.mi/src/era/mi/logic/timeline/Timeline.java +++ b/era.mi/src/era/mi/logic/timeline/Timeline.java @@ -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) diff --git a/era.mi/src/era/mi/logic/wires/Wire.java b/era.mi/src/era/mi/logic/wires/Wire.java index 823e0321..9a173877 100644 --- a/era.mi/src/era/mi/logic/wires/Wire.java +++ b/era.mi/src/era/mi/logic/wires/Wire.java @@ -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 attached = new ArrayList(); public final int length; private List inputs = new ArrayList(); + 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)