From eeaa3c4f5f49972328b03235501907e3d6d06d9c Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 15 Jul 2017 17:00:22 +0200 Subject: [PATCH] added a power supply --- .../neemann/digital/core/io/PowerSupply.java | 54 +++++++++++++++++++ .../digital/draw/elements/VisualElement.java | 15 ++++++ .../digital/draw/library/ElementLibrary.java | 1 + .../java/de/neemann/digital/gui/Main.java | 38 +++++++++++++ .../gui/components/CircuitComponent.java | 28 ++++++++++ .../gui/components/CircuitTransferable.java | 16 +----- src/main/resources/lang/lang_de.xml | 11 ++++ src/main/resources/lang/lang_en.xml | 9 ++++ .../digital/integration/TestExamples.java | 2 +- src/test/resources/dig/test/power/power.dig | 40 ++++++++++++++ .../resources/dig/test/power/power1Error.dig | 35 ++++++++++++ .../resources/dig/test/power/power2Error.dig | 35 ++++++++++++ .../resources/dig/test/power/power3Error.dig | 44 +++++++++++++++ .../resources/dig/test/power/power4Error.dig | 49 +++++++++++++++++ 14 files changed, 361 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/neemann/digital/core/io/PowerSupply.java create mode 100644 src/test/resources/dig/test/power/power.dig create mode 100644 src/test/resources/dig/test/power/power1Error.dig create mode 100644 src/test/resources/dig/test/power/power2Error.dig create mode 100644 src/test/resources/dig/test/power/power3Error.dig create mode 100644 src/test/resources/dig/test/power/power4Error.dig diff --git a/src/main/java/de/neemann/digital/core/io/PowerSupply.java b/src/main/java/de/neemann/digital/core/io/PowerSupply.java new file mode 100644 index 000000000..f9e41cf27 --- /dev/null +++ b/src/main/java/de/neemann/digital/core/io/PowerSupply.java @@ -0,0 +1,54 @@ +package de.neemann.digital.core.io; + +import de.neemann.digital.core.*; +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.draw.elements.PinException; +import de.neemann.digital.lang.Lang; + +import static de.neemann.digital.core.element.PinInfo.input; + +/** + * Enforces a power supply + * Created by hneemann on 15.07.17. + */ +public class PowerSupply implements Element { + + /** + * Enforces a power supply + */ + public static final ElementTypeDescription DESCRIPTION + = new ElementTypeDescription(PowerSupply.class, input("VDD"), input("GND")) + .addAttribute(Keys.ROTATE) + .addAttribute(Keys.LABEL); + + /** + * Creates a new instance + * + * @param attributes attributes + */ + public PowerSupply(ElementAttributes attributes) { + } + + @Override + public void setInputs(ObservableValues inputs) throws NodeException { + check(inputs.get(0).checkBits(1, null, 0), 1); + check(inputs.get(1).checkBits(1, null, 1), 0); + } + + private void check(ObservableValue val, int expected) throws NodeException { + if (!val.isConstant() || val.getValue() != expected) + throw new NodeException(Lang.get("err_errorInPowerSupply"), val); + } + + @Override + public ObservableValues getOutputs() throws PinException { + return ObservableValues.EMPTY_LIST; + } + + @Override + public void registerNodes(Model model) { + } +} diff --git a/src/main/java/de/neemann/digital/draw/elements/VisualElement.java b/src/main/java/de/neemann/digital/draw/elements/VisualElement.java index f9cc5932a..4e767dd2f 100644 --- a/src/main/java/de/neemann/digital/draw/elements/VisualElement.java +++ b/src/main/java/de/neemann/digital/draw/elements/VisualElement.java @@ -74,6 +74,21 @@ public class VisualElement implements Drawable, Movable, AttributeListener { return elementName; } + /** + * Sets a key. + * Use only to construct an instance. + * Don't use this function to modify an existing instance! + * + * @param key the key + * @param val the value to set + * @param the type of the value + * @return this for chained calls + */ + public VisualElement setAttribute(Key key, V val) { + elementAttributes.set(key, val); + return this; + } + /** * @return the elements attributes */ 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 d7d50492f..343312e39 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -137,6 +137,7 @@ public class ElementLibrary implements Iterable .add(TransGate.DESCRIPTION)) .add(new LibraryNode(Lang.get("lib_misc")) .add(TestCaseElement.TESTCASEDESCRIPTION) + .add(PowerSupply.DESCRIPTION) .add(Reset.DESCRIPTION) .add(Break.DESCRIPTION)); diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index eadd46e66..8cd43b03e 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -10,6 +10,7 @@ import de.neemann.digital.core.element.Key; import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.io.In; import de.neemann.digital.core.io.Out; +import de.neemann.digital.core.io.PowerSupply; import de.neemann.digital.core.memory.ROM; import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.draw.elements.*; @@ -63,6 +64,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; +import static de.neemann.digital.draw.shapes.GenericShape.SIZE; import static javax.swing.JOptionPane.showInputDialog; /** @@ -709,6 +711,42 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS } } }.setToolTip(Lang.get("menu_removePinNumbers_tt")).createJMenuItem()); + + special.add(new ToolTipAction(Lang.get("menu_addPowerSupply")) { + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (!circuitComponent.isLocked()) { + int maxNum = 0; + for (VisualElement v : circuitComponent.getCircuit().getElements()) { + if (v.equalsDescription(In.DESCRIPTION) || v.equalsDescription(Out.DESCRIPTION)) + maxNum = Math.max(maxNum, v.getElementAttributes().get(Keys.PINNUMBER)); + } + if ((maxNum & 1) != 0) maxNum++; + + // defines the power supply circuit + ArrayList list = new ArrayList<>(); + list.add(new VisualElement(PowerSupply.DESCRIPTION.getName()) + .setShapeFactory(shapeFactory) + .setPos(new Vector(SIZE * 2, 0))); + list.add(new VisualElement(In.DESCRIPTION.getName()) + .setShapeFactory(shapeFactory) + .setAttribute(Keys.LABEL, "VDD") + .setAttribute(Keys.PINNUMBER, maxNum) + .setPos(new Vector(0, 0))); + list.add(new VisualElement(In.DESCRIPTION.getName()) + .setShapeFactory(shapeFactory) + .setAttribute(Keys.LABEL, "GND") + .setAttribute(Keys.PINNUMBER, maxNum / 2) + .setPos(new Vector(0, SIZE * 2))); + list.add(new Wire(new Vector(0, 0), new Vector(SIZE * 2, 0))); + list.add(new Wire(new Vector(0, SIZE * 2), new Vector(SIZE, SIZE * 2))); + list.add(new Wire(new Vector(SIZE, SIZE * 2), new Vector(SIZE, SIZE))); + list.add(new Wire(new Vector(SIZE, SIZE), new Vector(SIZE * 2, SIZE))); + circuitComponent.setPartsToInsert(list); + } + } + }.setToolTip(Lang.get("menu_addPowerSupply_tt")).createJMenuItem()); + return special; } diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index 59ff1c488..a6cbc6b98 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -653,6 +653,17 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe } } + /** + * Adds the given list of elements to insert to the circuit + * + * @param elements the list of elements to insert + */ + public void setPartsToInsert(ArrayList elements) { + parent.ensureModelIsStopped(); + mouseInsertList.activate(elements, getPosVector(lastMousePos.x, lastMousePos.y)); + repaintNeeded(); + } + private BufferedImage buffer; private int highlightedPaintedSize; @@ -1732,6 +1743,23 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe super.activate(); this.elements = elements; lastPos = pos; + + Vector max = null; + for (Movable m : elements) + if (m instanceof VisualElement) { + GraphicMinMax mm = ((VisualElement) m).getMinMax(false); + if (max == null) + max = mm.getMax(); + else + max = Vector.max(max, mm.getMax()); + } + + if (max != null) { + Vector delta = CircuitComponent.raster(lastPos.sub(max)); + for (Movable m : elements) + m.move(delta); + } + deleteAction.setActive(true); rotateAction.setEnabled(true); } diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitTransferable.java b/src/main/java/de/neemann/digital/gui/components/CircuitTransferable.java index 4dc1a27c6..cc441cc0f 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitTransferable.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitTransferable.java @@ -5,7 +5,6 @@ import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.Movable; import de.neemann.digital.draw.elements.VisualElement; -import de.neemann.digital.draw.graphics.GraphicMinMax; import de.neemann.digital.draw.graphics.Vector; import de.neemann.digital.draw.shapes.ShapeFactory; @@ -74,27 +73,14 @@ public class CircuitTransferable implements Transferable { return null; XStream xStream = Circuit.getxStream(); - Vector max = null; try (Reader in = new StringReader(data.toString())) { ArrayList elements = (ArrayList) xStream.fromXML(in); if (elements == null) return null; for (Movable m : elements) - if (m instanceof VisualElement) { + if (m instanceof VisualElement) ((VisualElement) m).setShapeFactory(shapeFactory); - GraphicMinMax mm = ((VisualElement) m).getMinMax(false); - if (max == null) - max = mm.getMax(); - else - max = Vector.max(max, mm.getMax()); - } - - if (max != null) { - Vector delta = CircuitComponent.raster(lastMousePos.sub(max)); - for (Movable m : elements) - m.move(delta); - } return elements; } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index a1020120f..b8a2d16de 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -449,6 +449,14 @@ Die gesammte Speichergröße beträgt damit damit dx*dy*2 Speicherworte.Anschluss Anschluss + Versorgung + Hat keine weitere Funktion. Stellt nur sicher, dass VDD und GND angeschlossen sind. + Kann im Zusammenhang mit den 74xx Bausteinen verwendet werden, um Anschlüsse für die Spannungsversorgung + zu erzeugen, welche dann auch auf korrekte Beschaltung geprüft werden. + Muss mit VDD verbunden werden! + Muss mit GND verbunden werden! + + Fehler Pin {0} in Element {1} ist werder Eingang noch Ausgang Es muss genau ein Taktelement geben. Alle Flipflops müssen an diesem Takt hängen. @@ -547,6 +555,7 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Signal {0} wurde mehrfach verwendet! Fehler beim Einlesen der Testdaten. Die Modelkomponente {0} kann nicht analysiert werden. + Fehler in der Stromversorgung. Adress-Bits Anzahl der Adress-Bits die verwendet werden. @@ -890,6 +899,8 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Zeigt die Daten als Graph an. Zeige Tabelle Zeigt die Daten als Tabelle an. + Spannungsversorung ergänzen + Erweitert die Schaltung um eine Spannungsversorung. Digital diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 50604a0f1..3d0b0f9ca 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -439,6 +439,12 @@ Connection Connection + Power + Has no function. Makes sure that VDD and GND are connected. + Can be used in 74xx circuits to generate the pins for the voltage supply, which are tested for correct wiring. + Must be connected to VDD! + Must be connected to GND! + Error Pin {0} in component {1} is not a input or output A single clock component is necessary. All flip-flops must use this clock signal. @@ -537,6 +543,7 @@ The names of the variables may not be unique. Signal {0} is used twice! Error parsing the test data. The model component {0} can not be analysed. + Error in wiring of power supply. Address Bits Number of address bits used. @@ -878,6 +885,8 @@ The names of the variables may not be unique. Show the data as a Graph. Show table Shows values as a table. + Add power supply + Adds a power supply to the circuit. Digital diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java index a474ee3ab..51ec998fc 100644 --- a/src/test/java/de/neemann/digital/integration/TestExamples.java +++ b/src/test/java/de/neemann/digital/integration/TestExamples.java @@ -39,7 +39,7 @@ public class TestExamples extends TestCase { */ public void testTestExamples() throws Exception { File examples = new File(Resources.getRoot(), "/dig/test"); - assertEquals(80, new FileScanner(this::check).scan(examples)); + assertEquals(85, new FileScanner(this::check).scan(examples)); assertEquals(74, testCasesInFiles); } diff --git a/src/test/resources/dig/test/power/power.dig b/src/test/resources/dig/test/power/power.dig new file mode 100644 index 000000000..96899a66a --- /dev/null +++ b/src/test/resources/dig/test/power/power.dig @@ -0,0 +1,40 @@ + + + 1 + + + + PowerSupply + + + + + Ground + + + + + VDD + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/dig/test/power/power1Error.dig b/src/test/resources/dig/test/power/power1Error.dig new file mode 100644 index 000000000..ba24d9011 --- /dev/null +++ b/src/test/resources/dig/test/power/power1Error.dig @@ -0,0 +1,35 @@ + + + 1 + + + + PowerSupply + + + + + VDD + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/dig/test/power/power2Error.dig b/src/test/resources/dig/test/power/power2Error.dig new file mode 100644 index 000000000..db13155d1 --- /dev/null +++ b/src/test/resources/dig/test/power/power2Error.dig @@ -0,0 +1,35 @@ + + + 1 + + + + PowerSupply + + + + + Ground + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/dig/test/power/power3Error.dig b/src/test/resources/dig/test/power/power3Error.dig new file mode 100644 index 000000000..fa9ca34c0 --- /dev/null +++ b/src/test/resources/dig/test/power/power3Error.dig @@ -0,0 +1,44 @@ + + + 1 + + + + PowerSupply + + + + + Ground + + + + + Not + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/dig/test/power/power4Error.dig b/src/test/resources/dig/test/power/power4Error.dig new file mode 100644 index 000000000..b7e4cad6d --- /dev/null +++ b/src/test/resources/dig/test/power/power4Error.dig @@ -0,0 +1,49 @@ + + + 1 + + + + PowerSupply + + + + + Ground + + + + + VDD + + + + + Delay + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file