changed creating of inputs and outputs by the shapes.

This commit is contained in:
hneemann 2016-04-15 15:58:16 +02:00
parent 6526b66d79
commit 0181ba72d3
30 changed files with 167 additions and 109 deletions

View File

@ -15,7 +15,7 @@ public class ObservableValue extends Observable implements PinDescription {
private long value; private long value;
private boolean highZ; private boolean highZ;
private boolean bidirectional; private boolean bidirectional;
private String description = ""; private String description;
/** /**
* Creates a new instance * Creates a new instance
@ -251,7 +251,10 @@ public class ObservableValue extends Observable implements PinDescription {
@Override @Override
public String getDescription() { public String getDescription() {
if (description != null)
return description; return description;
else
return getName();
} }
public ObservableValue setDescription(String description) { public ObservableValue setDescription(String description) {

View File

@ -57,7 +57,7 @@ public abstract class FanIn extends Node implements Element {
} }
@Override @Override
public PinDescription[] getInputNames(ElementAttributes elementAttributes) { public PinDescription[] getInputDescription(ElementAttributes elementAttributes) {
int count = elementAttributes.get(AttributeKey.InputCount); int count = elementAttributes.get(AttributeKey.InputCount);
PinDescription[] names = new PinDescription[count]; PinDescription[] names = new PinDescription[count];
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)

View File

@ -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> * 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. * 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 * 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 * @param elementAttributes the elements attributes
* @return the list of input names * @return the list of input descriptions
* @throws NodeException NodeException * @throws NodeException NodeException
*/ */
public PinDescription[] getInputNames(ElementAttributes elementAttributes) throws NodeException { public PinDescription[] getInputDescription(ElementAttributes elementAttributes) throws NodeException {
return inputPins; 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 * Creates a element of this type
* *

View File

@ -19,7 +19,7 @@ public class LookUpTable extends Node implements Element {
*/ */
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(LookUpTable.class) { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(LookUpTable.class) {
@Override @Override
public PinDescription[] getInputNames(ElementAttributes elementAttributes) { public PinDescription[] getInputDescription(ElementAttributes elementAttributes) {
int size = elementAttributes.get(AttributeKey.InputCount); int size = elementAttributes.get(AttributeKey.InputCount);
PinDescription[] names = new PinDescription[size]; PinDescription[] names = new PinDescription[size];
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)

View File

@ -7,6 +7,7 @@ import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.lang.Lang;
import static de.neemann.digital.core.element.PinInfo.input; 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 oldSelectorValue;
private int selectorValue; 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.Rotate)
.addAttribute(AttributeKey.SelectorBits) .addAttribute(AttributeKey.SelectorBits)
.addAttribute(AttributeKey.FlipSelPositon) .addAttribute(AttributeKey.FlipSelPositon)

View File

@ -7,6 +7,7 @@ import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.lang.Lang;
import static de.neemann.digital.core.element.PinInfo.input; import static de.neemann.digital.core.element.PinInfo.input;
@ -27,7 +28,9 @@ public class Demultiplexer extends Node implements Element {
private int selectorValue; private int selectorValue;
private long value; 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.Rotate)
.addAttribute(AttributeKey.Bits) .addAttribute(AttributeKey.Bits)
.addAttribute(AttributeKey.SelectorBits) .addAttribute(AttributeKey.SelectorBits)

View File

@ -15,7 +15,9 @@ import static de.neemann.digital.core.element.PinInfo.input;
*/ */
public class Driver extends Node implements Element { 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.Rotate)
.addAttribute(AttributeKey.Bits) .addAttribute(AttributeKey.Bits)
.addAttribute(AttributeKey.FlipSelPositon); .addAttribute(AttributeKey.FlipSelPositon);

View File

@ -25,10 +25,10 @@ public class Multiplexer extends FanIn {
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Multiplexer.class) { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Multiplexer.class) {
@Override @Override
public PinDescription[] getInputNames(ElementAttributes elementAttributes) { public PinDescription[] getInputDescription(ElementAttributes elementAttributes) {
int size = 1 << elementAttributes.get(AttributeKey.SelectorBits); int size = 1 << elementAttributes.get(AttributeKey.SelectorBits);
PinDescription[] names = new PinDescription[size + 1]; 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++) for (int i = 0; i < size; i++)
names[i + 1] = input("in_" + i); names[i + 1] = input("in_" + i);
return names; return names;

View File

@ -33,7 +33,7 @@ public class Splitter implements Element {
} }
@Override @Override
public PinDescription[] getInputNames(ElementAttributes elementAttributes) throws BitsException { public PinDescription[] getInputDescription(ElementAttributes elementAttributes) throws BitsException {
Ports p = new Ports(elementAttributes.get(AttributeKey.InputSplit)); Ports p = new Ports(elementAttributes.get(AttributeKey.InputSplit));
return p.getNames(PinDescription.Direction.input); return p.getNames(PinDescription.Direction.input);
} }

View File

@ -104,7 +104,7 @@ public class ModelDescription implements Iterable<ModelEntry> {
} }
if (isNotAIO) 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) for (Pin p : pins)
netList.add(p); netList.add(p);

View File

@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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.Style;
import de.neemann.digital.draw.graphics.Vector; import de.neemann.digital.draw.graphics.Vector;
import static de.neemann.digital.core.element.PinInfo.input;
/** /**
* @author hneemann * @author hneemann
*/ */
@ -22,14 +21,16 @@ public class BreakShape implements Shape {
private static final Vector D1 = new Vector(SIZEQ, -SIZEQ); private static final Vector D1 = new Vector(SIZEQ, -SIZEQ);
private static final Vector D2 = new Vector(SIZEQ, SIZEQ); private static final Vector D2 = new Vector(SIZEQ, SIZEQ);
private final String label; 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(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
@ -13,7 +14,6 @@ import de.neemann.digital.gui.components.CircuitComponent;
import java.awt.*; import java.awt.*;
import static de.neemann.digital.core.element.PinInfo.output;
import static de.neemann.digital.draw.shapes.OutputShape.SIZE; 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 static final int HEIGHT = SIZE / 2;
private final String label; private final String label;
private final PinDescription[] outputs;
private IOState ioState; private IOState ioState;
public ButtonShape(ElementAttributes attr) { public ButtonShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.outputs = outputs;
this.label = attr.getLabel(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
@ -13,7 +14,6 @@ import de.neemann.digital.gui.components.CircuitComponent;
import java.awt.*; import java.awt.*;
import static de.neemann.digital.core.element.PinInfo.output;
import static de.neemann.digital.draw.shapes.OutputShape.SIZE; 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 static final Vector POS = new Vector(-SIZE - WI * 2, WI);
private final String label; private final String label;
private final PinDescription[] outputs;
/** /**
* Creates a new instance * Creates a new instance
* *
* @param attr * @param attr
*/ */
public ClockShape(ElementAttributes attr) { public ClockShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.outputs = outputs;
this.label = attr.getLabel(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.AttributeKey; import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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.Style;
import de.neemann.digital.draw.graphics.Vector; import de.neemann.digital.draw.graphics.Vector;
import static de.neemann.digital.core.element.PinInfo.output;
/** /**
* @author hneemann * @author hneemann
*/ */
public class ConstShape implements Shape { public class ConstShape implements Shape {
private final PinDescription[] outputs;
private String value; 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)); this.value = ObservableValue.getHexString(attr.get(AttributeKey.Value));
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -6,6 +6,7 @@ import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.AttributeKey; import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.Graphic; import de.neemann.digital.draw.graphics.Graphic;
@ -30,7 +31,7 @@ public class DataShape implements Shape {
private final int maxSize; private final int maxSize;
private DataSet dataSet; private DataSet dataSet;
public DataShape(ElementAttributes attr) { public DataShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
if (attr.get(AttributeKey.MicroStep)) if (attr.get(AttributeKey.MicroStep))
type = ModelEvent.MICROSTEP; type = ModelEvent.MICROSTEP;
else else

View File

@ -3,13 +3,12 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.AttributeKey; import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.*; 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; 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 hasInput;
private final boolean flip; private final boolean flip;
private final int height; private final int height;
private final PinDescription[] inputs;
private final PinDescription[] outputs;
private Pins pins; private Pins pins;
public DemuxerShape(ElementAttributes attr, boolean hasInput) { public DemuxerShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.hasInput = hasInput; this.inputs = inputs;
this.outputs = outputs;
this.flip = attr.get(AttributeKey.FlipSelPositon); this.flip = attr.get(AttributeKey.FlipSelPositon);
outputCount = 1 << attr.get(AttributeKey.SelectorBits); outputCount = 1 << attr.get(AttributeKey.SelectorBits);
hasInput = inputs.length > 1;
height = hasInput || (outputCount <= 2) ? outputCount * SIZE : (outputCount - 1) * SIZE; height = hasInput || (outputCount <= 2) ? outputCount * SIZE : (outputCount - 1) * SIZE;
} }
@ -33,16 +36,16 @@ public class DemuxerShape implements Shape {
public Pins getPins() { public Pins getPins() {
if (pins == null) { if (pins == null) {
pins = new Pins(); 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) { if (outputCount == 2) {
pins.add(new Pin(new Vector(SIZE * 2, 0 * SIZE), output("out_0"))); pins.add(new Pin(new Vector(SIZE * 2, 0 * SIZE), outputs[0]));
pins.add(new Pin(new Vector(SIZE * 2, 2 * SIZE), output("out_1"))); pins.add(new Pin(new Vector(SIZE * 2, 2 * SIZE), outputs[1]));
} else } else
for (int i = 0; i < outputCount; i++) { 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) 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; return pins;
} }

View File

@ -3,6 +3,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.AttributeKey; import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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.Style;
import de.neemann.digital.draw.graphics.Vector; 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.SIZE;
import static de.neemann.digital.draw.shapes.GenericShape.SIZE2; 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 { public class DriverShape implements Shape {
private final boolean bottom; private final boolean bottom;
private final PinDescription[] inputs;
private final PinDescription[] outputs;
private Pins pins; 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); this.bottom = attr.get(AttributeKey.FlipSelPositon);
} }
@ -31,9 +34,9 @@ public class DriverShape implements Shape {
public Pins getPins() { public Pins getPins() {
if (pins == null) { if (pins == null) {
pins = new Pins(); pins = new Pins();
pins.add(new Pin(new Vector(-SIZE, 0), input("in"))); pins.add(new Pin(new Vector(-SIZE, 0), inputs[0]));
pins.add(new Pin(new Vector(0, bottom ? SIZE : -SIZE), input("sel"))); pins.add(new Pin(new Vector(0, bottom ? SIZE : -SIZE), inputs[1]));
pins.add(new Pin(new Vector(SIZE, 0), output("out"))); pins.add(new Pin(new Vector(SIZE, 0), outputs[0]));
} }
return pins; return pins;
} }

View File

@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
@ -14,7 +15,6 @@ import de.neemann.digital.gui.components.SingleValueDialog;
import java.awt.*; 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.RAD;
import static de.neemann.digital.draw.shapes.OutputShape.SIZE; 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 { public class InputShape implements Shape {
private final String label; private final String label;
private final PinDescription[] outputs;
private IOState ioState; private IOState ioState;
public InputShape(ElementAttributes attr) { public InputShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.outputs = outputs;
this.label = attr.getLabel(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -4,6 +4,7 @@ import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.AttributeKey; import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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.Style;
import de.neemann.digital.draw.graphics.Vector; 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; 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 RAD = new Vector(SIZE - 2, SIZE - 2);
private static final Vector RADL = new Vector(SIZE, SIZE); private static final Vector RADL = new Vector(SIZE, SIZE);
private final String label; private final String label;
private final PinDescription[] inputs;
private Style onStyle; private Style onStyle;
private IOState ioState; private IOState ioState;
public LEDShape(ElementAttributes attr) { public LEDShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.inputs = inputs;
this.label = attr.getLabel(); this.label = attr.getLabel();
onStyle = new Style(1, true, attr.get(AttributeKey.Color)); onStyle = new Style(1, true, attr.get(AttributeKey.Color));
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -3,41 +3,44 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.AttributeKey; import de.neemann.digital.core.element.AttributeKey;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.*; 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; import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/** /**
* @author hneemann * @author hneemann
*/ */
public class MuxerShape implements Shape { public class MuxerShape implements Shape {
private final int inputCount;
private final boolean flip; private final boolean flip;
private final int inputCount;
private final PinDescription[] inputs;
private final PinDescription[] outputs;
private Pins pins; 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.flip = attr.get(AttributeKey.FlipSelPositon);
this.inputCount = 1 << attr.get(AttributeKey.SelectorBits);
} }
@Override @Override
public Pins getPins() { public Pins getPins() {
if (pins == null) { if (pins == null) {
pins = new Pins(); pins = new Pins();
pins.add(new Pin(new Vector(SIZE, flip ? 0 : inputCount * SIZE), input("sel"))); pins.add(new Pin(new Vector(SIZE, flip ? 0 : inputCount * SIZE), inputs[0]));
if (inputCount == 2) { if (inputs.length == 3) {
pins.add(new Pin(new Vector(0, 0 * SIZE), input("in_0"))); pins.add(new Pin(new Vector(0, 0 * SIZE), inputs[1]));
pins.add(new Pin(new Vector(0, 2 * SIZE), input("in_1"))); pins.add(new Pin(new Vector(0, 2 * SIZE), inputs[2]));
} else } else
for (int i = 0; i < inputCount; i++) { 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; return pins;
} }

View File

@ -3,6 +3,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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.Style;
import de.neemann.digital.draw.graphics.Vector; import de.neemann.digital.draw.graphics.Vector;
import static de.neemann.digital.core.element.PinInfo.input;
/** /**
* @author hneemann * @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 RAD = new Vector(SIZE - 6, SIZE - 6);
public static final Vector RADL = new Vector(SIZE, SIZE); public static final Vector RADL = new Vector(SIZE, SIZE);
private final String label; private final String label;
private final PinDescription[] inputs;
private IOState ioState; private IOState ioState;
public OutputShape(ElementAttributes attr) { public OutputShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.inputs = inputs;
this.label = attr.getLabel(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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.Style;
import de.neemann.digital.draw.graphics.Vector; import de.neemann.digital.draw.graphics.Vector;
import static de.neemann.digital.core.element.PinInfo.input;
/** /**
* @author hneemann * @author hneemann
*/ */
public class ProbeShape implements Shape { public class ProbeShape implements Shape {
private final String label; private final String label;
private final PinDescription[] inputs;
private IOState ioState; private IOState ioState;
private int bits; private int bits;
public ProbeShape(ElementAttributes attr) { public ProbeShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
this.inputs = inputs;
this.label = attr.getLabel(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -2,12 +2,12 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.*; import de.neemann.digital.draw.graphics.*;
import static de.neemann.digital.core.element.PinInfo.output;
import static de.neemann.digital.draw.shapes.OutputShape.SIZE; 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 { public class ResetShape implements Shape {
private final String label; 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(); this.label = attr.getLabel();
} }
@Override @Override
public Pins getPins() { 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 @Override

View File

@ -3,7 +3,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; 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 { 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 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 Pins pins;
private ObservableValue input; private ObservableValue input;
private ObservableValue dp; private ObservableValue dp;
public SevenSegHexShape(ElementAttributes attr) { public SevenSegHexShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
super(attr); super(attr);
this.inputs = inputs;
} }
@Override @Override
@ -49,8 +51,8 @@ public class SevenSegHexShape extends SevenShape {
public Pins getPins() { public Pins getPins() {
if (pins == null) { if (pins == null) {
pins = new Pins() pins = new Pins()
.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), PinInfo.input("d"))) .add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), inputs[0]))
.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), PinInfo.input("dp"))); .add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), inputs[1]));
} }
return pins; return pins;
} }

View File

@ -3,38 +3,40 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.Style; import de.neemann.digital.draw.graphics.Style;
import de.neemann.digital.draw.graphics.Vector; 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; import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/** /**
* @author hneemann * @author hneemann
*/ */
public class SevenSegShape extends SevenShape { public class SevenSegShape extends SevenShape {
private final PinDescription[] inputPins;
private ObservableValue[] inputs; private ObservableValue[] inputs;
private Pins pins; private Pins pins;
public SevenSegShape(ElementAttributes attr) { public SevenSegShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
super(attr); super(attr);
this.inputPins = inputs;
} }
@Override @Override
public Pins getPins() { public Pins getPins() {
if (pins == null) { if (pins == null) {
pins = new Pins(); pins = new Pins();
pins.add(new Pin(new Vector(0, 0), input("a"))); pins.add(new Pin(new Vector(0, 0), inputPins[0]));
pins.add(new Pin(new Vector(SIZE, 0), input("b"))); pins.add(new Pin(new Vector(SIZE, 0), inputPins[1]));
pins.add(new Pin(new Vector(SIZE * 2, 0), input("c"))); pins.add(new Pin(new Vector(SIZE * 2, 0), inputPins[2]));
pins.add(new Pin(new Vector(SIZE * 3, 0), input("d"))); pins.add(new Pin(new Vector(SIZE * 3, 0), inputPins[3]));
pins.add(new Pin(new Vector(0, SIZE * HEIGHT), input("e"))); pins.add(new Pin(new Vector(0, SIZE * HEIGHT), inputPins[4]));
pins.add(new Pin(new Vector(SIZE, SIZE * HEIGHT), input("f"))); pins.add(new Pin(new Vector(SIZE, SIZE * HEIGHT), inputPins[5]));
pins.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), input("g"))); pins.add(new Pin(new Vector(SIZE * 2, SIZE * HEIGHT), inputPins[6]));
pins.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), input("dp"))); pins.add(new Pin(new Vector(SIZE * 3, SIZE * HEIGHT), inputPins[7]));
} }
return pins; return pins;
} }

View File

@ -16,6 +16,9 @@ public interface Shape extends Drawable {
* Puts the pins name and the pins x-y-position together! * Puts the pins name and the pins x-y-position together!
* This information is used to calculate the models connections * This information is used to calculate the models connections
* from the wiring in the circuit. * 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 * @return the pins
*/ */

View File

@ -32,13 +32,13 @@ public final class ShapeFactory {
map.put(NAnd.DESCRIPTION.getName(), new CreatorSimple("&", NAnd.DESCRIPTION, true)); map.put(NAnd.DESCRIPTION.getName(), new CreatorSimple("&", NAnd.DESCRIPTION, true));
map.put(NOr.DESCRIPTION.getName(), new CreatorSimple("\u22651", NOr.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(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(XOr.DESCRIPTION.getName(), new CreatorSimple("=1", XOr.DESCRIPTION, false));
map.put(XNOr.DESCRIPTION.getName(), new CreatorSimple("=1", XNOr.DESCRIPTION, true)); 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(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 -> new RAMShape("RAM", RAMSinglePort.DESCRIPTION.getInputNames(attr), outputInfos(RAMSinglePort.DESCRIPTION, 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(In.DESCRIPTION.getName(), InputShape::new);
map.put(Reset.DESCRIPTION.getName(), ResetShape::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(Break.DESCRIPTION.getName(), BreakShape::new);
map.put(Multiplexer.DESCRIPTION.getName(), MuxerShape::new); map.put(Multiplexer.DESCRIPTION.getName(), MuxerShape::new);
map.put(Demultiplexer.DESCRIPTION.getName(), attr -> new DemuxerShape(attr, true)); map.put(Demultiplexer.DESCRIPTION.getName(), DemuxerShape::new);
map.put(Decoder.DESCRIPTION.getName(), attr -> new DemuxerShape(attr, false)); map.put(Decoder.DESCRIPTION.getName(), DemuxerShape::new);
map.put(Splitter.DESCRIPTION.getName(), SplitterShape::new); map.put(Splitter.DESCRIPTION.getName(), SplitterShape::new);
map.put(Driver.DESCRIPTION.getName(), DriverShape::new); map.put(Driver.DESCRIPTION.getName(), DriverShape::new);
@ -64,10 +64,6 @@ public final class ShapeFactory {
map.put(DummyElement.TEXTDESCRIPTION.getName(), TextShape::new); 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. * Returns a shape matching the given name.
* If no shape is found, a special "missing shape" shape is returned. * 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; LibrarySelector.ElementTypeDescriptionCustom customDescr = (LibrarySelector.ElementTypeDescriptionCustom) pt;
return new GenericShape( return new GenericShape(
pt.getShortName(), pt.getShortName(),
pt.getInputNames(elementAttributes), pt.getInputDescription(elementAttributes),
outputInfos(pt, elementAttributes), pt.getOutputDescriptions(elementAttributes),
elementAttributes.get(AttributeKey.Label), elementAttributes.get(AttributeKey.Label),
true, true,
customDescr.getAttributes().get(AttributeKey.Width)); customDescr.getAttributes().get(AttributeKey.Width));
} else } else
return new GenericShape( return new GenericShape(
pt.getShortName(), pt.getShortName(),
pt.getInputNames(elementAttributes), pt.getInputDescription(elementAttributes),
outputInfos(pt, elementAttributes), pt.getOutputDescriptions(elementAttributes),
elementAttributes.get(AttributeKey.Label), elementAttributes.get(AttributeKey.Label),
true); true);
} }
} else } else {
return cr.create(elementAttributes); ElementTypeDescription pt = library.getElementType(elementName);
return cr.create(elementAttributes,
pt.getInputDescription(elementAttributes),
pt.getOutputDescriptions(elementAttributes));
}
} catch (Exception e) { } catch (Exception e) {
return new MissingShape(elementName, e); return new MissingShape(elementName, e);
} }
} }
private interface Creator { 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 @Override
public Shape create(ElementAttributes attributes) throws NodeException { public Shape create(ElementAttributes attributes, PinDescription[] inputs, PinDescription[] outputs) throws NodeException {
return new GenericShape(name, description.getInputNames(attributes), outputInfos(description, attributes)).invert(invers); return new GenericShape(name, inputs, outputs).invert(invers);
} }
} }
} }

View File

@ -23,11 +23,11 @@ public class SplitterShape implements Shape {
private final int length; private final int length;
private Pins pins; 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 inputDef = attr.get(AttributeKey.InputSplit);
String outputDef = attr.get(AttributeKey.OutputSplit); String outputDef = attr.get(AttributeKey.OutputSplit);
inputs = new Splitter.Ports(inputDef).getNames(PinDescription.Direction.input); this.inputs = new Splitter.Ports(inputDef).getNames(PinDescription.Direction.input);
outputs = new Splitter.Ports(outputDef).getNames(PinDescription.Direction.output); this.outputs = new Splitter.Ports(outputDef).getNames(PinDescription.Direction.output);
length = (Math.max(inputs.length, outputs.length) - 1) * SIZE + 2; length = (Math.max(inputs.length, outputs.length) - 1) * SIZE + 2;
} }

View File

@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer; import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.ElementAttributes; 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.IOState;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.*; import de.neemann.digital.draw.graphics.*;
@ -20,7 +21,7 @@ public class TextShape implements Shape {
* *
* @param attr attributes * @param attr attributes
*/ */
public TextShape(ElementAttributes attr) { public TextShape(ElementAttributes attr, PinDescription[] inputs, PinDescription[] outputs) {
String text = attr.getLabel(); String text = attr.getLabel();
if (text.length() == 0) if (text.length() == 0)
text = Lang.get("elem_Text"); text = Lang.get("elem_Text");

View File

@ -60,8 +60,14 @@ elem_Seven-Seg-Hex=Siebensegmentanzeige Hex
elem_Terminal=Terminal elem_Terminal=Terminal
elem_Data=Messwertgraph elem_Data=Messwertgraph
elem_Multiplexer=Multiplexer 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=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=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_Const=Konstante
elem_Splitter=Splitter elem_Splitter=Splitter
elem_Clock=Takt elem_Clock=Takt