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; 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.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);

View File

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

View File

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

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. * 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)) {

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 * Otherwise a null is returned
* *
* @param name the name of the variable * @param name the name of the variable

View File

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

View File

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

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>