diff --git a/src/main/dig/Ampel_MSJK.dig b/src/main/dig/Ampel_MSJK.dig
index beb22404f..0ed12671b 100644
--- a/src/main/dig/Ampel_MSJK.dig
+++ b/src/main/dig/Ampel_MSJK.dig
@@ -110,6 +110,12 @@
0
+
+ Break
+
+
+ 0
+
diff --git a/src/main/java/de/neemann/digital/core/wiring/Break.java b/src/main/java/de/neemann/digital/core/wiring/Break.java
index 2eda0b933..075bb3482 100644
--- a/src/main/java/de/neemann/digital/core/wiring/Break.java
+++ b/src/main/java/de/neemann/digital/core/wiring/Break.java
@@ -5,6 +5,7 @@ import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.Element;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
/**
@@ -20,6 +21,9 @@ public class Break implements Element {
private ObservableValue input;
+ public Break(ElementAttributes attributes) {
+ }
+
@Override
public void setInputs(ObservableValue... inputs) throws NodeException {
input = inputs[0].checkBits(1, null);
diff --git a/src/main/java/de/neemann/digital/core/wiring/Clock.java b/src/main/java/de/neemann/digital/core/wiring/Clock.java
index 46ae0a0ef..4a98ca74e 100644
--- a/src/main/java/de/neemann/digital/core/wiring/Clock.java
+++ b/src/main/java/de/neemann/digital/core/wiring/Clock.java
@@ -52,49 +52,4 @@ public class Clock implements Element {
return frequency;
}
-// private static class MyModelStateObserver implements ModelStateObserver {
-// private final Model model;
-// private final Clock clock;
-// private final int frequency;
-// private final ObservableValue output;
-// private Timer timer;
-//
-// public MyModelStateObserver(Model model, Clock clock, int frequency, ObservableValue output) {
-// this.model = model;
-// this.clock = clock;
-// this.frequency = frequency;
-// this.output = output;
-// }
-//
-// @Override
-// public void handleEvent(ModelEvent event) {
-// switch (event.getType()) {
-// case STARTED:
-// int delay = 1000 / frequency;
-// if (delay < 100) delay = 100;
-// timer = new Timer(delay, e -> {
-// output.setValue(1 - output.getValue());
-// try {
-// model.doStep();
-// } catch (NodeException e1) {
-// SwingUtilities.invokeLater(new ErrorMessage("ClockError").addCause(e1));
-// timer.stop();
-// }
-// });
-// timer.start();
-// break;
-// case STOPPED:
-// if (timer != null)
-// timer.stop();
-// break;
-// case FETCHCLOCK:
-// event.registerClock(clock);
-// break;
-// }
-// }
-//
-// public void remove() {
-// model.removeObserver(this);
-// }
-// }
}
diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java
index 92cb0c739..78eab1ac5 100644
--- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java
+++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java
@@ -47,6 +47,7 @@ public class ElementLibrary implements Iterable
add(Out.LEDDESCRIPTION, menu);
add(Out.PROBEDESCRIPTION, menu);
add(Clock.DESCRIPTION, menu);
+ add(Break.DESCRIPTION, menu);
add(Out.SEVENDESCRIPTION, menu);
add(Out.SEVENHEXDESCRIPTION, menu);
diff --git a/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java b/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java
new file mode 100644
index 000000000..5dcf9be32
--- /dev/null
+++ b/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java
@@ -0,0 +1,50 @@
+package de.neemann.digital.draw.model;
+
+import de.neemann.digital.core.*;
+import de.neemann.digital.core.wiring.Clock;
+import de.neemann.gui.ErrorMessage;
+
+import javax.swing.*;
+
+/**
+ * @author hneemann
+ */
+public class RealTimeClock implements ModelStateObserver {
+
+ private final Model model;
+ private final int frequency;
+ private final ObservableValue output;
+ private Timer timer;
+
+ public RealTimeClock(Model model, Clock clock) {
+ this.model = model;
+ int f = clock.getFrequency();
+ if (f < 1) f = 1;
+ this.frequency = f;
+ this.output = clock.getClockOutput();
+ }
+
+ @Override
+ public void handleEvent(ModelEvent event) {
+ switch (event.getType()) {
+ case STARTED:
+ int delay = 1000 / frequency;
+ if (delay < 100) delay = 100;
+ timer = new Timer(delay, e -> {
+ output.setValue(1 - output.getValue());
+ try {
+ model.doStep();
+ } catch (NodeException e1) {
+ SwingUtilities.invokeLater(new ErrorMessage("ClockError").addCause(e1));
+ timer.stop();
+ }
+ });
+ timer.start();
+ break;
+ case STOPPED:
+ if (timer != null)
+ timer.stop();
+ break;
+ }
+ }
+}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/BreakShape.java b/src/main/java/de/neemann/digital/draw/shapes/BreakShape.java
new file mode 100644
index 000000000..1ae35e9a3
--- /dev/null
+++ b/src/main/java/de/neemann/digital/draw/shapes/BreakShape.java
@@ -0,0 +1,46 @@
+package de.neemann.digital.draw.shapes;
+
+import de.neemann.digital.core.Observer;
+import de.neemann.digital.draw.elements.IOState;
+import de.neemann.digital.draw.elements.Pin;
+import de.neemann.digital.draw.elements.Pins;
+import de.neemann.digital.draw.graphics.Graphic;
+import de.neemann.digital.draw.graphics.Orientation;
+import de.neemann.digital.draw.graphics.Style;
+import de.neemann.digital.draw.graphics.Vector;
+
+/**
+ * @author hneemann
+ */
+public class BreakShape implements Shape {
+ private static final int SIZE = 8;
+ private static final int SIZEQ = 5;
+ private static final Vector RAD = new Vector(SIZE, SIZE);
+ private static final Vector D1 = new Vector(SIZEQ, -SIZEQ);
+ private static final Vector D2 = new Vector(SIZEQ, SIZEQ);
+ private final String label;
+
+ public BreakShape(String label) {
+ this.label = label;
+ }
+
+ @Override
+ public Pins getPins() {
+ return new Pins().add(new Pin(new Vector(0, 0), "brk", Pin.Direction.input));
+ }
+
+ @Override
+ public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) {
+ return null;
+ }
+
+ @Override
+ public void drawTo(Graphic graphic) {
+ Vector center = new Vector(2 + SIZE, 0);
+ graphic.drawCircle(center.sub(RAD), center.add(RAD), Style.NORMAL);
+ graphic.drawLine(center.sub(D1), center.add(D1), Style.NORMAL);
+ graphic.drawLine(center.sub(D2), center.add(D2), Style.NORMAL);
+ Vector textPos = new Vector(SIZE * 3, 0);
+ graphic.drawText(textPos, textPos.add(1, 0), label, Orientation.LEFTCENTER, Style.NORMAL);
+ }
+}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
index 7c0a0ab07..7ed56ccb3 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
@@ -50,6 +50,7 @@ public final class ShapeFactory {
map.put(Out.SEVENDESCRIPTION.getName(), attr -> new SevenSegShape(attr.get(AttributeKey.Label), attr.get(AttributeKey.Color)));
map.put(Out.SEVENHEXDESCRIPTION.getName(), attr -> new SevenSegHexShape(attr.get(AttributeKey.Label), attr.get(AttributeKey.Color)));
+ map.put(Break.DESCRIPTION.getName(), attributes -> new BreakShape(attributes.get(AttributeKey.Label)));
map.put(Multiplexer.DESCRIPTION.getName(), attr -> new MuxerShape(attr.get(AttributeKey.SelectorBits), attr.get(AttributeKey.FlipSelPositon)));
map.put(Demultiplexer.DESCRIPTION.getName(), attr -> new DemuxerShape(attr.get(AttributeKey.SelectorBits), true, attr.get(AttributeKey.FlipSelPositon)));
diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java
index bc942322c..27b7e0b2c 100644
--- a/src/main/java/de/neemann/digital/gui/Main.java
+++ b/src/main/java/de/neemann/digital/gui/Main.java
@@ -4,11 +4,13 @@ import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.SpeedTest;
+import de.neemann.digital.core.wiring.Clock;
import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.draw.elements.PinException;
import de.neemann.digital.draw.elements.PinOrder;
import de.neemann.digital.draw.library.ElementLibrary;
import de.neemann.digital.draw.model.ModelDescription;
+import de.neemann.digital.draw.model.RealTimeClock;
import de.neemann.digital.draw.shapes.ShapeFactory;
import de.neemann.digital.gui.components.CircuitComponent;
import de.neemann.digital.gui.components.ElementOrderer;
@@ -277,6 +279,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
toolBar.add(runModel.createJButtonNoText());
toolBar.add(runModelMicro.createJButtonNoText());
toolBar.add(doStep.createJButtonNoText());
+ toolBar.addSeparator();
toolBar.add(runFast.createJButtonNoText());
toolBar.addSeparator();
@@ -306,9 +309,15 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
circuitComponent.setModeAndReset(CircuitComponent.Mode.running);
modelDescription = new ModelDescription(circuitComponent.getCircuit(), library);
+ model = modelDescription.createModel();
modelDescription.connectToGui(circuitComponent);
+ if (runClock)
+ for (Clock c : model.getClocks())
+ model.addObserver(new RealTimeClock(model, c));
+
model.init();
+
} catch (NodeException e) {
if (modelDescription != null) {
if (e.getNodes() != null)