diff --git a/src/main/java/de/neemann/digital/core/io/NotConnected.java b/src/main/java/de/neemann/digital/core/io/NotConnected.java new file mode 100644 index 000000000..289029b60 --- /dev/null +++ b/src/main/java/de/neemann/digital/core/io/NotConnected.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016 Helmut Neemann + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.core.io; + +import de.neemann.digital.core.Model; +import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.ObservableValues; +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.core.element.Keys; +import de.neemann.digital.lang.Lang; + +/** + * A constant + */ +public class NotConnected implements Element { + + /** + * The Constant description + */ + public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(NotConnected.class) + .addAttribute(Keys.BITS); + + private final ObservableValue output; + + /** + * Creates a new instance + * + * @param attributes the attributes + */ + public NotConnected(ElementAttributes attributes) { + output = new ObservableValue("out", attributes.get(Keys.BITS)).setPinDescription(DESCRIPTION); + output.setToHighZ(); + output.setConstant(); + } + + @Override + public void setInputs(ObservableValues inputs) throws NodeException { + throw new NodeException(Lang.get("err_noInputsAvailable")); + } + + @Override + public ObservableValues getOutputs() { + return output.asList(); + } + + @Override + public void registerNodes(Model model) { + } +} diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index 067e60ddc..77ca18822 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -162,7 +162,8 @@ public class ElementLibrary implements Iterable .add(DriverInvSel.DESCRIPTION) .add(Delay.DESCRIPTION) .add(PullUp.DESCRIPTION) - .add(PullDown.DESCRIPTION)) + .add(PullDown.DESCRIPTION) + .add(NotConnected.DESCRIPTION)) .add(new LibraryNode(Lang.get("lib_mux")) .add(Multiplexer.DESCRIPTION) .add(Demultiplexer.DESCRIPTION) diff --git a/src/main/java/de/neemann/digital/draw/model/Net.java b/src/main/java/de/neemann/digital/draw/model/Net.java index d4a75206e..7b84bbbfe 100644 --- a/src/main/java/de/neemann/digital/draw/model/Net.java +++ b/src/main/java/de/neemann/digital/draw/model/Net.java @@ -186,6 +186,14 @@ public class Net { value = new DataBus(this, m, outputs).getReadableOutput(); } + if (outputs.size() > 1) { + for (Pin o : outputs) { + ObservableValue ov = o.getValue(); + if (ov.isConstant() && ov.isHighZ()) + throw new PinException(Lang.get("err_notConnectedNotAllowed", o), this); + } + } + if (value == null) throw new PinException(Lang.get("err_output_N_notDefined", outputs.get(0)), this); diff --git a/src/main/java/de/neemann/digital/draw/shapes/NotConnectedShape.java b/src/main/java/de/neemann/digital/draw/shapes/NotConnectedShape.java new file mode 100644 index 000000000..b40602093 --- /dev/null +++ b/src/main/java/de/neemann/digital/draw/shapes/NotConnectedShape.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016 Helmut Neemann + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.draw.shapes; + +import de.neemann.digital.core.element.ElementAttributes; +import de.neemann.digital.core.element.PinDescriptions; +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.Graphic; +import de.neemann.digital.draw.graphics.Style; +import de.neemann.digital.draw.graphics.Vector; + +import static de.neemann.digital.draw.shapes.GenericShape.SIZE2; + +/** + * The ground shape + */ +public class NotConnectedShape implements Shape { + + private final PinDescriptions outputs; + + /** + * Creates a new instance + * + * @param attr the attributes + * @param inputs the inputs + * @param outputs the outputs + */ + public NotConnectedShape(ElementAttributes attr, PinDescriptions inputs, PinDescriptions outputs) { + this.outputs = outputs; + } + + @Override + public Pins getPins() { + return new Pins().add(new Pin(new Vector(0, 0), outputs.get(0))); + } + + @Override + public Interactor applyStateMonitor(IOState ioState) { + return null; + } + + @Override + public void drawTo(Graphic graphic, Style heighLight) { + int rad = SIZE2 / 5 * 3; + graphic.drawLine(new Vector(-rad, -rad), new Vector(rad, rad), Style.NORMAL); + graphic.drawLine(new Vector(-rad, rad), new Vector(rad, -rad), Style.NORMAL); + } +} diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java index 034c1cecc..7ebc141ca 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java @@ -105,6 +105,7 @@ public final class ShapeFactory { map.put(Const.DESCRIPTION.getName(), ConstShape::new); map.put(Ground.DESCRIPTION.getName(), GroundShape::new); map.put(VDD.DESCRIPTION.getName(), VDDShape::new); + map.put(NotConnected.DESCRIPTION.getName(), NotConnectedShape::new); map.put(Out.DESCRIPTION.getName(), OutputShape::new); map.put(Out.LEDDESCRIPTION.getName(), LEDShape::new); map.put(LightBulb.DESCRIPTION.getName(), LightBulbShape::new); diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 04c4f8c0b..d28d3cb40 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -334,6 +334,10 @@ Betriebsspannung Anschluss zur Betriebsspannung. Gibt immer Eins aus. Dieser Ausgang gibt immer 1 aus. + Nicht Verbunden + Kann verwendet werden, um eine Leitung auf High-Z zu legen. + Dieser Ausgang gibt immer High-Z aus. + Das Nicht-Verbunden Symbol ist hier nicht erlaubt! Konstante Ein Element, welches einen konstanten Wert ausgibt. Die Konstante kann über den Attribute-Dialog festgelegt werden. Gibt den gesetzten Wert als Konstante aus. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 5d941b3b8..3dab6f3b2 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -331,6 +331,10 @@ Supply voltage A connection to the supply voltage. Output is always one. This output always returns 1. + Not Connected + Can be used to set a wire to High-Z. + This output always outputs High-Z. + The NotConnected symbol is not allowed here! Constant value A component which returns a given value as a simple constant value. The value can be set in the attribute dialog. Returns the given value as a constant. diff --git a/src/test/resources/dig/backtrack/AllComponents.dig b/src/test/resources/dig/backtrack/AllComponents.dig index a28026765..a398569b6 100644 --- a/src/test/resources/dig/backtrack/AllComponents.dig +++ b/src/test/resources/dig/backtrack/AllComponents.dig @@ -663,6 +663,11 @@ + + NotConnected + + +