fixed a bug in creating CUPL files for GAL16v8

This commit is contained in:
helmut.neemann 2017-03-14 09:31:08 +01:00
parent ed9937c07a
commit fb5537dba8
6 changed files with 68 additions and 40 deletions

View File

@ -1,6 +1,6 @@
package de.neemann.digital.builder.ATF1502;
import de.neemann.digital.builder.Gal16v8.Gal16v8CuplExporter;
import de.neemann.digital.builder.Gal16v8.CuplExporter;
import de.neemann.digital.builder.PinMap;
import java.io.IOException;
@ -12,7 +12,7 @@ import java.util.Date;
*
* @author hneemann
*/
public class ATF1502CuplExporter extends Gal16v8CuplExporter {
public class ATF1502CuplExporter extends CuplExporter {
/**
* Creates a new project name
@ -33,6 +33,7 @@ public class ATF1502CuplExporter extends Gal16v8CuplExporter {
18, 19, 20, 21, 24, 25, 26, 27, 28,
29, 31, 33, 34, 36, 37, 38, 39, 40));
setClockPin(43);
setCreateNodes(true);
}
@Override

View File

@ -1,11 +1,12 @@
package de.neemann.digital.builder;
import de.neemann.digital.analyse.expression.Expression;
import de.neemann.digital.builder.Gal16v8.CuplExporter;
/**
* Interface used to create a circuit
* There are two implementations: the {@link de.neemann.digital.builder.circuit.CircuitBuilder} creates a circuit and the
* {@link de.neemann.digital.builder.Gal16v8.Gal16v8CuplExporter} creates a CUPL file
* {@link CuplExporter} creates a CUPL file
* which contains the circuit.
*
* @param <T> concrete Builder Type

View File

@ -21,11 +21,12 @@ import java.util.HashSet;
import java.util.Map;
/**
* Creates a CUPL file
* Creates a CUPL file.
* The default setting is usable for GAL16V8 chips.
*
* @author hneemann
*/
public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExporter> {
public class CuplExporter implements ExpressionExporter<CuplExporter> {
private final DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
private final String username;
@ -36,12 +37,13 @@ public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExport
private final String devName;
private String projectName;
private boolean createNodes = false;
private int clockPin = 1;
/**
* Creates a new project name
*/
public Gal16v8CuplExporter() {
public CuplExporter() {
this(System.getProperty("user.name"), new Date());
}
@ -51,7 +53,7 @@ public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExport
* @param username user name
* @param date date
*/
public Gal16v8CuplExporter(String username, Date date) {
public CuplExporter(String username, Date date) {
this(username, date, "g16v8a", new PinMap()
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9)
.setAvailOutputs(12, 13, 14, 15, 16, 17, 18, 19));
@ -69,12 +71,12 @@ public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExport
/**
* Creates a new instance
*
* @param username
* @param date
* @param devName
* @param pinMap
* @param username user name
* @param date creation date
* @param devName device name
* @param pinMap the pin map to use
*/
protected Gal16v8CuplExporter(String username, Date date, String devName, PinMap pinMap) {
protected CuplExporter(String username, Date date, String devName, PinMap pinMap) {
this.username = username;
this.date = date;
this.devName = devName;
@ -88,11 +90,21 @@ public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExport
* @param projectName the project name
* @return this for call chaining
*/
public Gal16v8CuplExporter setProjectName(String projectName) {
public CuplExporter setProjectName(String projectName) {
this.projectName = projectName;
return this;
}
/**
* Set the create nodes flag.
* If "create nodes" is enabled the CUPL file contains buried as NODE not as PIN assignment.
*
* @param createNodes true if the exporter should create nodes.
*/
public void setCreateNodes(boolean createNodes) {
this.createNodes = createNodes;
}
@Override
public BuilderCollector getBuilder() {
return builder;
@ -136,34 +148,35 @@ public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExport
out.append("\r\n/* outputs */\r\n");
for (String var : builder.getOutputs()) {
if (createNodes) {
int p = pinMap.isAssigned(var);
if (p >= 0)
out.append("PIN ").append(Integer.toString(p)).append(" = ").append(var).append(";\r\n");
else
out.append("NODE ").append(var).append(";\r\n");
} else {
out.append("PIN ").append(Integer.toString(pinMap.getOutputFor(var))).append(" = ").append(var).append(";\r\n");
}
}
try {
if (!builder.getRegistered().isEmpty()) {
out.append("\r\n/* sequential logic */\r\n");
for (Map.Entry<String, Expression> c : builder.getRegistered().entrySet()) {
out
.append(c.getKey())
.append(".D = ")
.append(FormatToExpression.FORMATTER_CUPL.format(c.getValue()))
.append(";\r\n");
out.append(c.getKey()).append(".D = ");
breakLines(out, FormatToExpression.FORMATTER_CUPL.format(c.getValue()));
out.append(";\r\n");
sequentialWritten(out, c.getKey());
}
}
if (!builder.getCombinatorial().isEmpty()) {
out.append("\r\n/* combinatorial logic */\r\n");
for (Map.Entry<String, Expression> c : builder.getCombinatorial().entrySet())
out
.append(c.getKey()).append(" = ")
.append(FormatToExpression.FORMATTER_CUPL.format(c.getValue()))
.append(";\r\n");
for (Map.Entry<String, Expression> c : builder.getCombinatorial().entrySet()) {
out.append(c.getKey()).append(" = ");
breakLines(out, FormatToExpression.FORMATTER_CUPL.format(c.getValue()));
out.append(";\r\n");
}
}
} catch (FormatterException e) {
throw new IOException(e);
@ -172,6 +185,19 @@ public class Gal16v8CuplExporter implements ExpressionExporter<Gal16v8CuplExport
out.flush();
}
private void breakLines(Writer out, String expression) throws IOException {
int pos = 0;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (pos > 80 && c == '#') {
out.append("\r\n ");
pos = 0;
}
out.append(c);
pos++;
}
}
@Override
public void writeTo(OutputStream out) throws FuseMapFillerException, IOException, PinMapException {
writeTo(new OutputStreamWriter(out, "ISO-8859-1"));

View File

@ -1,6 +1,6 @@
package de.neemann.digital.builder.Gal22v10;
import de.neemann.digital.builder.Gal16v8.Gal16v8CuplExporter;
import de.neemann.digital.builder.Gal16v8.CuplExporter;
import de.neemann.digital.builder.PinMap;
import java.io.IOException;
@ -12,7 +12,7 @@ import java.util.Date;
*
* @author hneemann
*/
public class Gal22v10CuplExporter extends Gal16v8CuplExporter {
public class Gal22v10CuplExporter extends CuplExporter {
/**
* Creates a new project name

View File

@ -15,7 +15,7 @@ import de.neemann.digital.analyse.format.TruthTableFormatterLaTeX;
import de.neemann.digital.analyse.quinemc.BoolTableByteArray;
import de.neemann.digital.builder.ATF1502.*;
import de.neemann.digital.builder.*;
import de.neemann.digital.builder.Gal16v8.Gal16v8CuplExporter;
import de.neemann.digital.builder.Gal16v8.CuplExporter;
import de.neemann.digital.builder.Gal16v8.Gal16v8JEDECExporter;
import de.neemann.digital.builder.Gal22v10.Gal22v10CuplExporter;
import de.neemann.digital.builder.Gal22v10.Gal22v10JEDECExporter;
@ -396,7 +396,7 @@ public class TableDialog extends JDialog {
gal16v8.add(new ToolTipAction(Lang.get("menu_table_createCUPL")) {
@Override
public void actionPerformed(ActionEvent actionEvent) {
createCUPL(new Gal16v8CuplExporter());
createCUPL(new CuplExporter());
}
}.setToolTip(Lang.get("menu_table_createCUPL_tt")).createJMenuItem());
gal16v8.add(new ToolTipAction(Lang.get("menu_table_create_jedec")) {
@ -505,7 +505,7 @@ public class TableDialog extends JDialog {
}
}
private void createCUPL(Gal16v8CuplExporter cupl) {
private void createCUPL(CuplExporter cupl) {
try {
File cuplPath;
if (filename == null) {
@ -534,7 +534,7 @@ public class TableDialog extends JDialog {
throw new IOException(Lang.get("err_couldNotCreateFolder_N0", cuplPath.getPath()));
File f = new File(cuplPath, "CUPL.PLD");
cupl.setProjectName(f.getName());
cupl.setProjectName(filename.getName());
cupl.getPinMapping().addAll(pinMap);
new BuilderExpressionCreator(cupl.getBuilder(), ExpressionModifier.IDENTITY).create(lastGeneratedExpressions);
try (FileOutputStream out = new FileOutputStream(f)) {

View File

@ -24,7 +24,7 @@ public class Gal16V8CuplExporterTest extends TestCase {
Expression y0s = not(y0);
Expression y1s = or(and(not(y0), y1), and(y0, not(y1)));
Gal16v8CuplExporter ce = new Gal16v8CuplExporter("user", new Date(0))
CuplExporter ce = new CuplExporter("user", new Date(0))
.setProjectName("test");
ce.getPinMapping().parseString("Y_0=12;Y_1=13;A=14");
ce.getBuilder()
@ -67,12 +67,12 @@ public class Gal16V8CuplExporterTest extends TestCase {
Expression y0s = not(y0);
try {
new Gal16v8CuplExporter("user", new Date(0))
new CuplExporter("user", new Date(0))
.setProjectName("test")
.getBuilder()
.addSequential("Y_0", y0s);
assertTrue(false);
fail();
} catch (RuntimeException e) {
assertTrue(true);
}
@ -84,12 +84,12 @@ public class Gal16V8CuplExporterTest extends TestCase {
Expression y0s = not(y0);
try {
new Gal16v8CuplExporter("user", new Date(0))
new CuplExporter("user", new Date(0))
.setProjectName("test")
.getBuilder()
.addCombinatorial("D", y0s);
assertTrue(false);
fail();
} catch (RuntimeException e) {
assertTrue(true);
}