From c5bb1677158ccadbbea2042f7f2816d83682f775 Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 10 May 2016 11:35:33 +0200 Subject: [PATCH] added option to create only NAnd-Gates --- .../analyse/expression/Expression.java | 10 ++++++++ .../digital/analyse/expression/Not.java | 12 +++++++-- .../digital/analyse/expression/Operation.java | 11 ++++++++ .../expression/modify/ExpressionModifier.java | 13 ++++++++++ .../analyse/expression/modify/NAnd.java | 25 +++++++++++++++++++ .../analyse/expression/modify/NOr.java | 25 +++++++++++++++++++ .../gui/components/table/TableFrame.java | 22 +++++++++++++--- src/main/resources/lang/lang_de.properties | 2 ++ src/main/resources/lang/lang_en.properties | 2 ++ 9 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/neemann/digital/analyse/expression/modify/ExpressionModifier.java create mode 100644 src/main/java/de/neemann/digital/analyse/expression/modify/NAnd.java create mode 100644 src/main/java/de/neemann/digital/analyse/expression/modify/NOr.java diff --git a/src/main/java/de/neemann/digital/analyse/expression/Expression.java b/src/main/java/de/neemann/digital/analyse/expression/Expression.java index c9dac8184..c4a57c543 100644 --- a/src/main/java/de/neemann/digital/analyse/expression/Expression.java +++ b/src/main/java/de/neemann/digital/analyse/expression/Expression.java @@ -1,5 +1,7 @@ package de.neemann.digital.analyse.expression; +import de.neemann.digital.analyse.expression.modify.ExpressionModifier; + /** * An expression which can be evaluated to a boolean value * @@ -25,6 +27,14 @@ public interface Expression { */ V traverse(V visitor); + /** + * Used to modify the ast + * + * @param modifier the modifier + */ + default void modify(ExpressionModifier modifier) { + } + /** * String used to order expressions * diff --git a/src/main/java/de/neemann/digital/analyse/expression/Not.java b/src/main/java/de/neemann/digital/analyse/expression/Not.java index 885f79765..4918ea2aa 100644 --- a/src/main/java/de/neemann/digital/analyse/expression/Not.java +++ b/src/main/java/de/neemann/digital/analyse/expression/Not.java @@ -1,11 +1,13 @@ package de.neemann.digital.analyse.expression; +import de.neemann.digital.analyse.expression.modify.ExpressionModifier; + /** * @author hneemann */ public final class Not implements Expression { - private final Expression expression; + private Expression expression; /** * Creates a not expression @@ -25,7 +27,7 @@ public final class Not implements Expression { return new Not(a); } - private Not(Expression expression) { + public Not(Expression expression) { this.expression = expression; } @@ -42,6 +44,12 @@ public final class Not implements Expression { return v; } + @Override + public void modify(ExpressionModifier modifier) { + expression.modify(modifier); + expression = modifier.modify(expression); + } + @Override public String getOrderString() { return expression.getOrderString(); diff --git a/src/main/java/de/neemann/digital/analyse/expression/Operation.java b/src/main/java/de/neemann/digital/analyse/expression/Operation.java index ba4079fac..7f852799e 100644 --- a/src/main/java/de/neemann/digital/analyse/expression/Operation.java +++ b/src/main/java/de/neemann/digital/analyse/expression/Operation.java @@ -1,5 +1,7 @@ package de.neemann.digital.analyse.expression; +import de.neemann.digital.analyse.expression.modify.ExpressionModifier; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -101,6 +103,15 @@ public abstract class Operation implements Expression { return v; } + @Override + public void modify(ExpressionModifier modifier) { + for (int i = 0; i < expr.size(); i++) { + Expression e = expr.get(i); + e.modify(modifier); + expr.set(i, modifier.modify(e)); + } + } + /** * @return the sub expressions */ diff --git a/src/main/java/de/neemann/digital/analyse/expression/modify/ExpressionModifier.java b/src/main/java/de/neemann/digital/analyse/expression/modify/ExpressionModifier.java new file mode 100644 index 000000000..e115fe5f3 --- /dev/null +++ b/src/main/java/de/neemann/digital/analyse/expression/modify/ExpressionModifier.java @@ -0,0 +1,13 @@ +package de.neemann.digital.analyse.expression.modify; + +import de.neemann.digital.analyse.expression.Expression; + +/** + * @author hneemann + */ +public interface ExpressionModifier { + ExpressionModifier IDENTITY = expression -> expression; + + Expression modify(Expression expression); + +} diff --git a/src/main/java/de/neemann/digital/analyse/expression/modify/NAnd.java b/src/main/java/de/neemann/digital/analyse/expression/modify/NAnd.java new file mode 100644 index 000000000..5f0c75a89 --- /dev/null +++ b/src/main/java/de/neemann/digital/analyse/expression/modify/NAnd.java @@ -0,0 +1,25 @@ +package de.neemann.digital.analyse.expression.modify; + +import de.neemann.digital.analyse.expression.Expression; +import de.neemann.digital.analyse.expression.Operation; + +import java.util.ArrayList; + +import static de.neemann.digital.analyse.expression.Not.not; + +/** + * @author hneemann + */ +public class NAnd implements ExpressionModifier { + + @Override + public Expression modify(Expression expression) { + if (expression instanceof Operation.Or) { + ArrayList exp = new ArrayList<>(); + for (Expression e : ((Operation.Or) expression).getExpressions()) + exp.add(not(e)); + return not(Operation.and(exp)); + } else + return expression; + } +} diff --git a/src/main/java/de/neemann/digital/analyse/expression/modify/NOr.java b/src/main/java/de/neemann/digital/analyse/expression/modify/NOr.java new file mode 100644 index 000000000..a9766bc99 --- /dev/null +++ b/src/main/java/de/neemann/digital/analyse/expression/modify/NOr.java @@ -0,0 +1,25 @@ +package de.neemann.digital.analyse.expression.modify; + +import de.neemann.digital.analyse.expression.Expression; +import de.neemann.digital.analyse.expression.Operation; + +import java.util.ArrayList; + +import static de.neemann.digital.analyse.expression.Not.not; + +/** + * @author hneemann + */ +public class NOr implements ExpressionModifier { + + @Override + public Expression modify(Expression expression) { + if (expression instanceof Operation.And) { + ArrayList exp = new ArrayList<>(); + for (Expression e : ((Operation.And) expression).getExpressions()) + exp.add(not(e)); + return not(Operation.or(exp)); + } else + return expression; + } +} diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableFrame.java b/src/main/java/de/neemann/digital/gui/components/table/TableFrame.java index f572ef3a6..48c81a7eb 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableFrame.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableFrame.java @@ -6,6 +6,8 @@ import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.ExpressionException; import de.neemann.digital.analyse.expression.format.FormatToExpression; import de.neemann.digital.analyse.expression.format.FormatterException; +import de.neemann.digital.analyse.expression.modify.ExpressionModifier; +import de.neemann.digital.analyse.expression.modify.NAnd; import de.neemann.digital.draw.builder.Builder; import de.neemann.digital.draw.builder.BuilderException; import de.neemann.digital.draw.elements.Circuit; @@ -122,9 +124,22 @@ public class TableFrame extends JFrame { createMenu.add(new ToolTipAction(Lang.get("menu_table_create")) { @Override public void actionPerformed(ActionEvent actionEvent) { - createCircuit(); + createCircuit(ExpressionModifier.IDENTITY); } }.setToolTip(Lang.get("menu_table_create_tt")).createJMenuItem()); + createMenu.add(new ToolTipAction(Lang.get("menu_table_createNAnd")) { + @Override + public void actionPerformed(ActionEvent actionEvent) { + createCircuit(new NAnd()); + } + }.setToolTip(Lang.get("menu_table_createNAnd_tt")).createJMenuItem()); +// createMenu.add(new ToolTipAction(Lang.get("menu_table_createNOr")) { +// @Override +// public void actionPerformed(ActionEvent actionEvent) { +// createCircuit(new NOr()); +// } +// }.setToolTip(Lang.get("menu_table_createNOr_tt")).createJMenuItem()); + bar.add(createMenu); @@ -138,7 +153,7 @@ public class TableFrame extends JFrame { setLocationRelativeTo(parent); } - private void createCircuit() { + private void createCircuit(ExpressionModifier modifier) { try { Builder builder = new Builder(shapeFactory); HashSet contained = new HashSet<>(); @@ -148,7 +163,8 @@ public class TableFrame extends JFrame { if (!contained.contains(name)) { contained.add(name); try { - builder.addExpression(name, expression); + expression.modify(modifier); + builder.addExpression(name, modifier.modify(expression)); } catch (BuilderException e) { throw new RuntimeException(e); } diff --git a/src/main/resources/lang/lang_de.properties b/src/main/resources/lang/lang_de.properties index 501b1227a..6ca28f6f4 100644 --- a/src/main/resources/lang/lang_de.properties +++ b/src/main/resources/lang/lang_de.properties @@ -268,6 +268,8 @@ menu_table_columnsAdd=hinzuf\u00FCgen menu_table_columnsAdd_tt=F\u00FCgt der Tabelle eine Ergebnisspalte hinzu. menu_table_create=Model erzeugen menu_table_create_tt=Erzeugt ein Model, welches der Wahrheitstabelle entspricht. +menu_table_createNAnd=Model erzeugen mit NAnd +menu_table_createNAnd_tt=Erzeugt ein Model, welches der Wahrheitstabelle entspricht nur mit NAnd-Gattern. menu_about=\u00DCber Digital diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties index 9147c8529..45e5e9f49 100644 --- a/src/main/resources/lang/lang_en.properties +++ b/src/main/resources/lang/lang_en.properties @@ -248,6 +248,8 @@ menu_table_columnsAdd=Add a Column menu_table_columnsAdd_tt=Adds a new result column. menu_table_create=create circuit menu_table_create_tt=Creates a circuit which reproduces the truth table. +menu_table_createNAnd=create with NAnd +menu_table_createNAnd_tt=Creates a circuit which reproduces the truth table only with NAnd gates. win_saveChanges=Save Changes? win_confirmExit=Confirm Exit!