now you can enter an expression and create a circuit representing the expression.

This commit is contained in:
hneemann 2016-07-01 11:50:33 +02:00
parent 58540f5f21
commit 445dc5393f
5 changed files with 86 additions and 0 deletions

View File

@ -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() {

View File

@ -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);
}
}

View File

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

View File

@ -12,8 +12,11 @@
<string name="btn_reload">Neu Laden</string>
<string name="btn_reload_tt">Letzte Datei noch einmal laden</string>
<string name="btn_save">Speichern</string>
<string name="btn_create">Erzeugen</string>
<string name="btn_create_tt">Erzeugt eine Schaltung in einem eigenen Fenster.</string>
<string name="cancel">Abbrechen</string>
<string name="digital">Digital</string>
<string name="expression">Ausdruck</string>
<string name="elem_Add">Addierer</string>
<string name="elem_And">Und</string>
<string name="elem_Break">Break</string>
@ -312,6 +315,8 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen.</string>
<string name="menu_view">Ansicht</string>
<string name="menu_zoomIn">Vergrößern</string>
<string name="menu_zoomOut">Verkleinern</string>
<string name="menu_expression">Ausdruck</string>
<string name="menu_expression_tt">Erzeugt eine Schaltung aus einem Ausdruck.</string>
<string name="message">Digital
Ein einfacher Simulator für digitale Schaltkreise.
@ -339,6 +344,7 @@ Geschrieben von Helmut Neemann 2016</string>
<string name="msg_pinMap_pin_N_is_N">Pin {0}: {1}</string>
<string name="msg_restartNeeded">Die Änderung erfordert einen Neustart!</string>
<string name="msg_noRomFound">Kein ROM im Model gefunden! Im ROM muss Automatisches Laden eingeschaltet sein!</string>
<string name="msg_enterAnExpression">Geben Sie einen Ausdruck ein:</string>
<string name="ok">Ok</string>
<string name="rot_0"></string>
<string name="rot_180">180°</string>

View File

@ -12,8 +12,11 @@
<string name="btn_reload">Reload</string>
<string name="btn_reload_tt">Reload last hex file</string>
<string name="btn_save">Save</string>
<string name="btn_create">Create</string>
<string name="btn_create_tt">Create a circuit in a seperate window</string>
<string name="cancel">Cancel</string>
<string name="digital">Digital</string>
<string name="expression">Expression</string>
<string name="elem_Add">Add</string>
<string name="elem_And">And</string>
<string name="elem_Break">Break</string>
@ -312,6 +315,8 @@ To analyse you can run the circuit in single gate step mode.</string>
<string name="menu_view">View</string>
<string name="menu_zoomIn">Zoom In</string>
<string name="menu_zoomOut">Zoom Out</string>
<string name="menu_expression">Expression</string>
<string name="menu_expression_tt">Create a circuit from an expression.</string>
<string name="message">Digital
A simple simulator for digital circuits.
@ -339,6 +344,7 @@ Written bei H.Neemann in 2016</string>
<string name="msg_noRomFound">No ROM found! ROM needs to be set to auto reload mode.</string>
<string name="msg_errorFileNotFound">Could not find file: {0}</string>
<string name="msg_remoteUnknownCommand">Command {0} unknown!</string>
<string name="msg_enterAnExpression">Enter an expression:</string>
<string name="ok">Ok</string>
<string name="rot_0"></string>
<string name="rot_180">180°</string>