diff --git a/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterLaTeX.java b/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterLaTeX.java
index d36082012..4da02e5fb 100644
--- a/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterLaTeX.java
+++ b/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterLaTeX.java
@@ -13,6 +13,7 @@ import de.neemann.digital.analyse.quinemc.ThreeStateValue;
import de.neemann.digital.draw.graphics.text.formatter.LaTeXFormatter;
/**
+ * Creates a LaTeX table using the truth table data
*/
public class TruthTableFormatterLaTeX implements TruthTableFormatter {
@Override
diff --git a/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java b/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java
new file mode 100644
index 000000000..c0ba9aef6
--- /dev/null
+++ b/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2019 Helmut Neemann
+ * Use of this source code is governed by the GPL v3 license
+ * that can be found in the LICENSE file.
+ */
+package de.neemann.digital.analyse.format;
+
+import de.neemann.digital.analyse.TruthTable;
+import de.neemann.digital.analyse.expression.ContextFiller;
+import de.neemann.digital.analyse.expression.ExpressionException;
+import de.neemann.digital.analyse.expression.Variable;
+import de.neemann.digital.analyse.quinemc.ThreeStateValue;
+
+/**
+ * Creates a test case which represents the truth table
+ */
+public class TruthTableFormatterTestCase implements TruthTableFormatter {
+ @Override
+ public String format(TruthTable truthTable) throws ExpressionException {
+ StringBuilder sb = new StringBuilder();
+ for (Variable v : truthTable.getVars())
+ sb.append(v.getIdentifier()).append(" ");
+
+ for (int i = 0; i < truthTable.getResultCount(); i++) {
+ sb.append(truthTable.getResultName(i));
+ if (i < truthTable.getResultCount() - 1)
+ sb.append(" ");
+ }
+ sb.append("\n\n");
+
+ ContextFiller cf = new ContextFiller(truthTable.getVars());
+ for (int i = 0; i < cf.getRowCount(); i++) {
+ cf.setContextTo(i);
+ for (Variable v : cf) {
+ sb.append(format(cf.get(v)));
+ for (int j = 0; j < v.getIdentifier().length(); j++)
+ sb.append(" ");
+ }
+
+ for (int j = 0; j < truthTable.getResultCount(); j++) {
+ ThreeStateValue r = truthTable.getResult(j).get(i);
+ sb.append(format(r));
+ if (j < truthTable.getResultCount() - 1)
+ for (int k = 0; k < truthTable.getResultName(j).length(); k++)
+ sb.append(" ");
+ }
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ private String format(boolean b) {
+ return format(ThreeStateValue.value(b));
+ }
+
+ private String format(ThreeStateValue r) {
+ switch (r) {
+ case one:
+ return "1";
+ case zero:
+ return "0";
+ case dontCare:
+ return "x";
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/de/neemann/digital/gui/components/table/ShowStringDialog.java b/src/main/java/de/neemann/digital/gui/components/table/ShowStringDialog.java
index 8c176a1e2..51b9dcac8 100644
--- a/src/main/java/de/neemann/digital/gui/components/table/ShowStringDialog.java
+++ b/src/main/java/de/neemann/digital/gui/components/table/ShowStringDialog.java
@@ -5,11 +5,16 @@
*/
package de.neemann.digital.gui.components.table;
+import de.neemann.digital.lang.Lang;
import de.neemann.gui.Screen;
+import de.neemann.gui.ToolTipAction;
import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
/**
* Shows a simple string
@@ -69,6 +74,23 @@ public class ShowStringDialog extends JDialog {
textComp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
getContentPane().add(new JScrollPane(textComp));
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(new ToolTipAction(Lang.get("btn_copyToClipboard")) {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent) {
+ StringSelection stringSelection = new StringSelection(str);
+ Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+ clipboard.setContents(stringSelection, null);
+ }
+ }.createJButton());
+ buttons.add(new ToolTipAction(Lang.get("ok")) {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent) {
+ dispose();
+ }
+ }.createJButton());
+ getContentPane().add(buttons, BorderLayout.SOUTH);
+
pack();
setLocationRelativeTo(parent);
}
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 54deb1f01..c1355b594 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
@@ -15,6 +15,8 @@ import de.neemann.digital.analyse.expression.NamedExpression;
import de.neemann.digital.analyse.expression.Variable;
import de.neemann.digital.analyse.expression.format.FormatterException;
import de.neemann.digital.analyse.expression.modify.*;
+import de.neemann.digital.analyse.format.TruthTableFormatter;
+import de.neemann.digital.analyse.format.TruthTableFormatterTestCase;
import de.neemann.digital.analyse.quinemc.BoolTableByteArray;
import de.neemann.digital.builder.ATF150x.ATFDevice;
import de.neemann.digital.builder.ExpressionToFileExporter;
@@ -421,6 +423,20 @@ public class TableDialog extends JDialog {
}
});
+ fileMenu.add(new ToolTipAction(Lang.get("menu_table_createFunctionFixture")) {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ try {
+ TruthTableFormatter test = new TruthTableFormatterTestCase();
+ String testCase = test.format(undoManager.getActual());
+ new ShowStringDialog(TableDialog.this, Lang.get("win_table_exportDialog"),
+ testCase).setVisible(true);
+ } catch (ExpressionException e1) {
+ new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e1).show(TableDialog.this);
+ }
+ }
+ }.setToolTip(Lang.get("menu_table_createFunctionFixture_tt")).createJMenuItem());
+
fileMenu.add(new ToolTipAction(Lang.get("menu_table_exportHex")) {
@Override
public void actionPerformed(ActionEvent e) {
diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml
index 7cdafb23f..996a7afb2 100644
--- a/src/main/resources/lang/lang_de.xml
+++ b/src/main/resources/lang/lang_de.xml
@@ -1539,7 +1539,11 @@ Sind evtl. die Namen der Variablen nicht eindeutig?
Erzeugt eine Schaltung und verwendet nur Gatter mit maximal drei Eingängen.
Bausteine
Erzeugt eine JEDEC Datei für den Baustein
- Export LaTeX
+ Erzeuge LaTeX
+ Erzeuge Testfall
+ Erzeugt eine Testfallbeschreibung, welche in einen Testfall
+ übernommen werden kann.
+
Erzeuge HEX
Die HEX-Datei kann in ein ROM oder eine LUT geladen werden.
Neu
@@ -1777,6 +1781,7 @@ Stellen Sie sicher, dass der Flash-Vorgang abgeschlossen ist, bevor Sie diesen D
Sollen alle {0} zu ''{2}'' umbenannt werden?
Sollen die Änderungen im Feld "{0}" wirklich verworfen werden?
+ Zwischenablage
Ok
0°
diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml
index 641eabc14..4eb2a0c4d 100644
--- a/src/main/resources/lang/lang_en.xml
+++ b/src/main/resources/lang/lang_en.xml
@@ -1523,6 +1523,10 @@
Device
Creates a JEDEC file for the device
Export LaTeX
+ Export Test Case
+ Creates a test case description that can be used in a test
+ case.
+
Export HEX
You can load the HEX file to a ROM or a LUT.
New
@@ -1782,6 +1786,7 @@ Make sure the flash process is complete before closing this dialog!
Karnaugh Map
Help
+ Clipboard
Central ROM Content