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 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