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;
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());
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
}
});
simulationThread.start();
- Simulation.TIMELINE.addEventAddedListener(event ->
+ timeline.addEventAddedListener(event ->
{
if (event.getTiming() <= System.currentTimeMillis())
simulationThread.interrupt();
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;
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<>();
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;
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;
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;
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<>();
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;
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)
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;
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<>();
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;
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<>();
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;
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<>();
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;
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);
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
@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));
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
}
});
simulationThread.start();
- Simulation.TIMELINE.addEventAddedListener(event ->
+ timeline.addEventAddedListener(event ->
{
if (event.getTiming() <= System.currentTimeMillis())
simulationThread.interrupt();
+++ /dev/null
-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
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;
*
* @author Fabian Stemmler
*/
-public abstract class BasicComponent implements WireObserver, Component
+public abstract class BasicComponent extends Component implements WireObserver
{
private int processTime;
*
* @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();
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;
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();
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;
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;
* @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();
private void addToTimeline()
{
- Simulation.TIMELINE.addEvent(this, delta);
+ timeline.addEvent(this, delta);
}
@Override
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();
}
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;
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)
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;
* @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;
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;
* @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;
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;
* @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];
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;
* @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();
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);
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;
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());
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);
}
}
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;
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();
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;
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;
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);
}
}
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 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);
}
}
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;
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;
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);
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());
@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);
@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);
}
@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());
aI.clearSignals();
enI.feedSignals(Bit.ZERO);
- Simulation.TIMELINE.executeAll();
+ t.executeAll();
assertEquals(Bit.ZERO, a.getValue());
@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);
@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);
@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);
}
@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);
}
@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);
}
@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);
}
@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());
@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());
@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);
{
// 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);
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);
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);
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;
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<>();
});
}
+ public Timeline getTimeline()
+ {
+ return t;
+ };
+
@Override
public void paint(Graphics some_g)
{
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
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)
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);
}
*
* @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)
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;
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();
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);
}
/**
{
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)