From 8464e72cf7a7f2583dfb31df2c3a24351e6be484 Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 7 Apr 2017 08:47:25 +0200 Subject: [PATCH] better error checking while optimizing expressions --- .../neemann/digital/analyse/TruthTable.java | 19 +++++++++++++++++-- .../builder/circuit/CircuitBuilder.java | 19 +++++++++++++++++-- .../components/table/CheckResultListener.java | 4 ++-- .../gui/components/table/TableDialog.java | 2 +- src/main/resources/lang/lang_de.xml | 4 +++- src/main/resources/lang/lang_en.xml | 4 +++- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/TruthTable.java b/src/main/java/de/neemann/digital/analyse/TruthTable.java index db1ae8df1..f635343e9 100644 --- a/src/main/java/de/neemann/digital/analyse/TruthTable.java +++ b/src/main/java/de/neemann/digital/analyse/TruthTable.java @@ -186,7 +186,13 @@ public class TruthTable { * Adds a new variable */ public void addVariable() { - addVariable("A"); + char v = 'A'; + Variable var; + do { + var = new Variable("" + v); + v++; + } while (variables.contains(var) && v <= 'Z'); + addVariable(var); } /** @@ -195,7 +201,16 @@ public class TruthTable { * @param name name of the variable */ public void addVariable(String name) { - variables.add(new Variable(name)); + addVariable(new Variable(name)); + } + + /** + * Adds a variable + * + * @param var the variable to add + */ + public void addVariable(Variable var) { + variables.add(var); for (Result r : results) r.setValues(BoolTableByteArray.createDoubledValues(r.getValues())); diff --git a/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java b/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java index 3300854a3..4c8f8b026 100644 --- a/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java +++ b/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java @@ -28,8 +28,8 @@ import java.util.*; import static de.neemann.digital.draw.shapes.GenericShape.SIZE; /** - * Builder to create a circuit from a set off expression - * Is also able to create a state machine. + * Builder to create a circuit from a set of expressions. + * Is also able to create a finite state machine. * * @author hneemann */ @@ -43,6 +43,7 @@ public class CircuitBuilder implements BuilderInterface { private final ArrayList sequentialVars; private final ArrayList flipflops; private final boolean useJKff; + private final ArrayList desiredVarOrdering; private int pos; /** @@ -62,8 +63,20 @@ public class CircuitBuilder implements BuilderInterface { * @param useJKff true if JK flip-flops should be used to create state machines instead of D flip-flops. */ public CircuitBuilder(ShapeFactory shapeFactory, boolean useJKff) { + this(shapeFactory, useJKff, null); + } + + /** + * Creates a new builder. + * + * @param shapeFactory ShapeFactory which is set to the created VisualElements + * @param useJKff true if JK flip-flops should be used to create state machines instead of D flip-flops. + * @param varOrdering the desired ordering of the variables, There may be more variables than required. Maybe null. + */ + public CircuitBuilder(ShapeFactory shapeFactory, boolean useJKff, ArrayList varOrdering) { this.shapeFactory = shapeFactory; this.useJKff = useJKff; + desiredVarOrdering = varOrdering; variableVisitor = new VariableVisitor(); fragmentVariables = new ArrayList<>(); fragments = new ArrayList<>(); @@ -285,6 +298,8 @@ public class CircuitBuilder implements BuilderInterface { // order bus variables Collection variables = variableVisitor.getVariables(); + if (desiredVarOrdering != null) + variables = order(variables, desiredVarOrdering); if (!sequentialVars.isEmpty()) variables = order(variables, sequentialVars); diff --git a/src/main/java/de/neemann/digital/gui/components/table/CheckResultListener.java b/src/main/java/de/neemann/digital/gui/components/table/CheckResultListener.java index fdb149013..5bf8c1a22 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/CheckResultListener.java +++ b/src/main/java/de/neemann/digital/gui/components/table/CheckResultListener.java @@ -56,11 +56,11 @@ public class CheckResultListener implements ExpressionListener { return; case one: if (!calculate) - throw new ExpressionException("internal minimization error: found false, expected true"); + throw new ExpressionException(Lang.get("err_minimizationFailed")); break; case zero: if (calculate) - throw new ExpressionException("internal minimization error: found true, expected false"); + throw new ExpressionException(Lang.get("err_minimizationFailed")); break; } } 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 a4cde375c..2fa4c4815 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 @@ -507,7 +507,7 @@ public class TableDialog extends JDialog { private void createCircuit(boolean useJKff, ExpressionModifier... modifier) { try { - CircuitBuilder circuitBuilder = new CircuitBuilder(shapeFactory, useJKff); + CircuitBuilder circuitBuilder = new CircuitBuilder(shapeFactory, useJKff, model.getTable().getVars()); new BuilderExpressionCreator(circuitBuilder, modifier).setUseJKOptimizer(useJKff).create(lastGeneratedExpressions); Circuit circuit = circuitBuilder.createCircuit(); SwingUtilities.invokeLater(() -> new Main(null, library, circuit).setVisible(true)); diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 58579c074..2bf1e36e4 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -462,6 +462,8 @@ Es sind nur {1} Variablen erlaubt, es wurden jedoch {2} gefunden. Die Variable {0} wird mehrfach verwendet! Die Datei muss zunächst gespeichert werden! Die Schaltung {0} bindet sich selbst ein! + Das Ergebnis der Minimierung ist nicht korrekt! +Sind evtl. die Namen der Variablen nicht eindeutig? Adress-Bits Anzahl der Adress-Bits die verwendet werden. @@ -744,7 +746,7 @@ Die Icons stammen aus dem Tango Desktop Project. Dieser Dateiename ist nicht aus dem aktuellen Projekt importierbar! Der Dateiname ist nicht eindeutig! Die Datei wurde noch nicht importiert. - Die Datei {0} existiert schon! + Die Datei {0} existiert schon! Soll die Datei überschrieben werden? Ok diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 4c00bcebb..e89ec9e02 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -449,6 +449,8 @@ allowed are {1} variables but {2} are found. The variable {0} is used twice! The file needs to be saved! The circuit {0} imports itself! + The result of the minimization is not correct! +The names of the variables may not be unique. Address Bits Number of address bits used. @@ -731,7 +733,7 @@ The icons are taken from the Tango Desktop Project. The selected file name is not importable from the actual project! The file name is not unique! The file has not yet been imported. - The file {0} already exists! + The file {0} already exists! Do you want to overwrite the file? Ok