diff --git a/src/main/java/de/neemann/digital/builder/ATF1502/ATF1502CuplExporter.java b/src/main/java/de/neemann/digital/builder/ATF1502/ATF1502CuplExporter.java new file mode 100644 index 000000000..b88bd6e8a --- /dev/null +++ b/src/main/java/de/neemann/digital/builder/ATF1502/ATF1502CuplExporter.java @@ -0,0 +1,47 @@ +package de.neemann.digital.builder.ATF1502; + +import de.neemann.digital.builder.Gal16v8.Gal16v8CuplExporter; +import de.neemann.digital.builder.PinMap; + +import java.io.IOException; +import java.io.Writer; +import java.util.Date; + +/** + * Creates a CUPL file + * + * @author hneemann + */ +public class ATF1502CuplExporter extends Gal16v8CuplExporter { + + /** + * Creates a new project name + */ + public ATF1502CuplExporter() { + this(System.getProperty("user.name"), new Date()); + } + + /** + * Creates a new project name + * + * @param username user name + * @param date date + */ + public ATF1502CuplExporter(String username, Date date) { + super(username, date, "f1502plcc44", new PinMap() + .setAvailInputs(4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 16) + .setAvailOutputs(17, 18, 19, 20, 21, 24, 25, 26, 27, 28)); + setClockPin(43); + } + + @Override + protected void headerWritten(Writer out) throws IOException { + out.write("\r\nar = 'b'0 ;\r\n"); + } + + @Override + protected void sequentialWritten(Writer out, String name) throws IOException { + out.write(name + ".ck = CLK ;\r\n"); + out.write(name + ".ar = ar ;\r\n"); + } +} diff --git a/src/main/java/de/neemann/digital/builder/ATF1502/package-info.java b/src/main/java/de/neemann/digital/builder/ATF1502/package-info.java new file mode 100644 index 000000000..bd4a45465 --- /dev/null +++ b/src/main/java/de/neemann/digital/builder/ATF1502/package-info.java @@ -0,0 +1,6 @@ +/** + * Classes to handle a ATF1502. + * + * @author hneemann + */ +package de.neemann.digital.builder.ATF1502; diff --git a/src/main/java/de/neemann/digital/builder/Gal16v8/Gal16v8CuplExporter.java b/src/main/java/de/neemann/digital/builder/Gal16v8/Gal16v8CuplExporter.java index f75801c18..31d0fb526 100644 --- a/src/main/java/de/neemann/digital/builder/Gal16v8/Gal16v8CuplExporter.java +++ b/src/main/java/de/neemann/digital/builder/Gal16v8/Gal16v8CuplExporter.java @@ -36,6 +36,7 @@ public class Gal16v8CuplExporter implements ExpressionExporter comboBox = new JComboBox(TruthTableTableModel.STATENAMES); + JComboBox comboBox = new JComboBox<>(TruthTableTableModel.STATENAMES); table.setDefaultEditor(Integer.class, new DefaultCellEditor(comboBox)); table.setDefaultRenderer(Integer.class, new CenterDefaultTableCellRenderer()); table.setRowHeight(25); @@ -392,6 +393,17 @@ public class TableDialog extends JDialog { }.setToolTip(Lang.get("menu_table_create_jedec_tt")).createJMenuItem()); hardware.add(gal22v10); + + JMenu atf1502 = new JMenu("ATF1502"); + atf1502.add(new ToolTipAction(Lang.get("menu_table_createCUPL")) { + @Override + public void actionPerformed(ActionEvent actionEvent) { + createCUPL(new ATF1502CuplExporter()); + } + }.setToolTip(Lang.get("menu_table_createCUPL_tt")).createJMenuItem()); + hardware.add(atf1502); + + createMenu.add(hardware); return createMenu; @@ -435,28 +447,27 @@ public class TableDialog extends JDialog { } private void createCUPL(Gal16v8CuplExporter cupl) { - JFileChooser fileChooser = new JFileChooser(); - if (filename != null && filename.getName().endsWith(".dig")) { + try { + if (filename == null) + throw new IOException(Lang.get("err_noFileNameAvailable")); + String name = filename.getName(); - File cuplPath = new File(filename.getParentFile(), "cupl"); - File file = new File(cuplPath, name.substring(0, name.length() - 3) + "PLD"); - if (!cuplPath.exists()) - cuplPath.mkdirs(); - fileChooser.setSelectedFile(file); - } - fileChooser.setFileFilter(new FileNameExtensionFilter("PLD", "PLD")); - if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { - try { - File f = Main.checkSuffix(fileChooser.getSelectedFile(), "PLD"); - cupl.setProjectName(f.getName()); - cupl.getPinMapping().addAll(pinMap); - new BuilderExpressionCreator(cupl.getBuilder(), ExpressionModifier.IDENTITY).create(); - try (FileOutputStream out = new FileOutputStream(f)) { - cupl.writeTo(out); - } - } catch (ExpressionException | FormatterException | RuntimeException | IOException | FuseMapFillerException | PinMapException e) { - new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e).show(); + if (name.endsWith(".dig")) name = name.substring(0, name.length() - 4); + File cuplPath = new File(filename.getParentFile(), "CUPL_" + name); + + if (!cuplPath.mkdirs()) + if (!cuplPath.exists()) + throw new IOException(Lang.get("err_couldNotCreateFolder_N0", cuplPath.getPath())); + + File f = new File(cuplPath, "CUPL.PLD"); + cupl.setProjectName(f.getName()); + cupl.getPinMapping().addAll(pinMap); + new BuilderExpressionCreator(cupl.getBuilder(), ExpressionModifier.IDENTITY).create(); + try (FileOutputStream out = new FileOutputStream(f)) { + cupl.writeTo(out); } + } catch (ExpressionException | FormatterException | RuntimeException | IOException | FuseMapFillerException | PinMapException e) { + new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e).show(); } } @@ -675,5 +686,4 @@ public class TableDialog extends JDialog { return this; } } - } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index f91e6eef6..7e56e6cb8 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -258,6 +258,9 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen. Browser konnte nicht geöffnet werden. Der Splitter unterstützt keine HighZ Eingänge! Verwenden Sie einen PullUp- oder PullDown-Widerstand Ein Splitter der hochohmige Eingänge erlaubt, kann nur einen Eingang haben! + Die Datei wurde noch nicht gespeichert! + Konnte den Order '{0}' nicht erzeugen! + Adress-Bits Anzahl der Adress-Bits die verwendet werden. Daten-Bits diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 991eb35ee..2e64695a8 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -251,6 +251,8 @@ To analyse you can run the circuit in single gate step mode. Could not open the browser. The splitter does not support high z inputs! Use a pull up or pull down resisitor. A splitter which allows high z inputs can only have one input! + File not saved already! There is no filename avaiable! + Could not create folder '{0}'! Address Bits Number of address bits used. diff --git a/src/test/java/de/neemann/digital/builder/ATF1502/ATF1502CuplExporterTest.java b/src/test/java/de/neemann/digital/builder/ATF1502/ATF1502CuplExporterTest.java new file mode 100644 index 000000000..cf078dd99 --- /dev/null +++ b/src/test/java/de/neemann/digital/builder/ATF1502/ATF1502CuplExporterTest.java @@ -0,0 +1,69 @@ +package de.neemann.digital.builder.ATF1502; + +import de.neemann.digital.analyse.expression.Expression; +import de.neemann.digital.analyse.expression.Variable; +import junit.framework.TestCase; + +import java.io.ByteArrayOutputStream; +import java.util.Date; + +import static de.neemann.digital.analyse.expression.Not.not; +import static de.neemann.digital.analyse.expression.Operation.and; +import static de.neemann.digital.analyse.expression.Operation.or; + +/** + * Created by helmut.neemann on 20.12.2016. + */ +public class ATF1502CuplExporterTest extends TestCase { + + public void testCUPLExporter() throws Exception { + Variable y0 = new Variable("Y_0"); + Variable y1 = new Variable("Y_1"); + + // counter + Expression y0s = not(y0); + Expression y1s = or(and(not(y0), y1), and(y0, not(y1))); + + ATF1502CuplExporter ce = new ATF1502CuplExporter("user", new Date(0)); + ce.setProjectName("test"); + ce.getBuilder() + .addSequential("Y_0", y0s) + .addSequential("Y_1", y1s) + .addCombinatorial("A", and(y0, y1)); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ce.writeTo(baos); + + assertEquals("Name test ;\r\n" + + "PartNo 00 ;\r\n" + + "Date 01.01.1970 ;\r\n" + + "Revision 01 ;\r\n" + + "Designer user ;\r\n" + + "Company unknown ;\r\n" + + "Assembly None ;\r\n" + + "Location unknown ;\r\n" + + "Device f1502plcc44 ;\r\n" + + "\r\n" + + "ar = 'b'0 ;\r\n" + + "\r\n" + + "/* inputs */\r\n" + + "PIN 43 = CLK;\r\n" + + "\r\n" + + "/* outputs */\r\n" + + "PIN 17 = Y_0;\r\n" + + "PIN 18 = Y_1;\r\n" + + "PIN 19 = A;\r\n" + + "\r\n" + + "/* sequential logic */\r\n" + + "Y_0.D = !Y_0;\r\n" + + "Y_0.ck = CLK ;\r\n" + + "Y_0.ar = ar ;\r\n" + + "Y_1.D = (!Y_0 & Y_1) # (Y_0 & !Y_1);\r\n" + + "Y_1.ck = CLK ;\r\n" + + "Y_1.ar = ar ;\r\n" + + "\r\n" + + "/* combinatorial logic */\r\n" + + "A = Y_0 & Y_1;\r\n", baos.toString()); + } + +} \ No newline at end of file