diff --git a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java index 76b285b80..01d1fa557 100644 --- a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java +++ b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java @@ -4,9 +4,12 @@ import de.neemann.digital.analyse.expression.BitSetter; import de.neemann.digital.analyse.quinemc.BoolTableIntArray; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.flipflops.FlipflopD; import de.neemann.digital.lang.Lang; import java.util.ArrayList; +import java.util.List; /** * Analyses a given model. @@ -30,11 +33,33 @@ public class ModelAnalyser { public ModelAnalyser(Model model) throws AnalyseException { this.model = model; inputs = checkBinary(model.getInputs()); + outputs = checkBinary(model.getOutputs()); + + int i = 0; + List flipflops = model.findNode(FlipflopD.class); + for (FlipflopD ff : flipflops) { + ff.getDInput().removeObserver(ff); // turn off flipflop + String label = ff.getLabel(); + if (label.length() == 0) + throw new AnalyseException(Lang.get("err_DFlipflopWithoutALabel")); + + if (!label.endsWith("n")) + label += "n"; + + outputs.add(i++, new Model.Signal(label + "+1", ff.getDInput())); + + ObservableValue q = ff.getOutputs().get(0); + inputs.add(new Model.Signal(label, q)); + + ObservableValue notQ = ff.getOutputs().get(1); + if (notQ.observerCount() > 0) + q.addObserver(() -> notQ.setValue(~q.getValue())); + } + if (inputs.size() == 0) throw new AnalyseException(Lang.get("err_analyseNoInputs")); if (inputs.size() > 9) throw new AnalyseException(Lang.get("err_toManyInputs_N", 9)); - outputs = checkBinary(model.getOutputs()); if (outputs.size() == 0) throw new AnalyseException(Lang.get("err_analyseNoOutputs")); rows = 1 << inputs.size(); diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java index de28eddfe..6502246e1 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java @@ -87,4 +87,17 @@ public class FlipflopD extends Node implements Element { model.addSignal(label, q); } + /** + * @return the D input + */ + public ObservableValue getDInput() { + return dVal; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } } diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 6391ea1e6..c4acd51f2 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -109,10 +109,8 @@ public class TableDialog extends JDialog { JMenu sizeMenu = new JMenu(Lang.get("menu_table_size")); for (int i = 2; i <= 8; i++) sizeMenu.add(new JMenuItem(new SizeAction(i))); - if (Main.enableExperimental()) { - for (int i = 2; i <= 5; i++) - sizeMenu.add(new JMenuItem(new SizeSequentialAction(i))); - } + for (int i = 2; i <= 5; i++) + sizeMenu.add(new JMenuItem(new SizeSequentialAction(i))); bar.add(sizeMenu); reorderMenu = new JMenu(Lang.get("menu_table_reorder")); diff --git a/src/main/resources/lang/lang_de.properties b/src/main/resources/lang/lang_de.properties index 28665262d..6d672a1a4 100644 --- a/src/main/resources/lang/lang_de.properties +++ b/src/main/resources/lang/lang_de.properties @@ -176,6 +176,7 @@ err_notAllOutputsSameBits=Es haben nicht alle Ausg\u00E4nge die gleiche Bitbreit err_notAllOutputsSupportHighZ=Wenn mehrere Ausg\u00E4nge verbunden sind, m\u00FCssen alle Ausg\u00E4nge Tri-State Ausg\u00E4nge sein err_breakTimeOut=Nach {0} Zyklen ist kein Break aufgetreten err_labelNotConnectedToNet_N=Ein Tunnel {0} ist nicht verbunden! +err_DFlipflopWithoutALabel=D-Flipflop hat keinen Label! err_analyseNoInputs=Die Schaltung hat keine benannten Eing\u00E4nge err_analyseNoOutputs=Die Schaltung hat keine benannten Ausg\u00E4nge err_analyseValue_N_IsNotBinary=Der Wert {0} hat mehr als ein Bit. diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties index 1e2a99135..42990c4a7 100644 --- a/src/main/resources/lang/lang_en.properties +++ b/src/main/resources/lang/lang_en.properties @@ -309,6 +309,7 @@ key_Width_tt=With of symbol if this circuit is used in an element ins an other c err_analyseNoInputs=The circuit has no Inputs err_analyseNoOutputs=The circuit has no outputs err_analyseValue_N_IsNotBinary=The value {0} has more the one bit. +err_DFlipflopWithoutALabel=D-Flipflop has no label set msg_annalyseErr=Error analysing the circuit win_table=Table win_allSolutions=All possible solutions