mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-30 00:18:37 -04:00
added backtracking. Is needed to determine the input signals, a output signal depends on.
This commit is contained in:
parent
59e3d8d211
commit
b593cf1c72
@ -0,0 +1,69 @@
|
|||||||
|
package de.neemann.digital.analyse;
|
||||||
|
|
||||||
|
import de.neemann.digital.core.*;
|
||||||
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
|
import de.neemann.digital.lang.Lang;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static de.neemann.digital.core.Model.MAX_LOOP_COUNTER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to analyse on which inputs a given output depends.
|
||||||
|
* So you only have to take into account the inputs, a given outputs
|
||||||
|
* depends on.
|
||||||
|
* Created by hneemann on 11.06.17.
|
||||||
|
*/
|
||||||
|
public class DependencyAnalyser {
|
||||||
|
|
||||||
|
private final HashMap<Signal, Set<ObservableValue>> sigMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance
|
||||||
|
*
|
||||||
|
* @param modelAnalyser the model analyser
|
||||||
|
* @throws BackTracException BackTracException
|
||||||
|
* @throws PinException PinException
|
||||||
|
*/
|
||||||
|
public DependencyAnalyser(ModelAnalyser modelAnalyser) throws BackTracException, PinException {
|
||||||
|
sigMap = new HashMap<>();
|
||||||
|
for (Signal s : modelAnalyser.getInputs()) {
|
||||||
|
Set<ObservableValue> effected = new HashSet<>();
|
||||||
|
backTrac(s.getValue(), effected, MAX_LOOP_COUNTER);
|
||||||
|
sigMap.put(s, effected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all inputs the given output depends on
|
||||||
|
*
|
||||||
|
* @param output the output to analyse
|
||||||
|
* @return the list of inputs which effect the given output
|
||||||
|
*/
|
||||||
|
public ArrayList<Signal> getInputs(Signal output) {
|
||||||
|
ArrayList<Signal> list = new ArrayList<>();
|
||||||
|
for (Map.Entry<Signal, Set<ObservableValue>> e : sigMap.entrySet()) {
|
||||||
|
if (e.getValue().contains(output.getValue())) {
|
||||||
|
list.add(e.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void backTrac(ObservableValue value, Set<ObservableValue> effected, int depth) throws PinException, BackTracException {
|
||||||
|
effected.add(value);
|
||||||
|
|
||||||
|
if (depth < 0)
|
||||||
|
throw new BackTracException(Lang.get("err_backtracLoopFound"));
|
||||||
|
|
||||||
|
for (de.neemann.digital.core.Observer o : value) {
|
||||||
|
if ((o instanceof NodeInterface)) {
|
||||||
|
ObservableValues outputs = ((NodeInterface) o).getOutputs();
|
||||||
|
for (ObservableValue co : outputs)
|
||||||
|
backTrac(co, effected, depth - 1);
|
||||||
|
} else
|
||||||
|
throw new BackTracException(Lang.get("err_backtracOf_N_isImpossible", o.getClass().getSimpleName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -84,7 +84,12 @@ public class ModelAnalyser {
|
|||||||
inputs.add(sig);
|
inputs.add(sig);
|
||||||
|
|
||||||
ObservableValue notQ = ff.getOutputs().get(1);
|
ObservableValue notQ = ff.getOutputs().get(1);
|
||||||
q.addObserver(() -> notQ.setValue(~q.getValue()));
|
q.addObserver(new NodeWithoutDelay(notQ) {
|
||||||
|
@Override
|
||||||
|
public void hasChanged() {
|
||||||
|
notQ.setValue(~q.getValue());
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs.size() == 0)
|
if (inputs.size() == 0)
|
||||||
@ -167,10 +172,13 @@ public class ModelAnalyser {
|
|||||||
final ObservableValue qout = ff.getOutputs().get(0);
|
final ObservableValue qout = ff.getOutputs().get(0);
|
||||||
final ObservableValue nqout = ff.getOutputs().get(1);
|
final ObservableValue nqout = ff.getOutputs().get(1);
|
||||||
ObservableValue spq = outsp.getOutputs().get(0);
|
ObservableValue spq = outsp.getOutputs().get(0);
|
||||||
spq.addObserver(() -> {
|
spq.addObserver(new NodeWithoutDelay(qout, nqout) {
|
||||||
final long value = spq.getValue();
|
@Override
|
||||||
qout.setValue(value);
|
public void hasChanged() {
|
||||||
nqout.setValue(~value);
|
final long value = spq.getValue();
|
||||||
|
qout.setValue(value);
|
||||||
|
nqout.setValue(~value);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
} catch (NodeException e) {
|
} catch (NodeException e) {
|
||||||
@ -216,7 +224,12 @@ public class ModelAnalyser {
|
|||||||
try {
|
try {
|
||||||
Splitter sp = Splitter.createNToOne(bits);
|
Splitter sp = Splitter.createNToOne(bits);
|
||||||
final ObservableValue out = sp.getOutputs().get(0);
|
final ObservableValue out = sp.getOutputs().get(0);
|
||||||
out.addObserver(() -> s.getValue().setValue(out.getValue()));
|
out.addObserver(new NodeWithoutDelay(s.getValue()) {
|
||||||
|
@Override
|
||||||
|
public void hasChanged() {
|
||||||
|
s.getValue().setValue(out.getValue());
|
||||||
|
}
|
||||||
|
});
|
||||||
out.fireHasChanged();
|
out.fireHasChanged();
|
||||||
|
|
||||||
ObservableValues.Builder builder = new ObservableValues.Builder();
|
ObservableValues.Builder builder = new ObservableValues.Builder();
|
||||||
@ -338,5 +351,17 @@ public class ModelAnalyser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the models inputs
|
||||||
|
*/
|
||||||
|
public ArrayList<Signal> getInputs() {
|
||||||
|
return inputs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the models outputs
|
||||||
|
*/
|
||||||
|
public ArrayList<Signal> getOutputs() {
|
||||||
|
return outputs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
17
src/main/java/de/neemann/digital/core/BackTracException.java
Normal file
17
src/main/java/de/neemann/digital/core/BackTracException.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package de.neemann.digital.core;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates an error backtracking a value to all affected values
|
||||||
|
* Created by hneemann on 11.06.17.
|
||||||
|
*/
|
||||||
|
public class BackTracException extends Exception {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance
|
||||||
|
*
|
||||||
|
* @param message the message
|
||||||
|
*/
|
||||||
|
public BackTracException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -41,7 +41,7 @@ public class Model implements Iterable<Node> {
|
|||||||
/**
|
/**
|
||||||
* Maximal number of calculation loops before oscillating behaviour is detected
|
* Maximal number of calculation loops before oscillating behaviour is detected
|
||||||
*/
|
*/
|
||||||
private static final int MAX_COUNTER = 1000;
|
public static final int MAX_LOOP_COUNTER = 1000;
|
||||||
|
|
||||||
private final ArrayList<Clock> clocks;
|
private final ArrayList<Clock> clocks;
|
||||||
private final ArrayList<Break> breaks;
|
private final ArrayList<Break> breaks;
|
||||||
@ -191,7 +191,7 @@ public class Model implements Iterable<Node> {
|
|||||||
int counter = 0;
|
int counter = 0;
|
||||||
if (needsUpdate()) {
|
if (needsUpdate()) {
|
||||||
while (needsUpdate()) {
|
while (needsUpdate()) {
|
||||||
if (counter++ > MAX_COUNTER) {
|
if (counter++ > MAX_LOOP_COUNTER) {
|
||||||
throw new NodeException(Lang.get("err_seemsToOscillate")).addNodes(nodesToUpdateNext);
|
throw new NodeException(Lang.get("err_seemsToOscillate")).addNodes(nodesToUpdateNext);
|
||||||
}
|
}
|
||||||
doMicroStep(noise);
|
doMicroStep(noise);
|
||||||
|
@ -16,7 +16,7 @@ import java.io.File;
|
|||||||
*
|
*
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
*/
|
*/
|
||||||
public abstract class Node implements Observer {
|
public abstract class Node implements NodeInterface {
|
||||||
|
|
||||||
private final boolean hasState;
|
private final boolean hasState;
|
||||||
private Model model;
|
private Model model;
|
||||||
|
19
src/main/java/de/neemann/digital/core/NodeInterface.java
Normal file
19
src/main/java/de/neemann/digital/core/NodeInterface.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package de.neemann.digital.core;
|
||||||
|
|
||||||
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The simplest possible node
|
||||||
|
* Created by hneemann on 11.06.17.
|
||||||
|
*/
|
||||||
|
public interface NodeInterface extends Observer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the outputs effected by this node
|
||||||
|
*
|
||||||
|
* @return the outputs
|
||||||
|
* @throws PinException PinException
|
||||||
|
*/
|
||||||
|
ObservableValues getOutputs() throws PinException;
|
||||||
|
|
||||||
|
}
|
35
src/main/java/de/neemann/digital/core/NodeWithoutDelay.java
Normal file
35
src/main/java/de/neemann/digital/core/NodeWithoutDelay.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package de.neemann.digital.core;
|
||||||
|
|
||||||
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A node which has no delay
|
||||||
|
* Created by hneemann on 11.06.17.
|
||||||
|
*/
|
||||||
|
public abstract class NodeWithoutDelay implements NodeInterface {
|
||||||
|
|
||||||
|
private ObservableValues outputs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance
|
||||||
|
*
|
||||||
|
* @param outputs the nodes outputs
|
||||||
|
*/
|
||||||
|
public NodeWithoutDelay(ObservableValue... outputs) {
|
||||||
|
this(new ObservableValues(outputs));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance
|
||||||
|
*
|
||||||
|
* @param outputs the nodes outputs
|
||||||
|
*/
|
||||||
|
public NodeWithoutDelay(ObservableValues outputs) {
|
||||||
|
this.outputs = outputs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ObservableValues getOutputs() throws PinException {
|
||||||
|
return outputs;
|
||||||
|
}
|
||||||
|
}
|
@ -8,7 +8,7 @@ import java.util.Iterator;
|
|||||||
*
|
*
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
*/
|
*/
|
||||||
public class Observable {
|
public class Observable implements Iterable<Observer> {
|
||||||
private final ArrayList<Observer> observers;
|
private final ArrayList<Observer> observers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,4 +75,9 @@ public class Observable {
|
|||||||
public boolean hasObserver(Observer observer) {
|
public boolean hasObserver(Observer observer) {
|
||||||
return observers.contains(observer);
|
return observers.contains(observer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Observer> iterator() {
|
||||||
|
return observers.iterator();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ public class ObservableValue extends Observable implements PinDescription {
|
|||||||
* @return this for chained calls
|
* @return this for chained calls
|
||||||
*/
|
*/
|
||||||
public ObservableValue addObserverToValue(Observer observer) {
|
public ObservableValue addObserverToValue(Observer observer) {
|
||||||
super.addObserver(observer);
|
addObserver(observer);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ public interface Element {
|
|||||||
void setInputs(ObservableValues inputs) throws NodeException;
|
void setInputs(ObservableValues inputs) throws NodeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When the connections between the elements are build all outputs a collected
|
* When the connections between the elements are build, all outputs are collected
|
||||||
* by calling this method. After the interconnection they are set to the inputs
|
* by calling this method. After the interconnection they are set to the inputs
|
||||||
* by calling <code>setInputs()</code>
|
* by calling <code>setInputs()</code>
|
||||||
*
|
*
|
||||||
|
@ -10,7 +10,7 @@ import de.neemann.digital.core.element.Keys;
|
|||||||
* A diode needed to create wired elements
|
* A diode needed to create wired elements
|
||||||
* Used to build a wired OR or AND.
|
* Used to build a wired OR or AND.
|
||||||
*/
|
*/
|
||||||
public class Diode implements Element, Observer {
|
public class Diode implements Element, NodeInterface {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The diodes description
|
* The diodes description
|
||||||
|
@ -11,7 +11,7 @@ import static de.neemann.digital.core.element.PinInfo.input;
|
|||||||
* A diode needed to pull a wire to VDD.
|
* A diode needed to pull a wire to VDD.
|
||||||
* Used to build a wired OR.
|
* Used to build a wired OR.
|
||||||
*/
|
*/
|
||||||
public class DiodeForward implements Element, Observer {
|
public class DiodeForward implements Element, NodeInterface {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The diodes description
|
* The diodes description
|
||||||
|
@ -12,7 +12,7 @@ import de.neemann.digital.lang.Lang;
|
|||||||
/**
|
/**
|
||||||
* A simple switch
|
* A simple switch
|
||||||
*/
|
*/
|
||||||
public class Switch implements Element, Observer {
|
public class Switch implements Element, NodeInterface {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The switch description
|
* The switch description
|
||||||
|
@ -141,14 +141,22 @@ public class Splitter implements Element {
|
|||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
if (highZIn)
|
if (highZIn)
|
||||||
inValue.addObserverToValue(() -> {
|
inValue.addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
if (inValue.isHighZ())
|
@Override
|
||||||
outValue.set(0, true);
|
public void hasChanged() {
|
||||||
else
|
if (inValue.isHighZ())
|
||||||
outValue.set(inValue.getValue() >> bitPos, false);
|
outValue.set(0, true);
|
||||||
|
else
|
||||||
|
outValue.set(inValue.getValue() >> bitPos, false);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
inValue.addObserverToValue(() -> outValue.setValue(inValue.getValue() >> bitPos));
|
inValue.addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
|
@Override
|
||||||
|
public void hasChanged() {
|
||||||
|
outValue.setValue(inValue.getValue() >> bitPos);
|
||||||
|
}
|
||||||
|
});
|
||||||
break; // done!! out is completely filled!
|
break; // done!! out is completely filled!
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,10 +171,13 @@ public class Splitter implements Element {
|
|||||||
final long mask = ~(((1L << in.bits) - 1) << bitPos);
|
final long mask = ~(((1L << in.bits) - 1) << bitPos);
|
||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
inputs.get(in.number).addObserverToValue(() -> {
|
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
long in1 = inValue.getValue();
|
@Override
|
||||||
long out1 = outValue.getValue();
|
public void hasChanged() {
|
||||||
outValue.setValue((out1 & mask) | (in1 << bitPos));
|
long in1 = inValue.getValue();
|
||||||
|
long out1 = outValue.getValue();
|
||||||
|
outValue.setValue((out1 & mask) | (in1 << bitPos));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
continue; // done with this input, its completely copied to the output!
|
continue; // done with this input, its completely copied to the output!
|
||||||
}
|
}
|
||||||
@ -180,10 +191,13 @@ public class Splitter implements Element {
|
|||||||
final int shift = out.getPos() - in.getPos();
|
final int shift = out.getPos() - in.getPos();
|
||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
inputs.get(in.number).addObserverToValue(() -> {
|
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
long in12 = inValue.getValue();
|
@Override
|
||||||
long out12 = outValue.getValue();
|
public void hasChanged() {
|
||||||
outValue.setValue((out12 & mask) | (in12 >> shift));
|
long in12 = inValue.getValue();
|
||||||
|
long out12 = outValue.getValue();
|
||||||
|
outValue.setValue((out12 & mask) | (in12 >> shift));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -194,10 +208,13 @@ public class Splitter implements Element {
|
|||||||
final long mask = ~(((1L << bitsToCopy) - 1) << shift);
|
final long mask = ~(((1L << bitsToCopy) - 1) << shift);
|
||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
inputs.get(in.number).addObserverToValue(() -> {
|
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
long in13 = inValue.getValue();
|
@Override
|
||||||
long out13 = outValue.getValue();
|
public void hasChanged() {
|
||||||
outValue.setValue((out13 & mask) | (in13 << shift));
|
long in13 = inValue.getValue();
|
||||||
|
long out13 = outValue.getValue();
|
||||||
|
outValue.setValue((out13 & mask) | (in13 << shift));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package de.neemann.digital.draw.model;
|
package de.neemann.digital.draw.model;
|
||||||
|
|
||||||
|
import de.neemann.digital.core.NodeWithoutDelay;
|
||||||
import de.neemann.digital.core.ObservableValue;
|
import de.neemann.digital.core.ObservableValue;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -51,7 +52,12 @@ public class InverterConfig {
|
|||||||
return orig;
|
return orig;
|
||||||
|
|
||||||
ObservableValue out = new ObservableValue("~" + orig.getName(), orig.getBits());
|
ObservableValue out = new ObservableValue("~" + orig.getName(), orig.getBits());
|
||||||
orig.addObserver(() -> out.set(~orig.getValue(), orig.isHighZ()));
|
orig.addObserver(new NodeWithoutDelay(out) {
|
||||||
|
@Override
|
||||||
|
public void hasChanged() {
|
||||||
|
out.set(~orig.getValue(), orig.isHighZ());
|
||||||
|
}
|
||||||
|
});
|
||||||
out.set(~orig.getValue(), orig.isHighZ());
|
out.set(~orig.getValue(), orig.isHighZ());
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ public class ExpressionCreator {
|
|||||||
TableReducer tr = new TableReducer(vars, boolTable);
|
TableReducer tr = new TableReducer(vars, boolTable);
|
||||||
List<Variable> localVars = vars;
|
List<Variable> localVars = vars;
|
||||||
if (tr.canReduce()) {
|
if (tr.canReduce()) {
|
||||||
LOGGER.debug(resultName + " reduced from " + vars.size() + " to " + tr.getVars().size() + " variables");
|
LOGGER.debug(resultName + " reduced from " + vars.size() + " to " + tr.getVars().size() + " variables ("+tr.getVars()+")");
|
||||||
boolTable = tr.getTable();
|
boolTable = tr.getTable();
|
||||||
localVars = tr.getVars();
|
localVars = tr.getVars();
|
||||||
}
|
}
|
||||||
|
@ -539,6 +539,8 @@ Sind evtl. die Namen der Variablen nicht eindeutig?</string>
|
|||||||
<string name="err_invalidTransmissionGateState">Die Steuereingänge eines Transmission-Gates müssen invertiert beschaltet werden!</string>
|
<string name="err_invalidTransmissionGateState">Die Steuereingänge eines Transmission-Gates müssen invertiert beschaltet werden!</string>
|
||||||
<string name="err_nameUsedTwice_N">Signal {0} wurde mehrfach verwendet!</string>
|
<string name="err_nameUsedTwice_N">Signal {0} wurde mehrfach verwendet!</string>
|
||||||
<string name="err_errorParsingTestdata">Fehler beim Einlesen der Testdaten.</string>
|
<string name="err_errorParsingTestdata">Fehler beim Einlesen der Testdaten.</string>
|
||||||
|
<string name="err_backtracLoopFound">Das Model enthält zirkuläre Abhängigkeiten.</string>
|
||||||
|
<string name="err_backtracOf_N_isImpossible">Die Modelkomponente {0} kann nicht analysiert werden.</string>
|
||||||
|
|
||||||
<string name="key_AddrBits">Adress-Bits</string>
|
<string name="key_AddrBits">Adress-Bits</string>
|
||||||
<string name="key_AddrBits_tt">Anzahl der Adress-Bits die verwendet werden.</string>
|
<string name="key_AddrBits_tt">Anzahl der Adress-Bits die verwendet werden.</string>
|
||||||
|
@ -529,6 +529,8 @@ The names of the variables may not be unique.</string>
|
|||||||
<string name="err_invalidTransmissionGateState">The two control inputs of a transmission gate must be inverted!</string>
|
<string name="err_invalidTransmissionGateState">The two control inputs of a transmission gate must be inverted!</string>
|
||||||
<string name="err_nameUsedTwice_N">Signal {0} is used twice!</string>
|
<string name="err_nameUsedTwice_N">Signal {0} is used twice!</string>
|
||||||
<string name="err_errorParsingTestdata">Error parsing the test data.</string>
|
<string name="err_errorParsingTestdata">Error parsing the test data.</string>
|
||||||
|
<string name="err_backtracLoopFound">Thes model contains circular dependencies.</string>
|
||||||
|
<string name="err_backtracOf_N_isImpossible">The model component {0} can not be analysed.</string>
|
||||||
|
|
||||||
<string name="key_AddrBits">Address Bits</string>
|
<string name="key_AddrBits">Address Bits</string>
|
||||||
<string name="key_AddrBits_tt">Number of address bits used.</string>
|
<string name="key_AddrBits_tt">Number of address bits used.</string>
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package de.neemann.digital.analyse;
|
||||||
|
|
||||||
|
import de.neemann.digital.core.*;
|
||||||
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
|
import de.neemann.digital.integration.ToBreakRunner;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author hneemann
|
||||||
|
*/
|
||||||
|
public class DependencyAnalyserTest extends TestCase {
|
||||||
|
|
||||||
|
private static final int[] VAL = new int[]{1, 1, 1, 2, 6, 5, 5, 3, 8, 7, 7, 5, 10, 9, 9, 7, 2, 14, 14, 14, 14, 14, 14, 14, 2, 2};
|
||||||
|
|
||||||
|
public void testAnalyzer() throws Exception {
|
||||||
|
Model model = new ToBreakRunner("dig/backTrac/Plexer.dig").getModel();
|
||||||
|
ModelAnalyser m = new ModelAnalyser(model);
|
||||||
|
DependencyAnalyser da = new DependencyAnalyser(m);
|
||||||
|
|
||||||
|
assertEquals(17, m.getInputs().size());
|
||||||
|
assertEquals(26, m.getOutputs().size());
|
||||||
|
for (int i = 0; i < m.getOutputs().size(); i++)
|
||||||
|
assertEquals("" + i, VAL[i], da.getInputs(m.getOutputs().get(i)).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
ExpressionCreator - p0n+1 reduced from 17 to 1 variables ([Count])
|
||||||
|
ExpressionCreator - p1n+1 reduced from 17 to 1 variables ([p0n])
|
||||||
|
ExpressionCreator - Q_1n+1 reduced from 17 to 1 variables ([Q_0n])
|
||||||
|
ExpressionCreator - Q_0n+1 reduced from 17 to 2 variables ([Q_1n, Q_0n])
|
||||||
|
ExpressionCreator - C0Q_3n+1 reduced from 17 to 6 variables ([p0n, p1n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n])
|
||||||
|
ExpressionCreator - C0Q_2n+1 reduced from 17 to 5 variables ([p0n, p1n, C0Q_2n, C0Q_1n, C0Q_0n])
|
||||||
|
ExpressionCreator - C0Q_1n+1 reduced from 17 to 5 variables ([p0n, p1n, C0Q_3n, C0Q_1n, C0Q_0n])
|
||||||
|
ExpressionCreator - C0Q_0n+1 reduced from 17 to 3 variables ([p0n, p1n, C0Q_0n])
|
||||||
|
ExpressionCreator - C1Q_3n+1 reduced from 17 to 8 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n])
|
||||||
|
ExpressionCreator - C1Q_2n+1 reduced from 17 to 7 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_2n, C1Q_1n, C1Q_0n])
|
||||||
|
ExpressionCreator - C1Q_1n+1 reduced from 17 to 7 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_3n, C1Q_1n, C1Q_0n])
|
||||||
|
ExpressionCreator - C1Q_0n+1 reduced from 17 to 5 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_0n])
|
||||||
|
ExpressionCreator - C2Q_3n+1 reduced from 17 to 10 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_3n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - C2Q_2n+1 reduced from 17 to 9 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_3n, C1Q_0n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - C2Q_1n+1 reduced from 17 to 9 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_3n, C1Q_0n, C2Q_3n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - C2Q_0n+1 reduced from 17 to 7 variables ([p0n, p1n, C0Q_3n, C0Q_0n, C1Q_3n, C1Q_0n, C2Q_0n])
|
||||||
|
ExpressionCreator - s2 reduced from 17 to 2 variables ([Q_1n, Q_0n])
|
||||||
|
ExpressionCreator - d0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - c0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - b0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - a0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - e0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - f0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - g0 reduced from 17 to 14 variables ([Q_1n, Q_0n, C0Q_3n, C0Q_2n, C0Q_1n, C0Q_0n, C1Q_3n, C1Q_2n, C1Q_1n, C1Q_0n, C2Q_3n, C2Q_2n, C2Q_1n, C2Q_0n])
|
||||||
|
ExpressionCreator - s1 reduced from 17 to 2 variables ([Q_1n, Q_0n])
|
||||||
|
ExpressionCreator - s0 reduced from 17 to 2 variables ([Q_1n, Q_0n])
|
||||||
|
|
||||||
|
*/
|
569
src/test/resources/dig/backTrac/Plexer.dig
Normal file
569
src/test/resources/dig/backTrac/Plexer.dig
Normal file
@ -0,0 +1,569 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<circuit>
|
||||||
|
<version>1</version>
|
||||||
|
<attributes>
|
||||||
|
<entry>
|
||||||
|
<string>Width</string>
|
||||||
|
<int>5</int>
|
||||||
|
</entry>
|
||||||
|
</attributes>
|
||||||
|
<visualElements>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Clock</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>runRealTime</string>
|
||||||
|
<boolean>true</boolean>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>C</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Frequency</string>
|
||||||
|
<int>20</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="240" y="100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Multiplexer</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Selector Bits</string>
|
||||||
|
<int>2</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Bits</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="480" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Splitter</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Input Splitting</string>
|
||||||
|
<string>4</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Output Splitting</string>
|
||||||
|
<string>1*4</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="560" y="220"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Decoder</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Selector Bits</string>
|
||||||
|
<int>2</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>flipSelPos</string>
|
||||||
|
<boolean>true</boolean>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="480" y="420"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Splitter</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Input Splitting</string>
|
||||||
|
<string>1,1</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Output Splitting</string>
|
||||||
|
<string>2</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="400" y="460"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Ground</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Bits</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="460" y="260"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 18</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>s2</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>18</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="460"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>dif.dig</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="300" y="60"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>counter2Bit3.dig</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="300" y="460"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>decoder.dig</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="600" y="220"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>counter.dig</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>C0</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="300" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>counter.dig</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>C1</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="300" y="280"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>counter.dig</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>C2</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="300" y="380"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 14</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>d0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>8</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="220"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 12</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>c0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>6</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="860" y="240"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 11</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>b0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>5</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="260"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 9</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>a0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="860" y="280"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 8</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>e0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>9</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="300"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 6</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>f0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>11</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="860" y="320"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 5</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>g0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>12</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="340"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 17</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>s1</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>19</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="860" y="440"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 16</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>s0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>20</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="700" y="420"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>In</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Description</string>
|
||||||
|
<string>Pin 26</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Count</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>pinNumber</string>
|
||||||
|
<int>26</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="240" y="60"/>
|
||||||
|
</visualElement>
|
||||||
|
</visualElements>
|
||||||
|
<wires>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="480"/>
|
||||||
|
<p2 x="400" y="480"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="320"/>
|
||||||
|
<p2 x="860" y="320"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="520" y="420"/>
|
||||||
|
<p2 x="700" y="420"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="580" y="260"/>
|
||||||
|
<p2 x="600" y="260"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="260"/>
|
||||||
|
<p2 x="700" y="260"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="100"/>
|
||||||
|
<p2 x="260" y="100"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="100"/>
|
||||||
|
<p2 x="300" y="100"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="200"/>
|
||||||
|
<p2 x="400" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="420" y="200"/>
|
||||||
|
<p2 x="480" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="200"/>
|
||||||
|
<p2 x="300" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="520" y="460"/>
|
||||||
|
<p2 x="700" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="460"/>
|
||||||
|
<p2 x="300" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="420" y="460"/>
|
||||||
|
<p2 x="460" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="460"/>
|
||||||
|
<p2 x="400" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="140"/>
|
||||||
|
<p2 x="400" y="140"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="300"/>
|
||||||
|
<p2 x="400" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="300"/>
|
||||||
|
<p2 x="300" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="300"/>
|
||||||
|
<p2 x="700" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="400"/>
|
||||||
|
<p2 x="300" y="400"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="240"/>
|
||||||
|
<p2 x="400" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="580" y="240"/>
|
||||||
|
<p2 x="600" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="240"/>
|
||||||
|
<p2 x="480" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="240"/>
|
||||||
|
<p2 x="860" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="80"/>
|
||||||
|
<p2 x="400" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="340"/>
|
||||||
|
<p2 x="400" y="340"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="340"/>
|
||||||
|
<p2 x="500" y="340"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="340"/>
|
||||||
|
<p2 x="700" y="340"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="180"/>
|
||||||
|
<p2 x="300" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="180"/>
|
||||||
|
<p2 x="480" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="280"/>
|
||||||
|
<p2 x="300" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="280"/>
|
||||||
|
<p2 x="420" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="580" y="280"/>
|
||||||
|
<p2 x="600" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="280"/>
|
||||||
|
<p2 x="860" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="520" y="440"/>
|
||||||
|
<p2 x="860" y="440"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="580" y="220"/>
|
||||||
|
<p2 x="600" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="520" y="220"/>
|
||||||
|
<p2 x="560" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="440" y="220"/>
|
||||||
|
<p2 x="480" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="680" y="220"/>
|
||||||
|
<p2 x="700" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="380"/>
|
||||||
|
<p2 x="300" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="380" y="380"/>
|
||||||
|
<p2 x="440" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="240" y="60"/>
|
||||||
|
<p2 x="300" y="60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="400" y="200"/>
|
||||||
|
<p2 x="400" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="400" y="300"/>
|
||||||
|
<p2 x="400" y="340"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="400" y="80"/>
|
||||||
|
<p2 x="400" y="140"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="100"/>
|
||||||
|
<p2 x="260" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="400"/>
|
||||||
|
<p2 x="260" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="300"/>
|
||||||
|
<p2 x="260" y="400"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="260" y="200"/>
|
||||||
|
<p2 x="260" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="420" y="200"/>
|
||||||
|
<p2 x="420" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="500" y="260"/>
|
||||||
|
<p2 x="500" y="340"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="500" y="340"/>
|
||||||
|
<p2 x="500" y="420"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="140"/>
|
||||||
|
<p2 x="280" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="240"/>
|
||||||
|
<p2 x="280" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="280" y="340"/>
|
||||||
|
<p2 x="280" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="440" y="220"/>
|
||||||
|
<p2 x="440" y="380"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="340"/>
|
||||||
|
<p2 x="460" y="460"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="240"/>
|
||||||
|
<p2 x="460" y="260"/>
|
||||||
|
</wire>
|
||||||
|
</wires>
|
||||||
|
</circuit>
|
1058
src/test/resources/dig/backTrac/counter.dig
Normal file
1058
src/test/resources/dig/backTrac/counter.dig
Normal file
File diff suppressed because it is too large
Load Diff
277
src/test/resources/dig/backTrac/counter2Bit3.dig
Normal file
277
src/test/resources/dig/backTrac/counter2Bit3.dig
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<circuit>
|
||||||
|
<version>1</version>
|
||||||
|
<attributes>
|
||||||
|
<entry>
|
||||||
|
<string>Width</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</attributes>
|
||||||
|
<visualElements>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_1n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="220" y="0"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_1n</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="140" y="0"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_0n</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="220" y="100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q_0n</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="140" y="100"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="20" y="80"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q1</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="220" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Q0</string>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>Inputs</string>
|
||||||
|
<int>1</int>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="220" y="220"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Tunnel</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>rotation</string>
|
||||||
|
<rotation rotation="1"/>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>NetName</string>
|
||||||
|
<string>Q_0n</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_1n</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>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="120" y="-60"/>
|
||||||
|
</visualElement>
|
||||||
|
</visualElements>
|
||||||
|
<wires>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="0"/>
|
||||||
|
<p2 x="220" y="0"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="0"/>
|
||||||
|
<p2 x="140" y="0"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="80"/>
|
||||||
|
<p2 x="20" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="200" y="100"/>
|
||||||
|
<p2 x="220" y="100"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="80" y="100"/>
|
||||||
|
<p2 x="140" y="100"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="180"/>
|
||||||
|
<p2 x="220" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="20"/>
|
||||||
|
<p2 x="140" y="20"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-20" y="120"/>
|
||||||
|
<p2 x="20" y="120"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="120"/>
|
||||||
|
<p2 x="140" y="120"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="220"/>
|
||||||
|
<p2 x="220" y="220"/>
|
||||||
|
</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="-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="120"/>
|
||||||
|
<p2 x="-20" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="-100"/>
|
||||||
|
<p2 x="-40" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="180"/>
|
||||||
|
<p2 x="-40" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-40" y="-80"/>
|
||||||
|
<p2 x="-40" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="-60"/>
|
||||||
|
<p2 x="120" y="20"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="120" y="20"/>
|
||||||
|
<p2 x="120" y="120"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="-80"/>
|
||||||
|
<p2 x="-60" y="-60"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="-20"/>
|
||||||
|
<p2 x="-60" y="80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-60" y="80"/>
|
||||||
|
<p2 x="-60" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="-100"/>
|
||||||
|
<p2 x="-80" y="-80"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="0"/>
|
||||||
|
<p2 x="-80" y="220"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="220"/>
|
||||||
|
<p2 x="-80" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="-80" y="-80"/>
|
||||||
|
<p2 x="-80" y="0"/>
|
||||||
|
</wire>
|
||||||
|
</wires>
|
||||||
|
</circuit>
|
1660
src/test/resources/dig/backTrac/decoder.dig
Normal file
1660
src/test/resources/dig/backTrac/decoder.dig
Normal file
File diff suppressed because it is too large
Load Diff
129
src/test/resources/dig/backTrac/dif.dig
Normal file
129
src/test/resources/dig/backTrac/dif.dig
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<circuit>
|
||||||
|
<version>1</version>
|
||||||
|
<attributes>
|
||||||
|
<entry>
|
||||||
|
<string>Width</string>
|
||||||
|
<int>4</int>
|
||||||
|
</entry>
|
||||||
|
</attributes>
|
||||||
|
<visualElements>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>In</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Count</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="320" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>p0</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="380" y="180"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>D_FF</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>p1</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="380" y="280"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>And</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="480" y="260"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Clock</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>C</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="320" y="240"/>
|
||||||
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Out</elementName>
|
||||||
|
<elementAttributes>
|
||||||
|
<entry>
|
||||||
|
<string>Label</string>
|
||||||
|
<string>Out</string>
|
||||||
|
</entry>
|
||||||
|
</elementAttributes>
|
||||||
|
<pos x="560" y="280"/>
|
||||||
|
</visualElement>
|
||||||
|
</visualElements>
|
||||||
|
<wires>
|
||||||
|
<wire>
|
||||||
|
<p1 x="360" y="240"/>
|
||||||
|
<p2 x="460" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="320" y="240"/>
|
||||||
|
<p2 x="340" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="320" y="180"/>
|
||||||
|
<p2 x="380" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="440" y="180"/>
|
||||||
|
<p2 x="460" y="180"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="260"/>
|
||||||
|
<p2 x="480" y="260"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="340" y="200"/>
|
||||||
|
<p2 x="380" y="200"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="360" y="280"/>
|
||||||
|
<p2 x="380" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="540" y="280"/>
|
||||||
|
<p2 x="560" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="340" y="300"/>
|
||||||
|
<p2 x="380" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="440" y="300"/>
|
||||||
|
<p2 x="480" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="340" y="200"/>
|
||||||
|
<p2 x="340" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="340" y="240"/>
|
||||||
|
<p2 x="340" y="300"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="360" y="240"/>
|
||||||
|
<p2 x="360" y="280"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="180"/>
|
||||||
|
<p2 x="460" y="240"/>
|
||||||
|
</wire>
|
||||||
|
<wire>
|
||||||
|
<p1 x="460" y="240"/>
|
||||||
|
<p2 x="460" y="260"/>
|
||||||
|
</wire>
|
||||||
|
</wires>
|
||||||
|
</circuit>
|
Loading…
x
Reference in New Issue
Block a user