mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-13 14:56:29 -04:00
allows GAL signal pass through, see #390
This commit is contained in:
parent
af432a2268
commit
f58ee33c1c
@ -80,4 +80,12 @@ public class BuilderCollector implements BuilderInterface<BuilderCollector> {
|
|||||||
return registered;
|
return registered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an output.
|
||||||
|
*
|
||||||
|
* @param name the output to remove
|
||||||
|
*/
|
||||||
|
public void removeOutput(String name) {
|
||||||
|
outputs.remove(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* 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.builder.Gal16v8;
|
||||||
|
|
||||||
|
import de.neemann.digital.analyse.expression.Expression;
|
||||||
|
import de.neemann.digital.builder.BuilderCollector;
|
||||||
|
import de.neemann.digital.builder.BuilderException;
|
||||||
|
import de.neemann.digital.builder.PinMap;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to avoid a double cell allocation if the output of a ff is used as a autput of the state machine.
|
||||||
|
* This is the case if a Moore machine is build where the state equals the output.
|
||||||
|
* Sometimes this kind of state machines is called a Medwedew machine.
|
||||||
|
*/
|
||||||
|
public class BuilderCollectorGAL extends BuilderCollector {
|
||||||
|
private final PinMap pinMap;
|
||||||
|
private HashSet<String> sequentialVars;
|
||||||
|
private boolean doubleCellUsageFixed = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance
|
||||||
|
*
|
||||||
|
* @param pinMap the used pinMap. Is required to handle aliases correctly
|
||||||
|
*/
|
||||||
|
public BuilderCollectorGAL(PinMap pinMap) {
|
||||||
|
this.pinMap = pinMap;
|
||||||
|
sequentialVars = new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BuilderCollector addCombinatorial(String name, Expression expression) throws BuilderException {
|
||||||
|
checkOpen();
|
||||||
|
return super.addCombinatorial(name, expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BuilderCollector addSequential(String name, Expression expression) throws BuilderException {
|
||||||
|
checkOpen();
|
||||||
|
sequentialVars.add(name);
|
||||||
|
return super.addSequential(name, expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkOpen() {
|
||||||
|
if (doubleCellUsageFixed)
|
||||||
|
throw new RuntimeException("wrong BuilderCollectorGAL usage!");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fixDoubleCellUsage() {
|
||||||
|
if (!doubleCellUsageFixed) {
|
||||||
|
|
||||||
|
super.getCombinatorial().entrySet().removeIf(c -> {
|
||||||
|
if (pinMap.isSimpleAlias(c.getKey(), c.getValue(), sequentialVars)) {
|
||||||
|
removeOutput(c.getKey());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
doubleCellUsageFixed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<String> getOutputs() {
|
||||||
|
fixDoubleCellUsage();
|
||||||
|
return super.getOutputs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<String> getInputs() {
|
||||||
|
fixDoubleCellUsage();
|
||||||
|
return super.getInputs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Expression> getCombinatorial() {
|
||||||
|
fixDoubleCellUsage();
|
||||||
|
return super.getCombinatorial();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Expression> getRegistered() {
|
||||||
|
fixDoubleCellUsage();
|
||||||
|
return super.getRegistered();
|
||||||
|
}
|
||||||
|
}
|
@ -84,7 +84,7 @@ public class CuplExporter implements ExpressionExporter<CuplExporter> {
|
|||||||
this.date = date;
|
this.date = date;
|
||||||
this.devName = devName;
|
this.devName = devName;
|
||||||
this.pinMap = pinMap;
|
this.pinMap = pinMap;
|
||||||
builder = new CuplBuilder();
|
builder = new CuplBuilder(pinMap);
|
||||||
cleanNameBuilder = new CleanNameBuilder(builder);
|
cleanNameBuilder = new CleanNameBuilder(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,14 +228,15 @@ public class CuplExporter implements ExpressionExporter<CuplExporter> {
|
|||||||
protected void sequentialWritten(Writer out, String name) throws IOException {
|
protected void sequentialWritten(Writer out, String name) throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class CuplBuilder extends BuilderCollector {
|
private static final class CuplBuilder extends BuilderCollectorGAL {
|
||||||
private final NotAllowedVariablesVisitor notAllowedVariablesVisitor = new NotAllowedVariablesVisitor();
|
private final NotAllowedVariablesVisitor notAllowedVariablesVisitor = new NotAllowedVariablesVisitor();
|
||||||
|
|
||||||
|
private CuplBuilder(PinMap pinMap) {
|
||||||
|
super(pinMap);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BuilderCollector addCombinatorial(String name, Expression expression) throws BuilderException {
|
public BuilderCollector addCombinatorial(String name, Expression expression) throws BuilderException {
|
||||||
if (pinMap.isSimpleAlias(name, expression))
|
|
||||||
return this; // ignore simple variables!
|
|
||||||
|
|
||||||
expression.traverse(notAllowedVariablesVisitor);
|
expression.traverse(notAllowedVariablesVisitor);
|
||||||
notAllowedVariablesVisitor.check(name);
|
notAllowedVariablesVisitor.check(name);
|
||||||
return super.addCombinatorial(name, expression);
|
return super.addCombinatorial(name, expression);
|
||||||
|
@ -5,9 +5,11 @@
|
|||||||
*/
|
*/
|
||||||
package de.neemann.digital.builder.Gal16v8;
|
package de.neemann.digital.builder.Gal16v8;
|
||||||
|
|
||||||
import de.neemann.digital.analyse.expression.Expression;
|
|
||||||
import de.neemann.digital.analyse.expression.Variable;
|
import de.neemann.digital.analyse.expression.Variable;
|
||||||
import de.neemann.digital.builder.*;
|
import de.neemann.digital.builder.BuilderCollector;
|
||||||
|
import de.neemann.digital.builder.ExpressionExporter;
|
||||||
|
import de.neemann.digital.builder.PinMap;
|
||||||
|
import de.neemann.digital.builder.PinMapException;
|
||||||
import de.neemann.digital.builder.jedec.FuseMap;
|
import de.neemann.digital.builder.jedec.FuseMap;
|
||||||
import de.neemann.digital.builder.jedec.FuseMapFiller;
|
import de.neemann.digital.builder.jedec.FuseMapFiller;
|
||||||
import de.neemann.digital.builder.jedec.FuseMapFillerException;
|
import de.neemann.digital.builder.jedec.FuseMapFillerException;
|
||||||
@ -43,18 +45,10 @@ public class Gal16v8JEDECExporter implements ExpressionExporter<Gal16v8JEDECExpo
|
|||||||
map.setFuse(i, true);
|
map.setFuse(i, true);
|
||||||
filler = new FuseMapFiller(map, 16);
|
filler = new FuseMapFiller(map, 16);
|
||||||
|
|
||||||
builder = new BuilderCollector() {
|
|
||||||
@Override
|
|
||||||
public BuilderCollector addCombinatorial(String name, Expression expression) throws BuilderException {
|
|
||||||
if (pinMap.isSimpleAlias(name, expression))
|
|
||||||
return this;
|
|
||||||
else
|
|
||||||
return super.addCombinatorial(name, expression);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
pinMap = new PinMap()
|
pinMap = new PinMap()
|
||||||
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9)
|
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9)
|
||||||
.setAvailOutputs(12, 13, 14, 15, 16, 17, 18, 19);
|
.setAvailOutputs(12, 13, 14, 15, 16, 17, 18, 19);
|
||||||
|
builder = new BuilderCollectorGAL(pinMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init(boolean registered) {
|
private void init(boolean registered) {
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
package de.neemann.digital.builder.Gal22v10;
|
package de.neemann.digital.builder.Gal22v10;
|
||||||
|
|
||||||
import de.neemann.digital.analyse.expression.Expression;
|
|
||||||
import de.neemann.digital.analyse.expression.Variable;
|
import de.neemann.digital.analyse.expression.Variable;
|
||||||
import de.neemann.digital.builder.*;
|
import de.neemann.digital.builder.*;
|
||||||
|
import de.neemann.digital.builder.Gal16v8.BuilderCollectorGAL;
|
||||||
import de.neemann.digital.builder.jedec.FuseMap;
|
import de.neemann.digital.builder.jedec.FuseMap;
|
||||||
import de.neemann.digital.builder.jedec.FuseMapFiller;
|
import de.neemann.digital.builder.jedec.FuseMapFiller;
|
||||||
import de.neemann.digital.builder.jedec.FuseMapFillerException;
|
import de.neemann.digital.builder.jedec.FuseMapFillerException;
|
||||||
@ -36,18 +36,10 @@ public class Gal22v10JEDECExporter implements ExpressionExporter<Gal22v10JEDECEx
|
|||||||
map = new FuseMap(5892);
|
map = new FuseMap(5892);
|
||||||
filler = new FuseMapFiller(map, 22);
|
filler = new FuseMapFiller(map, 22);
|
||||||
|
|
||||||
builder = new BuilderCollector() {
|
|
||||||
@Override
|
|
||||||
public BuilderCollector addCombinatorial(String name, Expression expression) throws BuilderException {
|
|
||||||
if (pinMap.isSimpleAlias(name, expression))
|
|
||||||
return this;
|
|
||||||
else
|
|
||||||
return super.addCombinatorial(name, expression);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
pinMap = new PinMap()
|
pinMap = new PinMap()
|
||||||
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13)
|
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13)
|
||||||
.setAvailOutputs(14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
|
.setAvailOutputs(14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
|
||||||
|
builder = new BuilderCollectorGAL(pinMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -122,14 +122,19 @@ public class PinMap {
|
|||||||
* Checks if the assignment is a simple A=B. If true a alias for A is generated in the pin map.
|
* Checks if the assignment is a simple A=B. If true a alias for A is generated in the pin map.
|
||||||
* This is needed to void to assign two pins to the same logical signal generated by a flip flop.
|
* This is needed to void to assign two pins to the same logical signal generated by a flip flop.
|
||||||
*
|
*
|
||||||
* @param name the name of the target
|
* @param name the name of the target
|
||||||
* @param expression the expression to check
|
* @param expression the expression to check
|
||||||
|
* @param sequentialVars if a set is given, only the assignments generated from one of the
|
||||||
|
* contained variables are removed. Maybe null.
|
||||||
* @return true if expression is a simple variable
|
* @return true if expression is a simple variable
|
||||||
*/
|
*/
|
||||||
public boolean isSimpleAlias(String name, Expression expression) {
|
public boolean isSimpleAlias(String name, Expression expression, HashSet<String> sequentialVars) {
|
||||||
if (expression instanceof Variable) {
|
if (expression instanceof Variable) {
|
||||||
String al = ((Variable) expression).getIdentifier();
|
String al = ((Variable) expression).getIdentifier();
|
||||||
|
|
||||||
|
if (sequentialVars != null && !sequentialVars.contains(al))
|
||||||
|
return false;
|
||||||
|
|
||||||
HashSet<String> found = null;
|
HashSet<String> found = null;
|
||||||
for (HashSet<String> s : alias)
|
for (HashSet<String> s : alias)
|
||||||
if (s.contains(name) || s.contains(al)) {
|
if (s.contains(name) || s.contains(al)) {
|
||||||
|
@ -57,7 +57,7 @@ public class ExpressionListenerJK implements ExpressionListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the name belogs to a sequential state var, the state vars name is returned.
|
* If the name belongs to a sequential state var, the state vars name is returned.
|
||||||
* Otherwise a null is returned
|
* Otherwise a null is returned
|
||||||
*
|
*
|
||||||
* @param name the name of the variable
|
* @param name the name of the variable
|
||||||
|
@ -5,12 +5,30 @@
|
|||||||
*/
|
*/
|
||||||
package de.neemann.digital.builder.Gal16v8;
|
package de.neemann.digital.builder.Gal16v8;
|
||||||
|
|
||||||
|
import de.neemann.digital.analyse.*;
|
||||||
import de.neemann.digital.analyse.expression.Constant;
|
import de.neemann.digital.analyse.expression.Constant;
|
||||||
import de.neemann.digital.analyse.expression.Expression;
|
import de.neemann.digital.analyse.expression.Expression;
|
||||||
|
import de.neemann.digital.analyse.expression.ExpressionException;
|
||||||
import de.neemann.digital.analyse.expression.Variable;
|
import de.neemann.digital.analyse.expression.Variable;
|
||||||
|
import de.neemann.digital.analyse.expression.format.FormatterException;
|
||||||
|
import de.neemann.digital.analyse.expression.modify.ExpressionModifier;
|
||||||
|
import de.neemann.digital.builder.PinMapException;
|
||||||
|
import de.neemann.digital.core.BacktrackException;
|
||||||
|
import de.neemann.digital.core.Model;
|
||||||
|
import de.neemann.digital.core.NodeException;
|
||||||
|
import de.neemann.digital.draw.elements.Circuit;
|
||||||
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
|
import de.neemann.digital.draw.library.ElementLibrary;
|
||||||
|
import de.neemann.digital.draw.library.ElementNotFoundException;
|
||||||
|
import de.neemann.digital.draw.model.ModelCreator;
|
||||||
|
import de.neemann.digital.draw.shapes.ShapeFactory;
|
||||||
|
import de.neemann.digital.gui.components.table.BuilderExpressionCreator;
|
||||||
|
import de.neemann.digital.gui.components.table.ExpressionCreator;
|
||||||
|
import de.neemann.digital.gui.components.table.ExpressionListenerStore;
|
||||||
|
import de.neemann.digital.integration.Resources;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import static de.neemann.digital.analyse.expression.Not.not;
|
import static de.neemann.digital.analyse.expression.Not.not;
|
||||||
@ -18,6 +36,7 @@ import static de.neemann.digital.analyse.expression.Operation.and;
|
|||||||
import static de.neemann.digital.analyse.expression.Operation.or;
|
import static de.neemann.digital.analyse.expression.Operation.or;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* CUPL builder tests
|
||||||
*/
|
*/
|
||||||
public class Gal16V8CuplExporterTest extends TestCase {
|
public class Gal16V8CuplExporterTest extends TestCase {
|
||||||
|
|
||||||
@ -133,4 +152,84 @@ public class Gal16V8CuplExporterTest extends TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCuplWorkFlow() throws IOException, ElementNotFoundException, PinException, NodeException, AnalyseException, BacktrackException, PinMapException, ExpressionException, FormatterException {
|
||||||
|
String cupl = createCupl("dig/GAL/Medwedew.dig");
|
||||||
|
|
||||||
|
assertEquals("Name test ;\r\n" +
|
||||||
|
"PartNo 00 ;\r\n" +
|
||||||
|
"Date unknownDate ;\r\n" +
|
||||||
|
"Revision 01 ;\r\n" +
|
||||||
|
"Designer nn ;\r\n" +
|
||||||
|
"Company unknown ;\r\n" +
|
||||||
|
"Assembly None ;\r\n" +
|
||||||
|
"Location unknown ;\r\n" +
|
||||||
|
"Device g16v8a ;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* inputs */\r\n" +
|
||||||
|
"PIN 1 = CLK;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* outputs */\r\n" +
|
||||||
|
"PIN 15 = Q_3n;\r\n" +
|
||||||
|
"PIN 16 = Q_2n;\r\n" +
|
||||||
|
"PIN 17 = Q_1n;\r\n" +
|
||||||
|
"PIN 18 = Q_0n;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* sequential logic */\r\n" +
|
||||||
|
"Q_0n.D = !Q_0n;\r\n" +
|
||||||
|
"Q_1n.D = (Q_0n & !Q_1n) # (!Q_0n & Q_1n);\r\n" +
|
||||||
|
"Q_2n.D = (Q_0n & Q_1n & !Q_2n) # (!Q_0n & Q_2n) # (!Q_1n & Q_2n);\r\n" +
|
||||||
|
"Q_3n.D = (Q_0n & Q_1n & Q_2n & !Q_3n) # (!Q_0n & Q_3n) # (!Q_1n & Q_3n) # (!Q_2n & Q_3n);\r\n", cupl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCuplWorkFlowPassThrough() throws IOException, ElementNotFoundException, PinException, NodeException, AnalyseException, BacktrackException, PinMapException, ExpressionException, FormatterException {
|
||||||
|
String cupl = createCupl("dig/GAL/PassThrough.dig");
|
||||||
|
|
||||||
|
assertEquals("Name test ;\r\n" +
|
||||||
|
"PartNo 00 ;\r\n" +
|
||||||
|
"Date unknownDate ;\r\n" +
|
||||||
|
"Revision 01 ;\r\n" +
|
||||||
|
"Designer nn ;\r\n" +
|
||||||
|
"Company unknown ;\r\n" +
|
||||||
|
"Assembly None ;\r\n" +
|
||||||
|
"Location unknown ;\r\n" +
|
||||||
|
"Device g16v8a ;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* inputs */\r\n" +
|
||||||
|
"PIN 1 = CLK;\r\n" +
|
||||||
|
"PIN 3 = A;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* outputs */\r\n" +
|
||||||
|
"PIN 16 = Yn;\r\n" +
|
||||||
|
"PIN 15 = X;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* sequential logic */\r\n" +
|
||||||
|
"Yn.D = A;\r\n" +
|
||||||
|
"\r\n" +
|
||||||
|
"/* combinatorial logic */\r\n" +
|
||||||
|
"X = A;\r\n", cupl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String createCupl(String filename) throws IOException, PinException, NodeException, ElementNotFoundException, BacktrackException, AnalyseException, ExpressionException, FormatterException, PinMapException {
|
||||||
|
File f = new File(Resources.getRoot(), filename);
|
||||||
|
ElementLibrary library = new ElementLibrary();
|
||||||
|
Circuit c = Circuit.loadCircuit(f, new ShapeFactory(library));
|
||||||
|
Model model = new ModelCreator(c, new SubstituteLibrary(library)).createModel(false);
|
||||||
|
TruthTable t = new ModelAnalyser(model).analyse();
|
||||||
|
|
||||||
|
ExpressionListenerStore expressions = new ExpressionListenerStore(null);
|
||||||
|
new ExpressionCreator(t).create(expressions);
|
||||||
|
|
||||||
|
CuplExporter cuplExporter = new CuplExporter("nn", null);
|
||||||
|
cuplExporter.setProjectName("test");
|
||||||
|
final ModelAnalyserInfo modelAnalyzerInfo = t.getModelAnalyzerInfo();
|
||||||
|
if (modelAnalyzerInfo != null)
|
||||||
|
cuplExporter.getPinMapping().addAll(modelAnalyzerInfo.getPins());
|
||||||
|
new BuilderExpressionCreator(cuplExporter.getBuilder(), ExpressionModifier.IDENTITY).create(expressions);
|
||||||
|
|
||||||
|
StringWriter str = new StringWriter();
|
||||||
|
cuplExporter.writeTo(str);
|
||||||
|
return str.toString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,12 @@ package de.neemann.digital.builder;
|
|||||||
import de.neemann.digital.analyse.expression.Variable;
|
import de.neemann.digital.analyse.expression.Variable;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public class PinMapTest extends TestCase {
|
public class PinMapTest extends TestCase {
|
||||||
|
|
||||||
@ -131,7 +136,7 @@ public class PinMapTest extends TestCase {
|
|||||||
|
|
||||||
public void testAlias() throws PinMapException {
|
public void testAlias() throws PinMapException {
|
||||||
pinMap.assignPin("A", 4);
|
pinMap.assignPin("A", 4);
|
||||||
assertTrue(pinMap.isSimpleAlias("B", new Variable("A")));
|
assertTrue(pinMap.isSimpleAlias("B", new Variable("A"), null));
|
||||||
|
|
||||||
assertEquals(4, pinMap.getOutputFor("A"));
|
assertEquals(4, pinMap.getOutputFor("A"));
|
||||||
assertEquals(4, pinMap.getOutputFor("B"));
|
assertEquals(4, pinMap.getOutputFor("B"));
|
||||||
@ -139,14 +144,14 @@ public class PinMapTest extends TestCase {
|
|||||||
|
|
||||||
public void testAliasSwap() throws PinMapException {
|
public void testAliasSwap() throws PinMapException {
|
||||||
pinMap.assignPin("A", 4);
|
pinMap.assignPin("A", 4);
|
||||||
assertTrue(pinMap.isSimpleAlias("A", new Variable("B")));
|
assertTrue(pinMap.isSimpleAlias("A", new Variable("B"), null));
|
||||||
|
|
||||||
assertEquals(4, pinMap.getOutputFor("A"));
|
assertEquals(4, pinMap.getOutputFor("A"));
|
||||||
assertEquals(4, pinMap.getOutputFor("B"));
|
assertEquals(4, pinMap.getOutputFor("B"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAliasReverseOrder() throws PinMapException {
|
public void testAliasReverseOrder() throws PinMapException {
|
||||||
assertTrue(pinMap.isSimpleAlias("B", new Variable("A")));
|
assertTrue(pinMap.isSimpleAlias("B", new Variable("A"), null));
|
||||||
pinMap.assignPin("A", 4);
|
pinMap.assignPin("A", 4);
|
||||||
|
|
||||||
assertEquals(4, pinMap.getOutputFor("A"));
|
assertEquals(4, pinMap.getOutputFor("A"));
|
||||||
@ -156,12 +161,27 @@ public class PinMapTest extends TestCase {
|
|||||||
|
|
||||||
public void testAliasInput() throws PinMapException {
|
public void testAliasInput() throws PinMapException {
|
||||||
pinMap.assignPin("A", 2);
|
pinMap.assignPin("A", 2);
|
||||||
assertTrue(pinMap.isSimpleAlias("B", new Variable("A")));
|
assertTrue(pinMap.isSimpleAlias("B", new Variable("A"), null));
|
||||||
|
|
||||||
assertEquals(2, pinMap.getInputFor("A"));
|
assertEquals(2, pinMap.getInputFor("A"));
|
||||||
assertEquals(2, pinMap.getInputFor("B"));
|
assertEquals(2, pinMap.getInputFor("B"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAliasSequential() throws PinMapException {
|
||||||
|
pinMap.assignPin("A", 4);
|
||||||
|
assertFalse(pinMap.isSimpleAlias("B", new Variable("A"), new HashSet<>()));
|
||||||
|
|
||||||
|
assertEquals(4, pinMap.getOutputFor("A"));
|
||||||
|
assertEquals(5, pinMap.getOutputFor("B"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAliasSequential2() throws PinMapException {
|
||||||
|
pinMap.assignPin("A", 4);
|
||||||
|
assertTrue(pinMap.isSimpleAlias("B", new Variable("A"), new HashSet<>(Collections.singletonList("A"))));
|
||||||
|
|
||||||
|
assertEquals(4, pinMap.getOutputFor("A"));
|
||||||
|
assertEquals(4, pinMap.getOutputFor("B"));
|
||||||
|
}
|
||||||
|
|
||||||
public void testToString() throws PinMapException {
|
public void testToString() throws PinMapException {
|
||||||
pinMap.assignPin("A", 1);
|
pinMap.assignPin("A", 1);
|
||||||
|
864
src/test/resources/dig/GAL/Medwedew.dig
Normal file
864
src/test/resources/dig/GAL/Medwedew.dig
Normal file
@ -0,0 +1,864 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<circuit>
|
||||||
|
<version>1</version>
|
||||||
|
<attributes/>
|
||||||
|
<visualElements>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_3^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="340" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_3^n</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="260" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Or</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="140" y="140"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="20" y="0"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="120"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="200"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="280"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_2^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="340" y="460"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_2^n</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="260" y="460"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Or</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>3</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="120" y="440"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>3</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="20" y="360"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="440"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="520"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_1^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="340" y="660"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_1^n</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="260" y="660"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Or</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="120" y="640"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="600"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="680"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_0^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="340" y="760"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_0^n</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="260" y="760"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="1"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_3^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-160" y="-100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Not</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="3"/>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-140" y="-60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="1"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_2^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-120" y="-100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Not</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="3"/>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-100" y="-60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="1"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_1^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-80" y="-100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Not</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="3"/>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-60" y="-60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="1"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_0^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-40" y="-100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Not</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="3"/>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="-20" y="-60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Clock</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>runRealTime</string>
|
||||||
|
<boolean>true</boolean>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="3"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>C</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Frequency</string>
|
||||||
|
<int>2</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="240" y="120"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="2"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_3^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="680" y="0"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_3</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>15</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="0"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="2"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_2^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="680" y="40"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_2</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>16</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="40"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="2"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_1^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="680" y="80"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_1</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>17</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="80"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="2"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_0^n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="680" y="120"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>18</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="120"/>
|
||||||
|
</visualElement>
|
||||||
|
</visualElements>
|
||||||
|
<wires>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="0"/>
|
||||||
|
<p2 x="20" y="0"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="0"/>
|
||||||
|
<p2 x="700" y="0"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="320"/>
|
||||||
|
<p2 x="20" y="320"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="640"/>
|
||||||
|
<p2 x="20" y="640"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="640"/>
|
||||||
|
<p2 x="120" y="640"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="200"/>
|
||||||
|
<p2 x="20" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="200"/>
|
||||||
|
<p2 x="140" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="200"/>
|
||||||
|
<p2 x="260" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="520"/>
|
||||||
|
<p2 x="20" y="520"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="140"/>
|
||||||
|
<p2 x="140" y="140"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="140"/>
|
||||||
|
<p2 x="100" y="140"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="320" y="460"/>
|
||||||
|
<p2 x="340" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="460"/>
|
||||||
|
<p2 x="120" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="180" y="460"/>
|
||||||
|
<p2 x="260" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="780"/>
|
||||||
|
<p2 x="260" y="780"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="-80"/>
|
||||||
|
<p2 x="-140" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="-80"/>
|
||||||
|
<p2 x="-100" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="-80"/>
|
||||||
|
<p2 x="-60" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="-80"/>
|
||||||
|
<p2 x="-20" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-140" y="80"/>
|
||||||
|
<p2 x="20" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="80"/>
|
||||||
|
<p2 x="700" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-100" y="400"/>
|
||||||
|
<p2 x="20" y="400"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="720"/>
|
||||||
|
<p2 x="20" y="720"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="20"/>
|
||||||
|
<p2 x="20" y="20"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="320" y="660"/>
|
||||||
|
<p2 x="340" y="660"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="180" y="660"/>
|
||||||
|
<p2 x="260" y="660"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-100" y="280"/>
|
||||||
|
<p2 x="20" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="600"/>
|
||||||
|
<p2 x="20" y="600"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="220"/>
|
||||||
|
<p2 x="100" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="220"/>
|
||||||
|
<p2 x="140" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="540"/>
|
||||||
|
<p2 x="100" y="540"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="160"/>
|
||||||
|
<p2 x="20" y="160"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="160"/>
|
||||||
|
<p2 x="140" y="160"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="480"/>
|
||||||
|
<p2 x="20" y="480"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="480"/>
|
||||||
|
<p2 x="120" y="480"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="480"/>
|
||||||
|
<p2 x="260" y="480"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="40"/>
|
||||||
|
<p2 x="120" y="40"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="40"/>
|
||||||
|
<p2 x="700" y="40"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="360"/>
|
||||||
|
<p2 x="20" y="360"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="680"/>
|
||||||
|
<p2 x="20" y="680"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="680"/>
|
||||||
|
<p2 x="120" y="680"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="680"/>
|
||||||
|
<p2 x="260" y="680"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="300"/>
|
||||||
|
<p2 x="120" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="620"/>
|
||||||
|
<p2 x="100" y="620"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="240"/>
|
||||||
|
<p2 x="20" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="560"/>
|
||||||
|
<p2 x="20" y="560"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="320" y="180"/>
|
||||||
|
<p2 x="340" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="180"/>
|
||||||
|
<p2 x="260" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="120"/>
|
||||||
|
<p2 x="20" y="120"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="120"/>
|
||||||
|
<p2 x="700" y="120"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="440"/>
|
||||||
|
<p2 x="120" y="440"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="440"/>
|
||||||
|
<p2 x="20" y="440"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="320" y="760"/>
|
||||||
|
<p2 x="340" y="760"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="760"/>
|
||||||
|
<p2 x="260" y="760"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="60"/>
|
||||||
|
<p2 x="20" y="60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="380"/>
|
||||||
|
<p2 x="20" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="380"/>
|
||||||
|
<p2 x="100" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="700"/>
|
||||||
|
<p2 x="100" y="700"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="120"/>
|
||||||
|
<p2 x="240" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="680"/>
|
||||||
|
<p2 x="240" y="780"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="200"/>
|
||||||
|
<p2 x="240" y="480"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="480"/>
|
||||||
|
<p2 x="240" y="680"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-100" y="-80"/>
|
||||||
|
<p2 x="-100" y="-60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-100" y="-20"/>
|
||||||
|
<p2 x="-100" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-100" y="280"/>
|
||||||
|
<p2 x="-100" y="400"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-100" y="400"/>
|
||||||
|
<p2 x="-100" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="-80"/>
|
||||||
|
<p2 x="-20" y="-60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="-20"/>
|
||||||
|
<p2 x="-20" y="120"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="680"/>
|
||||||
|
<p2 x="-20" y="760"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="760"/>
|
||||||
|
<p2 x="-20" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="440"/>
|
||||||
|
<p2 x="-20" y="680"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="120"/>
|
||||||
|
<p2 x="-20" y="440"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="140"/>
|
||||||
|
<p2 x="100" y="160"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="200"/>
|
||||||
|
<p2 x="100" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="380"/>
|
||||||
|
<p2 x="100" y="440"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="480"/>
|
||||||
|
<p2 x="100" y="540"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="620"/>
|
||||||
|
<p2 x="100" y="640"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="100" y="680"/>
|
||||||
|
<p2 x="100" y="700"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="-100"/>
|
||||||
|
<p2 x="-120" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="60"/>
|
||||||
|
<p2 x="-120" y="480"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="560"/>
|
||||||
|
<p2 x="-120" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="480"/>
|
||||||
|
<p2 x="-120" y="560"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-120" y="-80"/>
|
||||||
|
<p2 x="-120" y="60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="-100"/>
|
||||||
|
<p2 x="-40" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="-80"/>
|
||||||
|
<p2 x="-40" y="0"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="360"/>
|
||||||
|
<p2 x="-40" y="600"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="600"/>
|
||||||
|
<p2 x="-40" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="0"/>
|
||||||
|
<p2 x="-40" y="360"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="40"/>
|
||||||
|
<p2 x="120" y="140"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="220"/>
|
||||||
|
<p2 x="120" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-140" y="-80"/>
|
||||||
|
<p2 x="-140" y="-60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-140" y="-20"/>
|
||||||
|
<p2 x="-140" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-140" y="80"/>
|
||||||
|
<p2 x="-140" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="-80"/>
|
||||||
|
<p2 x="-60" y="-60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="-20"/>
|
||||||
|
<p2 x="-60" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="520"/>
|
||||||
|
<p2 x="-60" y="640"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="200"/>
|
||||||
|
<p2 x="-60" y="520"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="640"/>
|
||||||
|
<p2 x="-60" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="-100"/>
|
||||||
|
<p2 x="-160" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="320"/>
|
||||||
|
<p2 x="-160" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="240"/>
|
||||||
|
<p2 x="-160" y="320"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="-80"/>
|
||||||
|
<p2 x="-160" y="160"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-160" y="160"/>
|
||||||
|
<p2 x="-160" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="-100"/>
|
||||||
|
<p2 x="-80" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="380"/>
|
||||||
|
<p2 x="-80" y="720"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="20"/>
|
||||||
|
<p2 x="-80" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="720"/>
|
||||||
|
<p2 x="-80" y="820"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="-80"/>
|
||||||
|
<p2 x="-80" y="20"/>
|
||||||
|
</wire>
|
||||||
|
</wires>
|
||||||
|
<measurementOrdering/>
|
||||||
|
</circuit>
|
94
src/test/resources/dig/GAL/PassThrough.dig
Normal file
94
src/test/resources/dig/GAL/PassThrough.dig
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<circuit>
|
||||||
|
<version>1</version>
|
||||||
|
<attributes/>
|
||||||
|
<visualElements>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="220" y="60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>In</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>A</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>3</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="180" y="60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Clock</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="180" y="100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Y</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>16</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="300" y="60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>X</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<string>15</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="300" y="20"/>
|
||||||
|
</visualElement>
|
||||||
|
</visualElements>
|
||||||
|
<wires>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="80"/>
|
||||||
|
<p2 x="220" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="180" y="100"/>
|
||||||
|
<p2 x="200" y="100"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="20"/>
|
||||||
|
<p2 x="300" y="20"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="180" y="60"/>
|
||||||
|
<p2 x="200" y="60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="60"/>
|
||||||
|
<p2 x="300" y="60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="60"/>
|
||||||
|
<p2 x="220" y="60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="80"/>
|
||||||
|
<p2 x="200" y="100"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="20"/>
|
||||||
|
<p2 x="200" y="60"/>
|
||||||
|
</wire>
|
||||||
|
</wires>
|
||||||
|
<measurementOrdering/>
|
||||||
|
</circuit>
|
Loading…
x
Reference in New Issue
Block a user