mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-14 23:36:27 -04:00
changed creating of inputs and outputs by the shapes.
This commit is contained in:
parent
6526b66d79
commit
0181ba72d3
@ -15,7 +15,7 @@ public class ObservableValue extends Observable implements PinDescription {
|
||||
private long value;
|
||||
private boolean highZ;
|
||||
private boolean bidirectional;
|
||||
private String description = "";
|
||||
private String description;
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
@ -251,7 +251,10 @@ public class ObservableValue extends Observable implements PinDescription {
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return description;
|
||||
if (description != null)
|
||||
return description;
|
||||
else
|
||||
return getName();
|
||||
}
|
||||
|
||||
public ObservableValue setDescription(String description) {
|
||||
|
@ -57,7 +57,7 @@ public abstract class FanIn extends Node implements Element {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PinDescription[] getInputNames(ElementAttributes elementAttributes) {
|
||||
public PinDescription[] getInputDescription(ElementAttributes elementAttributes) {
|
||||
int count = elementAttributes.get(AttributeKey.InputCount);
|
||||
PinDescription[] names = new PinDescription[count];
|
||||
for (int i = 0; i < count; i++)
|
||||
|
@ -164,20 +164,30 @@ public class ElementTypeDescription {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the names of the inputs which are needed by this element.
|
||||
* Returns the description of the inputs which are needed by this element.
|
||||
* If you need a list of outputs names you can create a element using <code>createElement()</code>
|
||||
* and request the outputs by calling the elements <code>getOutputs()</code> method.
|
||||
* The you get an array of <code>ObservableName</code>s, and <code>ObservableName</code> has a
|
||||
* field <code>name</code>.
|
||||
* field <code>name</code>. Or call the getOutputDescription method.
|
||||
*
|
||||
* @param elementAttributes the elements attributes
|
||||
* @return the list of input names
|
||||
* @return the list of input descriptions
|
||||
* @throws NodeException NodeException
|
||||
*/
|
||||
public PinDescription[] getInputNames(ElementAttributes elementAttributes) throws NodeException {
|
||||
public PinDescription[] getInputDescription(ElementAttributes elementAttributes) throws NodeException {
|
||||
return inputPins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the output pin descriptions of this element.
|
||||
*
|
||||
* @param elementAttributes the elements attributs
|
||||
* @return the list of input descriptions
|
||||
*/
|
||||
public PinDescription[] getOutputDescriptions(ElementAttributes elementAttributes) {
|
||||
return elementFactory.create(elementAttributes).getOutputs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a element of this type
|
||||
*
|
||||
|
@ -19,7 +19,7 @@ public class LookUpTable extends Node implements Element {
|
||||
*/
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(LookUpTable.class) {
|
||||
@Override
|
||||
public PinDescription[] getInputNames(ElementAttributes elementAttributes) {
|
||||
public PinDescription[] getInputDescription(ElementAttributes elementAttributes) {
|
||||
int size = elementAttributes.get(AttributeKey.InputCount);
|
||||
PinDescription[] names = new PinDescription[size];
|
||||
for (int i = 0; i < size; i++)
|
||||
|
@ -7,6 +7,7 @@ import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.Element;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.ElementTypeDescription;
|
||||
import de.neemann.digital.lang.Lang;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
|
||||
@ -24,7 +25,8 @@ public class Decoder extends Node implements Element {
|
||||
private int oldSelectorValue;
|
||||
private int selectorValue;
|
||||
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Decoder.class, input("sel"))
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Decoder.class,
|
||||
input("sel", Lang.get("elem_Decode_pin_sel")))
|
||||
.addAttribute(AttributeKey.Rotate)
|
||||
.addAttribute(AttributeKey.SelectorBits)
|
||||
.addAttribute(AttributeKey.FlipSelPositon)
|
||||
|
@ -7,6 +7,7 @@ import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.Element;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.ElementTypeDescription;
|
||||
import de.neemann.digital.lang.Lang;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
|
||||
@ -27,7 +28,9 @@ public class Demultiplexer extends Node implements Element {
|
||||
private int selectorValue;
|
||||
private long value;
|
||||
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Demultiplexer.class, input("sel"), input("in"))
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Demultiplexer.class,
|
||||
input("sel", Lang.get("elem_Demultiplexer_pin_sel")),
|
||||
input("in"))
|
||||
.addAttribute(AttributeKey.Rotate)
|
||||
.addAttribute(AttributeKey.Bits)
|
||||
.addAttribute(AttributeKey.SelectorBits)
|
||||
|
@ -15,7 +15,9 @@ import static de.neemann.digital.core.element.PinInfo.input;
|
||||
*/
|
||||
public class Driver extends Node implements Element {
|
||||
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Driver.class, input("in"), input("sel"))
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Driver.class,
|
||||
input("in"),
|
||||
input("sel"))
|
||||
.addAttribute(AttributeKey.Rotate)
|
||||
.addAttribute(AttributeKey.Bits)
|
||||
.addAttribute(AttributeKey.FlipSelPositon);
|
||||
|
@ -25,10 +25,10 @@ public class Multiplexer extends FanIn {
|
||||
|
||||
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Multiplexer.class) {
|
||||
@Override
|
||||
public PinDescription[] getInputNames(ElementAttributes elementAttributes) {
|
||||
public PinDescription[] getInputDescription(ElementAttributes elementAttributes) {
|
||||
int size = 1 << elementAttributes.get(AttributeKey.SelectorBits);
|
||||
PinDescription[] names = new PinDescription[size + 1];
|
||||
names[0] = input("sel");
|
||||
names[0] = input("sel", Lang.get("elem_Multiplexer_pin_sel"));
|
||||
for (int i = 0; i < size; i++)
|
||||
names[i + 1] = input("in_" + i);
|
||||
return names;
|
||||
|
@ -33,7 +33,7 @@ public class Splitter implements Element {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PinDescription[] getInputNames(ElementAttributes elementAttributes) throws BitsException {
|
||||
public PinDescription[] getInputDescription(ElementAttributes elementAttributes) throws BitsException {
|
||||
Ports p = new Ports(elementAttributes.get(AttributeKey.InputSplit));
|
||||
return p.getNames(PinDescription.Direction.input);
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ public class ModelDescription implements Iterable<ModelEntry> {
|
||||
}
|
||||
|
||||
if (isNotAIO)
|
||||
entries.add(new ModelEntry(element, pins, ve, elementType.getInputNames(ve.getElementAttributes()), isNestedCircuit));
|
||||
entries.add(new ModelEntry(element, pins, ve, elementType.getInputDescription(ve.getElementAttributes()), isNestedCircuit));
|
||||
|
||||
for (Pin p : pins)
|
||||
netList.add(p);
|
||||
|
@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
|
||||
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -10,8 +11,6 @@ import de.neemann.digital.draw.graphics.Orientation;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
*/
|
||||
@ -22,14 +21,16 @@ public class BreakShape implements Shape {
|
||||
private static final Vector D1 = new Vector(SIZEQ, -SIZEQ);
|
||||
private static final Vector D2 = new Vector(SIZEQ, SIZEQ);
|
||||
private final String label;
|
||||
private final PinDescription[] inputs;
|
||||
|
||||
public BreakShape(ElementAttributes attr) {
|
||||
public BreakShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), input("brk")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), inputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.Element;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -13,7 +14,6 @@ import de.neemann.digital.gui.components.CircuitComponent;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
|
||||
/**
|
||||
@ -24,15 +24,17 @@ public class ButtonShape implements Shape {
|
||||
private static final int HEIGHT = SIZE / 2;
|
||||
|
||||
private final String label;
|
||||
private final PinDescription[] outputs;
|
||||
private IOState ioState;
|
||||
|
||||
public ButtonShape(ElementAttributes attr) {
|
||||
public ButtonShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.outputs = outputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), output("out")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), outputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.Element;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -13,7 +14,6 @@ import de.neemann.digital.gui.components.CircuitComponent;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
|
||||
/**
|
||||
@ -24,19 +24,21 @@ public class ClockShape implements Shape {
|
||||
private static final Vector POS = new Vector(-SIZE - WI * 2, WI);
|
||||
|
||||
private final String label;
|
||||
private final PinDescription[] outputs;
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
*
|
||||
* @param attr
|
||||
*/
|
||||
public ClockShape(ElementAttributes attr) {
|
||||
public ClockShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.outputs = outputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), output("C")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), outputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -12,22 +13,22 @@ import de.neemann.digital.draw.graphics.Orientation;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
*/
|
||||
public class ConstShape implements Shape {
|
||||
|
||||
private final PinDescription[] outputs;
|
||||
private String value;
|
||||
|
||||
public ConstShape(ElementAttributes attr) {
|
||||
public ConstShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.outputs = outputs;
|
||||
this.value = ObservableValue.getHexString(attr.get(AttributeKey.Value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), output("out")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), outputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -6,6 +6,7 @@ import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.Element;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
import de.neemann.digital.draw.graphics.Graphic;
|
||||
@ -30,7 +31,7 @@ public class DataShape implements Shape {
|
||||
private final int maxSize;
|
||||
private DataSet dataSet;
|
||||
|
||||
public DataShape(ElementAttributes attr) {
|
||||
public DataShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
if (attr.get(AttributeKey.MicroStep))
|
||||
type = ModelEvent.MICROSTEP;
|
||||
else
|
||||
|
@ -3,13 +3,12 @@ package de.neemann.digital.draw.shapes;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
import de.neemann.digital.draw.graphics.*;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
||||
|
||||
/**
|
||||
@ -20,12 +19,16 @@ public class DemuxerShape implements Shape {
|
||||
private final boolean hasInput;
|
||||
private final boolean flip;
|
||||
private final int height;
|
||||
private final PinDescription[] inputs;
|
||||
private final PinDescription[] outputs;
|
||||
private Pins pins;
|
||||
|
||||
public DemuxerShape(ElementAttributes attr, boolean hasInput) {
|
||||
this.hasInput = hasInput;
|
||||
public DemuxerShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.outputs = outputs;
|
||||
this.flip = attr.get(AttributeKey.FlipSelPositon);
|
||||
outputCount = 1 << attr.get(AttributeKey.SelectorBits);
|
||||
hasInput = inputs.length > 1;
|
||||
height = hasInput || (outputCount <= 2) ? outputCount * SIZE : (outputCount - 1) * SIZE;
|
||||
}
|
||||
|
||||
@ -33,16 +36,16 @@ public class DemuxerShape implements Shape {
|
||||
public Pins getPins() {
|
||||
if (pins == null) {
|
||||
pins = new Pins();
|
||||
pins.add(new Pin(new Vector(SIZE, flip ? 0 : height), input("sel")));
|
||||
pins.add(new Pin(new Vector(SIZE, flip ? 0 : height), inputs[0]));
|
||||
if (outputCount == 2) {
|
||||
pins.add(new Pin(new Vector(SIZE * 2, 0 * SIZE), output("out_0")));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, 2 * SIZE), output("out_1")));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, 0 * SIZE), outputs[0]));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, 2 * SIZE), outputs[1]));
|
||||
} else
|
||||
for (int i = 0; i < outputCount; i++) {
|
||||
pins.add(new Pin(new Vector(SIZE * 2, i * SIZE), output("out_" + i)));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, i * SIZE), outputs[i]));
|
||||
}
|
||||
if (hasInput)
|
||||
pins.add(new Pin(new Vector(0, (outputCount / 2) * SIZE), input("in")));
|
||||
pins.add(new Pin(new Vector(0, (outputCount / 2) * SIZE), inputs[1]));
|
||||
}
|
||||
return pins;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package de.neemann.digital.draw.shapes;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -11,8 +12,6 @@ import de.neemann.digital.draw.graphics.Polygon;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE2;
|
||||
|
||||
@ -21,9 +20,13 @@ import static de.neemann.digital.draw.shapes.GenericShape.SIZE2;
|
||||
*/
|
||||
public class DriverShape implements Shape {
|
||||
private final boolean bottom;
|
||||
private final PinDescription[] inputs;
|
||||
private final PinDescription[] outputs;
|
||||
private Pins pins;
|
||||
|
||||
public DriverShape(ElementAttributes attr) {
|
||||
public DriverShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.outputs = outputs;
|
||||
this.bottom = attr.get(AttributeKey.FlipSelPositon);
|
||||
}
|
||||
|
||||
@ -31,9 +34,9 @@ public class DriverShape implements Shape {
|
||||
public Pins getPins() {
|
||||
if (pins == null) {
|
||||
pins = new Pins();
|
||||
pins.add(new Pin(new Vector(-SIZE, 0), input("in")));
|
||||
pins.add(new Pin(new Vector(0, bottom ? SIZE : -SIZE), input("sel")));
|
||||
pins.add(new Pin(new Vector(SIZE, 0), output("out")));
|
||||
pins.add(new Pin(new Vector(-SIZE, 0), inputs[0]));
|
||||
pins.add(new Pin(new Vector(0, bottom ? SIZE : -SIZE), inputs[1]));
|
||||
pins.add(new Pin(new Vector(SIZE, 0), outputs[0]));
|
||||
}
|
||||
return pins;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.Element;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -14,7 +15,6 @@ import de.neemann.digital.gui.components.SingleValueDialog;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.OutputShape.RAD;
|
||||
import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
|
||||
@ -24,15 +24,17 @@ import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
public class InputShape implements Shape {
|
||||
|
||||
private final String label;
|
||||
private final PinDescription[] outputs;
|
||||
private IOState ioState;
|
||||
|
||||
public InputShape(ElementAttributes attr) {
|
||||
public InputShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.outputs = outputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), output("out")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), outputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -12,7 +13,6 @@ import de.neemann.digital.draw.graphics.Orientation;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
|
||||
/**
|
||||
@ -22,17 +22,19 @@ public class LEDShape implements Shape {
|
||||
private static final Vector RAD = new Vector(SIZE - 2, SIZE - 2);
|
||||
private static final Vector RADL = new Vector(SIZE, SIZE);
|
||||
private final String label;
|
||||
private final PinDescription[] inputs;
|
||||
private Style onStyle;
|
||||
private IOState ioState;
|
||||
|
||||
public LEDShape(ElementAttributes attr) {
|
||||
public LEDShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.label = attr.getLabel();
|
||||
onStyle = new Style(1, true, attr.get(AttributeKey.Color));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), input("in")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), inputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -3,41 +3,44 @@ package de.neemann.digital.draw.shapes;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.AttributeKey;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
import de.neemann.digital.draw.graphics.*;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
*/
|
||||
public class MuxerShape implements Shape {
|
||||
private final int inputCount;
|
||||
private final boolean flip;
|
||||
private final int inputCount;
|
||||
private final PinDescription[] inputs;
|
||||
private final PinDescription[] outputs;
|
||||
private Pins pins;
|
||||
|
||||
public MuxerShape(ElementAttributes attr) {
|
||||
public MuxerShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.outputs = outputs;
|
||||
inputCount = inputs.length - 1;
|
||||
this.flip = attr.get(AttributeKey.FlipSelPositon);
|
||||
this.inputCount = 1 << attr.get(AttributeKey.SelectorBits);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
if (pins == null) {
|
||||
pins = new Pins();
|
||||
pins.add(new Pin(new Vector(SIZE, flip ? 0 : inputCount * SIZE), input("sel")));
|
||||
if (inputCount == 2) {
|
||||
pins.add(new Pin(new Vector(0, 0 * SIZE), input("in_0")));
|
||||
pins.add(new Pin(new Vector(0, 2 * SIZE), input("in_1")));
|
||||
pins.add(new Pin(new Vector(SIZE, flip ? 0 : inputCount * SIZE), inputs[0]));
|
||||
if (inputs.length == 3) {
|
||||
pins.add(new Pin(new Vector(0, 0 * SIZE), inputs[1]));
|
||||
pins.add(new Pin(new Vector(0, 2 * SIZE), inputs[2]));
|
||||
} else
|
||||
for (int i = 0; i < inputCount; i++) {
|
||||
pins.add(new Pin(new Vector(0, i * SIZE), input("in_" + i)));
|
||||
pins.add(new Pin(new Vector(0, i * SIZE), inputs[i + 1]));
|
||||
}
|
||||
pins.add(new Pin(new Vector(SIZE * 2, (inputCount / 2) * SIZE), output("out")));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, (inputCount / 2) * SIZE), outputs[0]));
|
||||
}
|
||||
return pins;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package de.neemann.digital.draw.shapes;
|
||||
import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -11,8 +12,6 @@ import de.neemann.digital.draw.graphics.Orientation;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
*/
|
||||
@ -21,15 +20,17 @@ public class OutputShape implements Shape {
|
||||
public static final Vector RAD = new Vector(SIZE - 6, SIZE - 6);
|
||||
public static final Vector RADL = new Vector(SIZE, SIZE);
|
||||
private final String label;
|
||||
private final PinDescription[] inputs;
|
||||
private IOState ioState;
|
||||
|
||||
public OutputShape(ElementAttributes attr) {
|
||||
public OutputShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), input("in")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), inputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
|
||||
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -10,24 +11,24 @@ import de.neemann.digital.draw.graphics.Orientation;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
*/
|
||||
public class ProbeShape implements Shape {
|
||||
|
||||
private final String label;
|
||||
private final PinDescription[] inputs;
|
||||
private IOState ioState;
|
||||
private int bits;
|
||||
|
||||
public ProbeShape(ElementAttributes attr) {
|
||||
public ProbeShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.inputs = inputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), input("in")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), inputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2,12 +2,12 @@ package de.neemann.digital.draw.shapes;
|
||||
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
import de.neemann.digital.draw.graphics.*;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.output;
|
||||
import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
|
||||
/**
|
||||
@ -16,14 +16,16 @@ import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
|
||||
public class ResetShape implements Shape {
|
||||
|
||||
private final String label;
|
||||
private final PinDescription[] outputs;
|
||||
|
||||
public ResetShape(ElementAttributes attr) {
|
||||
public ResetShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
this.outputs = outputs;
|
||||
this.label = attr.getLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
return new Pins().add(new Pin(new Vector(0, 0), output("Reset")));
|
||||
return new Pins().add(new Pin(new Vector(0, 0), outputs[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -3,7 +3,7 @@ package de.neemann.digital.draw.shapes;
|
||||
import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinInfo;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
@ -17,12 +17,14 @@ import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
||||
*/
|
||||
public class SevenSegHexShape extends SevenShape {
|
||||
private static final int[] TABLE = new int[]{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
|
||||
private final PinDescription[] inputs;
|
||||
private Pins pins;
|
||||
private ObservableValue input;
|
||||
private ObservableValue dp;
|
||||
|
||||
public SevenSegHexShape(ElementAttributes attr) {
|
||||
public SevenSegHexShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
super(attr);
|
||||
this.inputs = inputs;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -49,8 +51,8 @@ public class SevenSegHexShape extends SevenShape {
|
||||
public Pins getPins() {
|
||||
if (pins == null) {
|
||||
pins = new Pins()
|
||||
.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), PinInfo.input("d")))
|
||||
.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), PinInfo.input("dp")));
|
||||
.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), inputs[0]))
|
||||
.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), inputs[1]));
|
||||
}
|
||||
return pins;
|
||||
}
|
||||
|
@ -3,38 +3,40 @@ package de.neemann.digital.draw.shapes;
|
||||
import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pin;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
import de.neemann.digital.draw.graphics.Style;
|
||||
import de.neemann.digital.draw.graphics.Vector;
|
||||
|
||||
import static de.neemann.digital.core.element.PinInfo.input;
|
||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
*/
|
||||
public class SevenSegShape extends SevenShape {
|
||||
private final PinDescription[] inputPins;
|
||||
private ObservableValue[] inputs;
|
||||
private Pins pins;
|
||||
|
||||
public SevenSegShape(ElementAttributes attr) {
|
||||
public SevenSegShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
super(attr);
|
||||
this.inputPins = inputs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pins getPins() {
|
||||
if (pins == null) {
|
||||
pins = new Pins();
|
||||
pins.add(new Pin(new Vector(0, 0), input("a")));
|
||||
pins.add(new Pin(new Vector(SIZE, 0), input("b")));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, 0), input("c")));
|
||||
pins.add(new Pin(new Vector(SIZE * 3, 0), input("d")));
|
||||
pins.add(new Pin(new Vector(0, SIZE * HEIGHT), input("e")));
|
||||
pins.add(new Pin(new Vector(SIZE, SIZE * HEIGHT), input("f")));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), input("g")));
|
||||
pins.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), input("dp")));
|
||||
pins.add(new Pin(new Vector(0, 0), inputPins[0]));
|
||||
pins.add(new Pin(new Vector(SIZE, 0), inputPins[1]));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, 0), inputPins[2]));
|
||||
pins.add(new Pin(new Vector(SIZE * 3, 0), inputPins[3]));
|
||||
pins.add(new Pin(new Vector(0, SIZE * HEIGHT), inputPins[4]));
|
||||
pins.add(new Pin(new Vector(SIZE, SIZE * HEIGHT), inputPins[5]));
|
||||
pins.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), inputPins[6]));
|
||||
pins.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), inputPins[7]));
|
||||
}
|
||||
return pins;
|
||||
}
|
||||
|
@ -16,6 +16,9 @@ public interface Shape extends Drawable {
|
||||
* Puts the pins name and the pins x-y-position together!
|
||||
* This information is used to calculate the models connections
|
||||
* from the wiring in the circuit.
|
||||
* Don't create your own {@link de.neemann.digital.core.element.PinInfo} instance! Try to use
|
||||
* the instances available from the {@link de.neemann.digital.core.element.ElementTypeDescription}s
|
||||
* getInputDescription and get
|
||||
*
|
||||
* @return the pins
|
||||
*/
|
||||
|
@ -32,13 +32,13 @@ public final class ShapeFactory {
|
||||
map.put(NAnd.DESCRIPTION.getName(), new CreatorSimple("&", NAnd.DESCRIPTION, true));
|
||||
map.put(NOr.DESCRIPTION.getName(), new CreatorSimple("\u22651", NOr.DESCRIPTION, true));
|
||||
map.put(Not.DESCRIPTION.getName(), new CreatorSimple("", Not.DESCRIPTION, true));
|
||||
map.put(Delay.DESCRIPTION.getName(), attr -> new DelayShape());
|
||||
map.put(Delay.DESCRIPTION.getName(), (attributes, inputs, outputs) -> new DelayShape());
|
||||
|
||||
map.put(XOr.DESCRIPTION.getName(), new CreatorSimple("=1", XOr.DESCRIPTION, false));
|
||||
map.put(XNOr.DESCRIPTION.getName(), new CreatorSimple("=1", XNOr.DESCRIPTION, true));
|
||||
|
||||
map.put(RAMDualPort.DESCRIPTION.getName(), attr -> new RAMShape("RAM", RAMDualPort.DESCRIPTION.getInputNames(attr), outputInfos(RAMDualPort.DESCRIPTION, attr), attr.get(AttributeKey.Label)));
|
||||
map.put(RAMSinglePort.DESCRIPTION.getName(), attr -> new RAMShape("RAM", RAMSinglePort.DESCRIPTION.getInputNames(attr), outputInfos(RAMSinglePort.DESCRIPTION, attr), attr.get(AttributeKey.Label)));
|
||||
map.put(RAMDualPort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape("RAM", RAMDualPort.DESCRIPTION.getInputDescription(attr), RAMDualPort.DESCRIPTION.getOutputDescriptions(attr), attr.get(AttributeKey.Label)));
|
||||
map.put(RAMSinglePort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape("RAM", RAMSinglePort.DESCRIPTION.getInputDescription(attr), RAMSinglePort.DESCRIPTION.getOutputDescriptions(attr), attr.get(AttributeKey.Label)));
|
||||
|
||||
map.put(In.DESCRIPTION.getName(), InputShape::new);
|
||||
map.put(Reset.DESCRIPTION.getName(), ResetShape::new);
|
||||
@ -55,8 +55,8 @@ public final class ShapeFactory {
|
||||
map.put(Break.DESCRIPTION.getName(), BreakShape::new);
|
||||
|
||||
map.put(Multiplexer.DESCRIPTION.getName(), MuxerShape::new);
|
||||
map.put(Demultiplexer.DESCRIPTION.getName(), attr -> new DemuxerShape(attr, true));
|
||||
map.put(Decoder.DESCRIPTION.getName(), attr -> new DemuxerShape(attr, false));
|
||||
map.put(Demultiplexer.DESCRIPTION.getName(), DemuxerShape::new);
|
||||
map.put(Decoder.DESCRIPTION.getName(), DemuxerShape::new);
|
||||
|
||||
map.put(Splitter.DESCRIPTION.getName(), SplitterShape::new);
|
||||
map.put(Driver.DESCRIPTION.getName(), DriverShape::new);
|
||||
@ -64,10 +64,6 @@ public final class ShapeFactory {
|
||||
map.put(DummyElement.TEXTDESCRIPTION.getName(), TextShape::new);
|
||||
}
|
||||
|
||||
private PinDescription[] outputInfos(ElementTypeDescription description, ElementAttributes attributes) {
|
||||
return description.createElement(attributes).getOutputs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a shape matching the given name.
|
||||
* If no shape is found, a special "missing shape" shape is returned.
|
||||
@ -88,28 +84,32 @@ public final class ShapeFactory {
|
||||
LibrarySelector.ElementTypeDescriptionCustom customDescr = (LibrarySelector.ElementTypeDescriptionCustom) pt;
|
||||
return new GenericShape(
|
||||
pt.getShortName(),
|
||||
pt.getInputNames(elementAttributes),
|
||||
outputInfos(pt, elementAttributes),
|
||||
pt.getInputDescription(elementAttributes),
|
||||
pt.getOutputDescriptions(elementAttributes),
|
||||
elementAttributes.get(AttributeKey.Label),
|
||||
true,
|
||||
customDescr.getAttributes().get(AttributeKey.Width));
|
||||
} else
|
||||
return new GenericShape(
|
||||
pt.getShortName(),
|
||||
pt.getInputNames(elementAttributes),
|
||||
outputInfos(pt, elementAttributes),
|
||||
pt.getInputDescription(elementAttributes),
|
||||
pt.getOutputDescriptions(elementAttributes),
|
||||
elementAttributes.get(AttributeKey.Label),
|
||||
true);
|
||||
}
|
||||
} else
|
||||
return cr.create(elementAttributes);
|
||||
} else {
|
||||
ElementTypeDescription pt = library.getElementType(elementName);
|
||||
return cr.create(elementAttributes,
|
||||
pt.getInputDescription(elementAttributes),
|
||||
pt.getOutputDescriptions(elementAttributes));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return new MissingShape(elementName, e);
|
||||
}
|
||||
}
|
||||
|
||||
private interface Creator {
|
||||
Shape create(ElementAttributes attributes) throws NodeException;
|
||||
Shape create(ElementAttributes attributes, PinDescription[] inputs, PinDescription[] outputs) throws NodeException;
|
||||
}
|
||||
|
||||
|
||||
@ -126,8 +126,8 @@ public final class ShapeFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shape create(ElementAttributes attributes) throws NodeException {
|
||||
return new GenericShape(name, description.getInputNames(attributes), outputInfos(description, attributes)).invert(invers);
|
||||
public Shape create(ElementAttributes attributes, PinDescription[] inputs, PinDescription[] outputs) throws NodeException {
|
||||
return new GenericShape(name, inputs, outputs).invert(invers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,11 +23,11 @@ public class SplitterShape implements Shape {
|
||||
private final int length;
|
||||
private Pins pins;
|
||||
|
||||
public SplitterShape(ElementAttributes attr) throws BitsException {
|
||||
public SplitterShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) throws BitsException {
|
||||
String inputDef = attr.get(AttributeKey.InputSplit);
|
||||
String outputDef = attr.get(AttributeKey.OutputSplit);
|
||||
inputs = new Splitter.Ports(inputDef).getNames(PinDescription.Direction.input);
|
||||
outputs = new Splitter.Ports(outputDef).getNames(PinDescription.Direction.output);
|
||||
this.inputs = new Splitter.Ports(inputDef).getNames(PinDescription.Direction.input);
|
||||
this.outputs = new Splitter.Ports(outputDef).getNames(PinDescription.Direction.output);
|
||||
length = (Math.max(inputs.length, outputs.length) - 1) * SIZE + 2;
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
|
||||
|
||||
import de.neemann.digital.core.Observer;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.PinDescription;
|
||||
import de.neemann.digital.draw.elements.IOState;
|
||||
import de.neemann.digital.draw.elements.Pins;
|
||||
import de.neemann.digital.draw.graphics.*;
|
||||
@ -20,7 +21,7 @@ public class TextShape implements Shape {
|
||||
*
|
||||
* @param attr attributes
|
||||
*/
|
||||
public TextShape(ElementAttributes attr) {
|
||||
public TextShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
|
||||
String text = attr.getLabel();
|
||||
if (text.length() == 0)
|
||||
text = Lang.get("elem_Text");
|
||||
|
@ -60,8 +60,14 @@ elem_Seven-Seg-Hex=Siebensegmentanzeige Hex
|
||||
elem_Terminal=Terminal
|
||||
elem_Data=Messwertgraph
|
||||
elem_Multiplexer=Multiplexer
|
||||
elem_Multiplexer_tt=W\u00E4hlt eine der Eingangsleitungen aus, und gibt dessen Wert am Ausgang aus.
|
||||
elem_Multiplexer_pin_sel=Mit dieser Leitung wird der Eingang ausgew\u00E4hlt
|
||||
elem_Demultiplexer=Demultiplexer
|
||||
elem_Demultiplexer_tt=Gibt ein Eingangssignal auf einem w\u00E4hlbaren Ausgang aus, die anderen Ausg\u00E4nge sind Null.
|
||||
elem_Demultiplexer_pin_sel=Mit dieser Leitung wird der Ausgang ausgew\u00E4hlt
|
||||
elem_Decoder=Decoder
|
||||
elem_Decoder_tt=Eine w\u00E4hlbare Ausgangsleitung geht auf Eins, alle anderen sind Null.
|
||||
elem_Decode_pin_sel=Mit dieser Leitung wird der zu aktivierende Ausgang ausgew\u00E4hlt
|
||||
elem_Const=Konstante
|
||||
elem_Splitter=Splitter
|
||||
elem_Clock=Takt
|
||||
|
Loading…
x
Reference in New Issue
Block a user