From bc43f0433b4cd24d0349a72d3963b796eb78d40b Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 7 Apr 2018 10:14:22 +0200 Subject: [PATCH] reset gates are usable in async mode --- src/main/java/de/neemann/digital/core/Model.java | 15 ++++++++++++++- src/main/java/de/neemann/digital/gui/Main.java | 11 +++++++++-- src/main/resources/lang/lang_de.xml | 1 + src/main/resources/lang/lang_en.xml | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/Model.java b/src/main/java/de/neemann/digital/core/Model.java index cf0da11ed..236ced177 100644 --- a/src/main/java/de/neemann/digital/core/Model.java +++ b/src/main/java/de/neemann/digital/core/Model.java @@ -74,6 +74,7 @@ public class Model implements Iterable { private HashSet oscillatingNodes; private boolean isInvalidSignal = false; private AsyncSeq asyncInfos; + private boolean asyncMode = false; private final ArrayList observers; private ArrayList observersStep; @@ -96,6 +97,17 @@ public class Model implements Iterable { this.observers = new ArrayList<>(); } + /** + * Sets this model to async mode. + * Async mode means that the circuit is not able to reach a stable state once the reset gates are released. + * + * @return this for chained calls + */ + public Model setAsyncMode() { + this.asyncMode = true; + return this; + } + /** * Sets the window position manager. * Allows the model to place new and close old gui windows. @@ -168,7 +180,8 @@ public class Model implements Iterable { if (!resets.isEmpty()) { for (Reset reset : resets) reset.clearReset(); - doStep(false); + if (!asyncMode) + doStep(false); } LOGGER.debug("stabilizing took " + version + " micro steps"); state = State.RUNNING; diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 4f70de0a0..6304afd38 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -1194,10 +1194,15 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS // no real clock AsyncSeq ai = model.getAsyncInfos(); if (ai != null && ai.getFrequency() > 0) { + + if (!model.getClocks().isEmpty()) + throw new RuntimeException(Lang.get("err_clocksNotAllowedInAsyncMode")); + modelSync = new LockSync(); model.addObserver( new AsyncSequentialClock(model, ai, timerExecutor, this, modelSync)); realTimeClockRunning = true; + model.setAsyncMode(); } } @@ -1235,9 +1240,11 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS return true; } catch (NodeException | PinException | RuntimeException | ElementNotFoundException e) { - if (model != null) + if (model != null) { + if (modelSync == null) + modelSync = NoSync.INST; showErrorAndStopModel(Lang.get("msg_errorCreatingModel"), e); - else + } else showErrorWithoutARunningModel(Lang.get("msg_errorCreatingModel"), e); } return false; diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 0edd1ce98..f5938024b 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -897,6 +897,7 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Fehler bei der Analyse der Schaltung: {0} Jedes ROM braucht eine eindeutige Bezeichnung um exportiert zu werden! Der Zähler benötigt mindestens zwei Bits. + Taktelemente können im asynchronen Modus nicht verwendet werden. Adress-Bits Anzahl der Adress-Bits, die verwendet werden. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 9c9f3d3b3..5aebb836f 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -892,6 +892,7 @@ Every ROM needs a unique label to be exported! The counter needs at least two bits. The name "{0}" is not unique! + Clock elements can not be used in asynchronous mode. Address Bits Number of address bits used.