From d4685e29f7da437fed58e1725a01f2d6058e1b20 Mon Sep 17 00:00:00 2001 From: hneemann Date: Wed, 15 Mar 2017 12:42:03 +0100 Subject: [PATCH] checks the result after minimization --- .../components/table/CheckResultListener.java | 72 +++++++++++++++++++ .../components/table/ExpressionCreator.java | 3 + 2 files changed, 75 insertions(+) create mode 100644 src/main/java/de/neemann/digital/gui/components/table/CheckResultListener.java 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 new file mode 100644 index 000000000..fdb149013 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/table/CheckResultListener.java @@ -0,0 +1,72 @@ +package de.neemann.digital.gui.components.table; + +import de.neemann.digital.analyse.expression.ContextFiller; +import de.neemann.digital.analyse.expression.Expression; +import de.neemann.digital.analyse.expression.ExpressionException; +import de.neemann.digital.analyse.expression.Variable; +import de.neemann.digital.analyse.expression.format.FormatterException; +import de.neemann.digital.analyse.quinemc.BoolTable; +import de.neemann.digital.analyse.quinemc.ThreeStateValue; +import de.neemann.digital.lang.Lang; + +import java.util.List; + +/** + * Checks the created results + * Created by hneemann on 15.03.17. + */ +public class CheckResultListener implements ExpressionListener { + private final ExpressionListener listener; + private final List variables; + private final BoolTable boolTable; + + /** + * Creates a new instance + * + * @param listener the listener to delegate the results to + * @param variables the variables used + * @param boolTable the booltable to check + * @throws ExpressionException ExpressionException + */ + public CheckResultListener(ExpressionListener listener, List variables, BoolTable boolTable) throws ExpressionException { + this.listener = listener; + this.variables = variables; + this.boolTable = boolTable; + + int n = 1 << variables.size(); + if (n != boolTable.size()) + throw new ExpressionException(Lang.get("err_exact_N0_valuesNecessaryNot_N1", n, boolTable.size())); + + } + + @Override + public void resultFound(String name, Expression expression) throws FormatterException, ExpressionException { + listener.resultFound(name, expression); + + ContextFiller cf = new ContextFiller(variables); + + for (int i = 0; i < boolTable.size(); i++) + check(boolTable.get(i), expression.calculate(cf.setContextTo(i))); + + } + + private void check(ThreeStateValue threeStateValue, boolean calculate) throws ExpressionException { + switch (threeStateValue) { + case dontCare: + return; + case one: + if (!calculate) + throw new ExpressionException("internal minimization error: found false, expected true"); + break; + case zero: + if (calculate) + throw new ExpressionException("internal minimization error: found true, expected false"); + break; + } + } + + @Override + public void close() throws FormatterException, ExpressionException { + listener.close(); + } +} diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index 867f84bbf..2e474e128 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -88,6 +88,9 @@ public class ExpressionCreator { if (!Main.enableExperimental() && localVars.size() > MAX_INPUTS_ALLOWED) throw new AnalyseException(Lang.get("err_toManyInputsIn_N0_max_N1_is_N2", resultName, MAX_INPUTS_ALLOWED, localVars.size())); + + listener = new CheckResultListener(listener, localVars, boolTable); + getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener); }