diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java
index d9753476c..a1d83b076 100644
--- a/src/main/java/de/neemann/digital/gui/Main.java
+++ b/src/main/java/de/neemann/digital/gui/Main.java
@@ -24,6 +24,7 @@ import de.neemann.digital.draw.model.RealTimeClock;
import de.neemann.digital.draw.shapes.ShapeFactory;
import de.neemann.digital.gui.components.*;
import de.neemann.digital.gui.components.data.DataSetDialog;
+import de.neemann.digital.gui.components.expression.ExpressionDialog;
import de.neemann.digital.gui.components.listing.ROMListingDialog;
import de.neemann.digital.gui.components.table.TableDialog;
import de.neemann.digital.gui.remote.DigitalHandler;
@@ -538,6 +539,16 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
}
.setToolTip(Lang.get("menu_synthesise_tt"))
.createJMenuItem());
+
+ analyse.add(new ToolTipAction(Lang.get("menu_expression")) {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ new ExpressionDialog(Main.this, shapeFactory).setVisible(true);
+ }
+ }
+ .setToolTip(Lang.get("menu_expression_tt"))
+ .createJMenuItem());
+
}
private void orderMeasurements() {
diff --git a/src/main/java/de/neemann/digital/gui/components/expression/ExpressionDialog.java b/src/main/java/de/neemann/digital/gui/components/expression/ExpressionDialog.java
new file mode 100644
index 000000000..60d0d5675
--- /dev/null
+++ b/src/main/java/de/neemann/digital/gui/components/expression/ExpressionDialog.java
@@ -0,0 +1,57 @@
+package de.neemann.digital.gui.components.expression;
+
+import de.neemann.digital.analyse.expression.Expression;
+import de.neemann.digital.analyse.parser.Parser;
+import de.neemann.digital.builder.circuit.CircuitBuilder;
+import de.neemann.digital.draw.elements.Circuit;
+import de.neemann.digital.draw.shapes.ShapeFactory;
+import de.neemann.digital.gui.Main;
+import de.neemann.digital.lang.Lang;
+import de.neemann.gui.ErrorMessage;
+import de.neemann.gui.ToolTipAction;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+
+/**
+ * Dialog to enter an expression
+ * @author hneemann
+ */
+public class ExpressionDialog extends JDialog {
+
+ /**
+ * Creates a new instance
+ *
+ * @param parent the parent
+ * @param shapeFactory the shapeFactory used for new circuits
+ */
+ public ExpressionDialog(JFrame parent, ShapeFactory shapeFactory) {
+ super(parent, Lang.get("expression"), false);
+
+ JTextField text = new JTextField("(C ∨ B) ∧ (A ∨ C) ∧ (B ∨ !C) * (C + !A)", 40);
+ getContentPane().add(text, BorderLayout.CENTER);
+ getContentPane().add(new JLabel(Lang.get("msg_enterAnExpression")), BorderLayout.NORTH);
+
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ getContentPane().add(buttons, BorderLayout.SOUTH);
+
+ buttons.add(new ToolTipAction(Lang.get("btn_create")) {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ try {
+ Expression exp = new Parser(text.getText()).parse();
+ CircuitBuilder circuitBuilder = new CircuitBuilder(shapeFactory);
+ circuitBuilder.addCombinatorial("Y", exp);
+ Circuit circuit = circuitBuilder.createCircuit();
+ SwingUtilities.invokeLater(() -> new Main(null, circuit).setVisible(true));
+ } catch (Exception ex) {
+ new ErrorMessage().addCause(ex).show(ExpressionDialog.this);
+ }
+ }
+ }.setToolTip(Lang.get("btn_create_tt")).createJButton());
+
+ pack();
+ setLocationRelativeTo(parent);
+ }
+}
diff --git a/src/main/java/de/neemann/digital/gui/components/expression/package-info.java b/src/main/java/de/neemann/digital/gui/components/expression/package-info.java
new file mode 100644
index 000000000..5e0909dbc
--- /dev/null
+++ b/src/main/java/de/neemann/digital/gui/components/expression/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * Classes needed to enter an expression and to create a circuit representing the expression
+ *
+ * @author hneemann
+ */
+package de.neemann.digital.gui.components.expression;
diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml
index a1599236e..96a2eeb8b 100644
--- a/src/main/resources/lang/lang_de.xml
+++ b/src/main/resources/lang/lang_de.xml
@@ -12,8 +12,11 @@
Neu Laden
Letzte Datei noch einmal laden
Speichern
+ Erzeugen
+ Erzeugt eine Schaltung in einem eigenen Fenster.
Abbrechen
Digital
+ Ausdruck
Addierer
Und
Break
@@ -312,6 +315,8 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen.
Ansicht
Vergrößern
Verkleinern
+ Ausdruck
+ Erzeugt eine Schaltung aus einem Ausdruck.
Digital
Ein einfacher Simulator für digitale Schaltkreise.
@@ -339,6 +344,7 @@ Geschrieben von Helmut Neemann 2016
Pin {0}: {1}
Die Änderung erfordert einen Neustart!
Kein ROM im Model gefunden! Im ROM muss Automatisches Laden eingeschaltet sein!
+ Geben Sie einen Ausdruck ein:
Ok
0°
180°
diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml
index 66920a076..27e2d7341 100644
--- a/src/main/resources/lang/lang_en.xml
+++ b/src/main/resources/lang/lang_en.xml
@@ -12,8 +12,11 @@
Reload
Reload last hex file
Save
+ Create
+ Create a circuit in a seperate window
Cancel
Digital
+ Expression
Add
And
Break
@@ -312,6 +315,8 @@ To analyse you can run the circuit in single gate step mode.
View
Zoom In
Zoom Out
+ Expression
+ Create a circuit from an expression.
Digital
A simple simulator for digital circuits.
@@ -339,6 +344,7 @@ Written bei H.Neemann in 2016
No ROM found! ROM needs to be set to auto reload mode.
Could not find file: {0}
Command {0} unknown!
+ Enter an expression:
Ok
0°
180°