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

View File

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

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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