diff --git a/src/main/java/de/neemann/digital/analyse/DependencyAnalyser.java b/src/main/java/de/neemann/digital/analyse/DependencyAnalyser.java index e50e6c40e..e3f0e6f22 100644 --- a/src/main/java/de/neemann/digital/analyse/DependencyAnalyser.java +++ b/src/main/java/de/neemann/digital/analyse/DependencyAnalyser.java @@ -7,8 +7,6 @@ import de.neemann.digital.lang.Lang; import java.util.*; -import static de.neemann.digital.core.Model.MAX_LOOP_COUNTER; - /** * Used to analyse on which inputs a given output depends. * So you only have to take into account the inputs, a given outputs @@ -30,7 +28,7 @@ public class DependencyAnalyser { dependencyMap = new HashMap<>(); for (Signal s : modelAnalyser.getInputs()) { Set effected = new HashSet<>(); - backtracking(s.getValue(), effected, MAX_LOOP_COUNTER); + backtracking(s.getValue(), effected); dependencyMap.put(s, effected); } } @@ -50,19 +48,18 @@ public class DependencyAnalyser { return list; } - private void backtracking(ObservableValue value, Set effected, int depth) throws PinException, BacktrackException { - effected.add(value); + private void backtracking(ObservableValue value, Set effected) throws PinException, BacktrackException { + if (!effected.contains(value)) { + effected.add(value); - if (depth < 0) - throw new BacktrackException(Lang.get("err_backtrackLoopFound")); - - for (Observer o : value) { - if ((o instanceof NodeInterface)) { - ObservableValues outputs = ((NodeInterface) o).getOutputs(); - for (ObservableValue co : outputs) - backtracking(co, effected, depth - 1); - } else - throw new BacktrackException(Lang.get("err_backtrackOf_N_isImpossible", o.getClass().getSimpleName())); + for (Observer o : value) { + if ((o instanceof NodeInterface)) { + ObservableValues outputs = ((NodeInterface) o).getOutputs(); + for (ObservableValue co : outputs) + backtracking(co, effected); + } else + throw new BacktrackException(Lang.get("err_backtrackOf_N_isImpossible", o.getClass().getSimpleName())); + } } } diff --git a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java index 2d7a8530c..df803e213 100644 --- a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java +++ b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java @@ -284,9 +284,6 @@ public class ModelAnalyser { tt.addResult(s.getName(), e); } - // for now only checks for circular dependencies - new DependencyAnalyser(this); - model.init(); for (int row = 0; row < rows; row++) { bitsetter.fill(row); diff --git a/src/main/java/de/neemann/digital/core/wiring/bus/CommonBusValue.java b/src/main/java/de/neemann/digital/core/wiring/bus/CommonBusValue.java index b3e39dc07..f4dea1338 100644 --- a/src/main/java/de/neemann/digital/core/wiring/bus/CommonBusValue.java +++ b/src/main/java/de/neemann/digital/core/wiring/bus/CommonBusValue.java @@ -1,14 +1,16 @@ package de.neemann.digital.core.wiring.bus; +import de.neemann.digital.core.NodeInterface; import de.neemann.digital.core.ObservableValue; -import de.neemann.digital.core.Observer; +import de.neemann.digital.core.ObservableValues; +import de.neemann.digital.draw.elements.PinException; import java.util.Arrays; /** * This observer is added to all outputs connected together */ -public final class CommonBusValue extends ObservableValue implements Observer { +public final class CommonBusValue extends ObservableValue implements NodeInterface { private final BusModelStateObserver obs; private final PullResistor resistor; private final ObservableValue[] inputs; @@ -76,4 +78,9 @@ public final class CommonBusValue extends ObservableValue implements Observer { + "inputs=" + Arrays.toString(inputs) + "', -->" + super.toString() + " }"; } + + @Override + public ObservableValues getOutputs() throws PinException { + return new ObservableValues(this); + } } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 614473ceb..8a8362590 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -539,7 +539,6 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Die Steuereingänge eines Transmission-Gates müssen invertiert beschaltet werden! Signal {0} wurde mehrfach verwendet! Fehler beim Einlesen der Testdaten. - Die Schaltung enthält ungepufferte zirkuläre Abhängigkeiten. Die Modelkomponente {0} kann nicht analysiert werden. Adress-Bits diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index a2a71e4b4..98e74a5ef 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -529,7 +529,6 @@ The names of the variables may not be unique. The two control inputs of a transmission gate must be inverted! Signal {0} is used twice! Error parsing the test data. - The circuit contains unbuffered circular dependencies. The model component {0} can not be analysed. Address Bits