allows GAL signal pass through, see #390

This commit is contained in:
hneemann 2019-12-05 09:26:03 +01:00
parent af432a2268
commit f58ee33c1c
11 changed files with 1205 additions and 35 deletions

View File

@ -80,4 +80,12 @@ public class BuilderCollector implements BuilderInterface<BuilderCollector> {
return registered;
}
/**
* Removes an output.
*
* @param name the output to remove
*/
public void removeOutput(String name) {
outputs.remove(name);
}
}

View File

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

View File

@ -84,7 +84,7 @@ public class CuplExporter implements ExpressionExporter<CuplExporter> {
this.date = date;
this.devName = devName;
this.pinMap = pinMap;
builder = new CuplBuilder();
builder = new CuplBuilder(pinMap);
cleanNameBuilder = new CleanNameBuilder(builder);
}
@ -228,14 +228,15 @@ public class CuplExporter implements ExpressionExporter<CuplExporter> {
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 CuplBuilder(PinMap pinMap) {
super(pinMap);
}
@Override
public BuilderCollector addCombinatorial(String name, Expression expression) throws BuilderException {
if (pinMap.isSimpleAlias(name, expression))
return this; // ignore simple variables!
expression.traverse(notAllowedVariablesVisitor);
notAllowedVariablesVisitor.check(name);
return super.addCombinatorial(name, expression);

View File

@ -5,9 +5,11 @@
*/
package de.neemann.digital.builder.Gal16v8;
import de.neemann.digital.analyse.expression.Expression;
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.FuseMapFiller;
import de.neemann.digital.builder.jedec.FuseMapFillerException;
@ -43,18 +45,10 @@ public class Gal16v8JEDECExporter implements ExpressionExporter<Gal16v8JEDECExpo
map.setFuse(i, true);
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()
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9)
.setAvailOutputs(12, 13, 14, 15, 16, 17, 18, 19);
builder = new BuilderCollectorGAL(pinMap);
}
private void init(boolean registered) {

View File

@ -5,9 +5,9 @@
*/
package de.neemann.digital.builder.Gal22v10;
import de.neemann.digital.analyse.expression.Expression;
import de.neemann.digital.analyse.expression.Variable;
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.FuseMapFiller;
import de.neemann.digital.builder.jedec.FuseMapFillerException;
@ -36,18 +36,10 @@ public class Gal22v10JEDECExporter implements ExpressionExporter<Gal22v10JEDECEx
map = new FuseMap(5892);
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()
.setAvailInputs(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13)
.setAvailOutputs(14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
builder = new BuilderCollectorGAL(pinMap);
}
@Override

View File

@ -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.
* 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 expression the expression to check
* @param name the name of the target
* @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
*/
public boolean isSimpleAlias(String name, Expression expression) {
public boolean isSimpleAlias(String name, Expression expression, HashSet<String> sequentialVars) {
if (expression instanceof Variable) {
String al = ((Variable) expression).getIdentifier();
if (sequentialVars != null && !sequentialVars.contains(al))
return false;
HashSet<String> found = null;
for (HashSet<String> s : alias)
if (s.contains(name) || s.contains(al)) {

View File

@ -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
*
* @param name the name of the variable

View File

@ -5,12 +5,30 @@
*/
package de.neemann.digital.builder.Gal16v8;
import de.neemann.digital.analyse.*;
import de.neemann.digital.analyse.expression.Constant;
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.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 java.io.ByteArrayOutputStream;
import java.io.*;
import java.util.Date;
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;
/**
* CUPL builder tests
*/
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();
}
}

View File

@ -8,7 +8,12 @@ package de.neemann.digital.builder;
import de.neemann.digital.analyse.expression.Variable;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
/**
*
*/
public class PinMapTest extends TestCase {
@ -131,7 +136,7 @@ public class PinMapTest extends TestCase {
public void testAlias() throws PinMapException {
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("B"));
@ -139,14 +144,14 @@ public class PinMapTest extends TestCase {
public void testAliasSwap() throws PinMapException {
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("B"));
}
public void testAliasReverseOrder() throws PinMapException {
assertTrue(pinMap.isSimpleAlias("B", new Variable("A")));
assertTrue(pinMap.isSimpleAlias("B", new Variable("A"), null));
pinMap.assignPin("A", 4);
assertEquals(4, pinMap.getOutputFor("A"));
@ -156,12 +161,27 @@ public class PinMapTest extends TestCase {
public void testAliasInput() throws PinMapException {
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("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 {
pinMap.assignPin("A", 1);

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

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