From 0bf50c38e9b55b295e04e5726e8e6e6da814e08b Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 27 Aug 2020 11:03:03 +0200 Subject: [PATCH] VHDL/Verilog support is mentioned in the documentation --- .../neemann/digital/core/arithmetic/Add.java | 3 ++- .../digital/core/arithmetic/BitExtender.java | 3 ++- .../digital/core/arithmetic/Comparator.java | 3 ++- .../neemann/digital/core/arithmetic/Mul.java | 3 ++- .../neemann/digital/core/arithmetic/Neg.java | 3 ++- .../neemann/digital/core/arithmetic/Sub.java | 3 ++- .../de/neemann/digital/core/basic/FanIn.java | 1 + .../de/neemann/digital/core/basic/Not.java | 3 ++- .../core/element/ElementTypeDescription.java | 25 ++++++++++++++++--- .../neemann/digital/core/extern/External.java | 3 ++- .../digital/core/flipflops/FlipflopD.java | 3 ++- .../core/flipflops/FlipflopDAsync.java | 3 ++- .../digital/core/flipflops/FlipflopJK.java | 3 ++- .../core/flipflops/FlipflopJKAsync.java | 3 ++- .../de/neemann/digital/core/io/Const.java | 3 ++- .../de/neemann/digital/core/io/Ground.java | 3 ++- .../java/de/neemann/digital/core/io/In.java | 3 ++- .../java/de/neemann/digital/core/io/Out.java | 3 ++- .../neemann/digital/core/io/PinControl.java | 3 ++- .../java/de/neemann/digital/core/io/VDD.java | 3 ++- .../digital/core/memory/BlockRAMDualPort.java | 3 ++- .../neemann/digital/core/memory/Counter.java | 3 ++- .../digital/core/memory/CounterPreset.java | 3 ++- .../digital/core/memory/LookUpTable.java | 3 ++- .../digital/core/memory/RAMDualAccess.java | 3 ++- .../digital/core/memory/RAMDualPort.java | 3 ++- .../de/neemann/digital/core/memory/ROM.java | 3 ++- .../neemann/digital/core/memory/Register.java | 3 ++- .../digital/core/memory/RegisterFile.java | 3 ++- .../digital/core/wiring/BitSelector.java | 3 ++- .../de/neemann/digital/core/wiring/Clock.java | 3 ++- .../neemann/digital/core/wiring/Decoder.java | 3 ++- .../digital/core/wiring/Demultiplexer.java | 3 ++- .../neemann/digital/core/wiring/Driver.java | 3 ++- .../digital/core/wiring/DriverInvSel.java | 3 ++- .../digital/core/wiring/Multiplexer.java | 3 ++- .../digital/core/wiring/PriorityEncoder.java | 3 ++- .../de/neemann/digital/core/wiring/Reset.java | 3 ++- .../neemann/digital/core/wiring/Splitter.java | 3 ++- .../neemann/digital/draw/elements/Tunnel.java | 3 ++- .../digital/hdl/model2/HDLCircuit.java | 2 +- .../hdl/vhdl2/entities/VHDLTemplate.java | 17 +++++++++++++ .../digital/testing/TestCaseElement.java | 3 ++- src/main/resources/lang/lang_de.xml | 5 +++- src/main/resources/lang/lang_en.xml | 5 +++- .../digital/hdl/TestHDLExportFlag.java | 24 ++++++++++++++++++ 46 files changed, 151 insertions(+), 45 deletions(-) create mode 100644 src/test/java/de/neemann/digital/hdl/TestHDLExportFlag.java diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Add.java b/src/main/java/de/neemann/digital/core/arithmetic/Add.java index 9c618f645..055ce43b4 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Add.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Add.java @@ -27,7 +27,8 @@ public class Add extends Node implements Element, Countable { = new ElementTypeDescription(Add.class, input("a"), input("b"), input("c_i")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .supportsHDL(); private final int bits; private final ObservableValue sum; diff --git a/src/main/java/de/neemann/digital/core/arithmetic/BitExtender.java b/src/main/java/de/neemann/digital/core/arithmetic/BitExtender.java index 8c6cbc113..825a51578 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/BitExtender.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/BitExtender.java @@ -28,7 +28,8 @@ public class BitExtender implements Element { .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) .addAttribute(Keys.INPUT_BITS) - .addAttribute(Keys.OUTPUT_BITS); + .addAttribute(Keys.OUTPUT_BITS) + .supportsHDL(); private final ObservableValue out; private final int outBits; diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java b/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java index 681ec5c02..a0b47a810 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java @@ -31,7 +31,8 @@ public class Comparator extends Node implements Element, Countable { .addAttribute(Keys.LABEL) .addAttribute(Keys.BITS) .addAttribute(Keys.SIGNED) - .setShortName(""); + .setShortName("") + .supportsHDL(); private final int bits; private final Boolean signed; diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Mul.java b/src/main/java/de/neemann/digital/core/arithmetic/Mul.java index 60d8b23cf..d74e6f1b4 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Mul.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Mul.java @@ -28,7 +28,8 @@ public class Mul extends Node implements Element, Countable { .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) .addAttribute(Keys.SIGNED) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .supportsHDL(); private final ObservableValue mul; private final int bits; diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Neg.java b/src/main/java/de/neemann/digital/core/arithmetic/Neg.java index 8ed3384a3..4a7513b0d 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Neg.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Neg.java @@ -27,7 +27,8 @@ public class Neg extends Node implements Element, Countable { */ public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Neg.class, input("in")) .addAttribute(Keys.ROTATE) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .supportsHDL(); private final ObservableValue output; private final int bits; diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Sub.java b/src/main/java/de/neemann/digital/core/arithmetic/Sub.java index 98efc923f..7b8c88c59 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Sub.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Sub.java @@ -23,7 +23,8 @@ public class Sub extends Add { = new ElementTypeDescription(Sub.class, input("a"), input("b"), input("c_i")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .supportsHDL(); /** * Creates a new instance diff --git a/src/main/java/de/neemann/digital/core/basic/FanIn.java b/src/main/java/de/neemann/digital/core/basic/FanIn.java index 0ef22388b..76fd17a50 100644 --- a/src/main/java/de/neemann/digital/core/basic/FanIn.java +++ b/src/main/java/de/neemann/digital/core/basic/FanIn.java @@ -84,6 +84,7 @@ public abstract class FanIn extends Node implements Element, Countable { FanInDescription(Class clazz) { super(clazz); addAttributes(); + supportsHDL(); } private void addAttributes() { diff --git a/src/main/java/de/neemann/digital/core/basic/Not.java b/src/main/java/de/neemann/digital/core/basic/Not.java index d26d908d2..1f478948c 100644 --- a/src/main/java/de/neemann/digital/core/basic/Not.java +++ b/src/main/java/de/neemann/digital/core/basic/Not.java @@ -28,7 +28,8 @@ public class Not extends Node implements Element, Countable { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Not.class, input("in")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.WIDE_SHAPE) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .supportsHDL(); private final ObservableValue output; private final int bits; diff --git a/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java b/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java index 21ef856e0..3aa825016 100644 --- a/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java +++ b/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java @@ -26,6 +26,7 @@ public class ElementTypeDescription { private ElementFactory elementFactory; private final PinDescriptions inputPins; private final ArrayList attributeList; + private boolean supportsHDL; /** * Creates a new ElementTypeDescription @@ -136,10 +137,11 @@ public class ElementTypeDescription { public String getDescription(ElementAttributes elementAttributes) { String d = Lang.getNull(langKey + "_tt"); if (d == null) { - return getTranslatedName(); - } else { - return d; + d = getTranslatedName(); } + if (supportsHDL) + d += " " + Lang.get("msg_supportsHDL"); + return d; } /** @@ -156,6 +158,23 @@ public class ElementTypeDescription { return this; } + /** + * Used to flag this elements as supporting hdl export + * + * @return this for chained calls + */ + public ElementTypeDescription supportsHDL() { + supportsHDL = true; + return this; + } + + /** + * @return true if the element supports export to HDL. + */ + public boolean isSupportsHDL() { + return supportsHDL; + } + /** * Returns the list of attributes which are used by this element. * diff --git a/src/main/java/de/neemann/digital/core/extern/External.java b/src/main/java/de/neemann/digital/core/extern/External.java index f745eff27..6df474c31 100644 --- a/src/main/java/de/neemann/digital/core/extern/External.java +++ b/src/main/java/de/neemann/digital/core/extern/External.java @@ -40,7 +40,8 @@ public class External extends Node implements Element { .addAttribute(Keys.EXTERNAL_OUTPUTS) .addAttribute(Keys.EXTERNAL_CODE) .addAttribute(Keys.APPLICATION_TYPE) - .addAttribute(Keys.GHDL_OPTIONS); + .addAttribute(Keys.GHDL_OPTIONS) + .supportsHDL(); private final Application.Type type; private final PortDefinition ins; diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java index d2844ef5e..5dfc900ee 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java @@ -31,7 +31,8 @@ public class FlipflopD extends Node implements Element, Countable { .addAttribute(Keys.LABEL) .addAttribute(Keys.DEFAULT) .addAttribute(Keys.INVERTER_CONFIG) - .addAttribute(Keys.VALUE_IS_PROBE); + .addAttribute(Keys.VALUE_IS_PROBE) + .supportsHDL(); private final int bits; private final boolean isProbe; diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopDAsync.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopDAsync.java index b7100bb2a..9fdf430f9 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopDAsync.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopDAsync.java @@ -33,7 +33,8 @@ public class FlipflopDAsync extends FlipflopD { .addAttribute(Keys.LABEL) .addAttribute(Keys.DEFAULT) .addAttribute(Keys.INVERTER_CONFIG) - .addAttribute(Keys.VALUE_IS_PROBE); + .addAttribute(Keys.VALUE_IS_PROBE) + .supportsHDL(); private ObservableValue setVal; private ObservableValue clrVal; diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java index 6de316326..2abd0f702 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java @@ -30,7 +30,8 @@ public class FlipflopJK extends FlipflopBit { .addAttribute(Keys.LABEL) .addAttribute(Keys.DEFAULT) .addAttribute(Keys.INVERTER_CONFIG) - .addAttribute(Keys.VALUE_IS_PROBE); + .addAttribute(Keys.VALUE_IS_PROBE) + .supportsHDL(); private ObservableValue jVal; private ObservableValue kVal; diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopJKAsync.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopJKAsync.java index de19ba372..93907edde 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopJKAsync.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopJKAsync.java @@ -36,7 +36,8 @@ public class FlipflopJKAsync extends FlipflopJK { .addAttribute(Keys.LABEL) .addAttribute(Keys.DEFAULT) .addAttribute(Keys.INVERTER_CONFIG) - .addAttribute(Keys.VALUE_IS_PROBE); + .addAttribute(Keys.VALUE_IS_PROBE) + .supportsHDL(); private ObservableValue setVal; private ObservableValue clrVal; diff --git a/src/main/java/de/neemann/digital/core/io/Const.java b/src/main/java/de/neemann/digital/core/io/Const.java index 73e9f8f46..4b4ba6170 100644 --- a/src/main/java/de/neemann/digital/core/io/Const.java +++ b/src/main/java/de/neemann/digital/core/io/Const.java @@ -27,7 +27,8 @@ public class Const implements Element { .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) .addAttribute(Keys.VALUE) - .addAttribute(Keys.INT_FORMAT); + .addAttribute(Keys.INT_FORMAT) + .supportsHDL(); private final ObservableValue output; diff --git a/src/main/java/de/neemann/digital/core/io/Ground.java b/src/main/java/de/neemann/digital/core/io/Ground.java index 78e32da05..fec539664 100644 --- a/src/main/java/de/neemann/digital/core/io/Ground.java +++ b/src/main/java/de/neemann/digital/core/io/Ground.java @@ -26,7 +26,8 @@ public class Ground implements Element { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Ground.class) .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) - .addAttribute(Keys.LABEL); + .addAttribute(Keys.LABEL) + .supportsHDL(); private final ObservableValue output; diff --git a/src/main/java/de/neemann/digital/core/io/In.java b/src/main/java/de/neemann/digital/core/io/In.java index f891ae77d..64b9213b6 100644 --- a/src/main/java/de/neemann/digital/core/io/In.java +++ b/src/main/java/de/neemann/digital/core/io/In.java @@ -39,7 +39,8 @@ public class In implements Element { .addAttribute(Keys.DESCRIPTION) .addAttribute(Keys.INT_FORMAT) .addAttribute(Keys.PINNUMBER) - .addAttribute(Keys.ADD_VALUE_TO_GRAPH); + .addAttribute(Keys.ADD_VALUE_TO_GRAPH) + .supportsHDL(); private final ObservableValue output; private final String label; diff --git a/src/main/java/de/neemann/digital/core/io/Out.java b/src/main/java/de/neemann/digital/core/io/Out.java index 6d1c1c0e8..f3676cd87 100644 --- a/src/main/java/de/neemann/digital/core/io/Out.java +++ b/src/main/java/de/neemann/digital/core/io/Out.java @@ -36,7 +36,8 @@ public class Out implements Element { .addAttribute(Keys.DESCRIPTION) .addAttribute(Keys.INT_FORMAT) .addAttribute(Keys.PINNUMBER) - .addAttribute(Keys.ADD_VALUE_TO_GRAPH); + .addAttribute(Keys.ADD_VALUE_TO_GRAPH) + .supportsHDL(); /** * The LED description diff --git a/src/main/java/de/neemann/digital/core/io/PinControl.java b/src/main/java/de/neemann/digital/core/io/PinControl.java index 040e56984..3fe86d901 100644 --- a/src/main/java/de/neemann/digital/core/io/PinControl.java +++ b/src/main/java/de/neemann/digital/core/io/PinControl.java @@ -27,7 +27,8 @@ public class PinControl extends Node implements Element { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(PinControl.class, input("wr"), input("oe")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) - .addAttribute(Keys.MIRROR); + .addAttribute(Keys.MIRROR) + .supportsHDL(); private final int bits; private final ObservableValue rdValue; diff --git a/src/main/java/de/neemann/digital/core/io/VDD.java b/src/main/java/de/neemann/digital/core/io/VDD.java index 3fff05102..ef905ed25 100644 --- a/src/main/java/de/neemann/digital/core/io/VDD.java +++ b/src/main/java/de/neemann/digital/core/io/VDD.java @@ -26,7 +26,8 @@ public class VDD implements Element { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(VDD.class) .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) - .addAttribute(Keys.LABEL); + .addAttribute(Keys.LABEL) + .supportsHDL(); private final ObservableValue output; diff --git a/src/main/java/de/neemann/digital/core/memory/BlockRAMDualPort.java b/src/main/java/de/neemann/digital/core/memory/BlockRAMDualPort.java index ad565b388..2614d3209 100644 --- a/src/main/java/de/neemann/digital/core/memory/BlockRAMDualPort.java +++ b/src/main/java/de/neemann/digital/core/memory/BlockRAMDualPort.java @@ -33,7 +33,8 @@ public class BlockRAMDualPort extends Node implements Element, RAMInterface { .addAttribute(Keys.BITS) .addAttribute(Keys.ADDR_BITS) .addAttribute(Keys.IS_PROGRAM_MEMORY) - .addAttribute(Keys.LABEL); + .addAttribute(Keys.LABEL) + .supportsHDL(); private DataField memory; private final ObservableValue output; diff --git a/src/main/java/de/neemann/digital/core/memory/Counter.java b/src/main/java/de/neemann/digital/core/memory/Counter.java index 89179f35d..c3ef06ae4 100644 --- a/src/main/java/de/neemann/digital/core/memory/Counter.java +++ b/src/main/java/de/neemann/digital/core/memory/Counter.java @@ -26,7 +26,8 @@ public class Counter extends Node implements Element, ProgramCounter { .addAttribute(Keys.INVERTER_CONFIG) .addAttribute(Keys.LABEL) .addAttribute(Keys.VALUE_IS_PROBE) - .addAttribute(Keys.IS_PROGRAM_COUNTER); + .addAttribute(Keys.IS_PROGRAM_COUNTER) + .supportsHDL(); private final ObservableValue out; private final ObservableValue ovf; diff --git a/src/main/java/de/neemann/digital/core/memory/CounterPreset.java b/src/main/java/de/neemann/digital/core/memory/CounterPreset.java index eae4b1450..fc307359f 100644 --- a/src/main/java/de/neemann/digital/core/memory/CounterPreset.java +++ b/src/main/java/de/neemann/digital/core/memory/CounterPreset.java @@ -36,7 +36,8 @@ public class CounterPreset extends Node implements Element, ProgramCounter { .addAttribute(Keys.INVERTER_CONFIG) .addAttribute(Keys.LABEL) .addAttribute(Keys.VALUE_IS_PROBE) - .addAttribute(Keys.IS_PROGRAM_COUNTER); + .addAttribute(Keys.IS_PROGRAM_COUNTER) + .supportsHDL(); private final ObservableValue out; private final ObservableValue ovf; diff --git a/src/main/java/de/neemann/digital/core/memory/LookUpTable.java b/src/main/java/de/neemann/digital/core/memory/LookUpTable.java index b42b6478d..16a9471bc 100644 --- a/src/main/java/de/neemann/digital/core/memory/LookUpTable.java +++ b/src/main/java/de/neemann/digital/core/memory/LookUpTable.java @@ -36,7 +36,8 @@ public class LookUpTable extends Node implements Element { .addAttribute(Keys.BITS) .addAttribute(Keys.INPUT_COUNT) .addAttribute(Keys.LABEL) - .addAttribute(Keys.DATA); + .addAttribute(Keys.DATA) + .supportsHDL(); private final DataField data; private final ObservableValue output; diff --git a/src/main/java/de/neemann/digital/core/memory/RAMDualAccess.java b/src/main/java/de/neemann/digital/core/memory/RAMDualAccess.java index cb3a090cc..3b5115e74 100644 --- a/src/main/java/de/neemann/digital/core/memory/RAMDualAccess.java +++ b/src/main/java/de/neemann/digital/core/memory/RAMDualAccess.java @@ -33,7 +33,8 @@ public class RAMDualAccess extends Node implements Element, RAMInterface { .addAttribute(Keys.BITS) .addAttribute(Keys.ADDR_BITS) .addAttribute(Keys.IS_PROGRAM_MEMORY) - .addAttribute(Keys.LABEL); + .addAttribute(Keys.LABEL) + .supportsHDL(); private final DataField memory; private final ObservableValue out1; diff --git a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java index f1e19ba66..fb3ae66a1 100644 --- a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java +++ b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java @@ -32,7 +32,8 @@ public class RAMDualPort extends Node implements Element, RAMInterface { .addAttribute(Keys.ADDR_BITS) .addAttribute(Keys.INT_FORMAT) .addAttribute(Keys.IS_PROGRAM_MEMORY) - .addAttribute(Keys.LABEL); + .addAttribute(Keys.LABEL) + .supportsHDL(); private DataField memory; private final IntFormat intFormat; diff --git a/src/main/java/de/neemann/digital/core/memory/ROM.java b/src/main/java/de/neemann/digital/core/memory/ROM.java index d6fc5f6f8..fdcacff3b 100644 --- a/src/main/java/de/neemann/digital/core/memory/ROM.java +++ b/src/main/java/de/neemann/digital/core/memory/ROM.java @@ -41,7 +41,8 @@ public class ROM extends Node implements Element, ROMInterface, ProgramMemory { .addAttribute(Keys.DATA) .addAttribute(Keys.INT_FORMAT) .addAttribute(Keys.IS_PROGRAM_MEMORY) - .addAttribute(Keys.AUTO_RELOAD_ROM); + .addAttribute(Keys.AUTO_RELOAD_ROM) + .supportsHDL(); private DataField data; private final IntFormat intFormat; diff --git a/src/main/java/de/neemann/digital/core/memory/Register.java b/src/main/java/de/neemann/digital/core/memory/Register.java index 99f23166c..7443031ac 100644 --- a/src/main/java/de/neemann/digital/core/memory/Register.java +++ b/src/main/java/de/neemann/digital/core/memory/Register.java @@ -29,7 +29,8 @@ public class Register extends Node implements Element, Countable, ProgramCounter .addAttribute(Keys.LABEL) .addAttribute(Keys.INVERTER_CONFIG) .addAttribute(Keys.IS_PROGRAM_COUNTER) - .addAttribute(Keys.VALUE_IS_PROBE); + .addAttribute(Keys.VALUE_IS_PROBE) + .supportsHDL(); private final int bits; private final boolean isProbe; diff --git a/src/main/java/de/neemann/digital/core/memory/RegisterFile.java b/src/main/java/de/neemann/digital/core/memory/RegisterFile.java index 582fc868c..453df3023 100644 --- a/src/main/java/de/neemann/digital/core/memory/RegisterFile.java +++ b/src/main/java/de/neemann/digital/core/memory/RegisterFile.java @@ -34,7 +34,8 @@ public class RegisterFile extends Node implements Element, RAMInterface { .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) .addAttribute(Keys.ADDR_BITS) - .addAttribute(Keys.LABEL); + .addAttribute(Keys.LABEL) + .supportsHDL(); private final DataField memory; private final ObservableValue out1; diff --git a/src/main/java/de/neemann/digital/core/wiring/BitSelector.java b/src/main/java/de/neemann/digital/core/wiring/BitSelector.java index bdd46bb1a..c3e4fd41b 100644 --- a/src/main/java/de/neemann/digital/core/wiring/BitSelector.java +++ b/src/main/java/de/neemann/digital/core/wiring/BitSelector.java @@ -29,7 +29,8 @@ public class BitSelector extends Node implements Element { input("sel")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.SELECTOR_BITS) - .addAttribute(Keys.FLIP_SEL_POSITON); + .addAttribute(Keys.FLIP_SEL_POSITON) + .supportsHDL(); private final ObservableValue output; private final int selBits; diff --git a/src/main/java/de/neemann/digital/core/wiring/Clock.java b/src/main/java/de/neemann/digital/core/wiring/Clock.java index 55e0bd6e9..0f04c29a7 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Clock.java +++ b/src/main/java/de/neemann/digital/core/wiring/Clock.java @@ -24,7 +24,8 @@ public class Clock implements Element { .addAttribute(Keys.LABEL) .addAttribute(Keys.RUN_AT_REAL_TIME) .addAttribute(Keys.FREQUENCY) - .addAttribute(Keys.PINNUMBER); + .addAttribute(Keys.PINNUMBER) + .supportsHDL(); private final ObservableValue output; private final int frequency; diff --git a/src/main/java/de/neemann/digital/core/wiring/Decoder.java b/src/main/java/de/neemann/digital/core/wiring/Decoder.java index e2cc31425..fbcc39afc 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Decoder.java +++ b/src/main/java/de/neemann/digital/core/wiring/Decoder.java @@ -40,7 +40,8 @@ public class Decoder extends Node implements Element, Countable { input("sel")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.SELECTOR_BITS) - .addAttribute(Keys.FLIP_SEL_POSITON); + .addAttribute(Keys.FLIP_SEL_POSITON) + .supportsHDL(); /** * Creates a new instance diff --git a/src/main/java/de/neemann/digital/core/wiring/Demultiplexer.java b/src/main/java/de/neemann/digital/core/wiring/Demultiplexer.java index 1a31ae8d1..0543aee06 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Demultiplexer.java +++ b/src/main/java/de/neemann/digital/core/wiring/Demultiplexer.java @@ -46,7 +46,8 @@ public class Demultiplexer extends Node implements Element, Countable { .addAttribute(Keys.BITS) .addAttribute(Keys.SELECTOR_BITS) .addAttribute(Keys.FLIP_SEL_POSITON) - .addAttribute(Keys.DEFAULT); + .addAttribute(Keys.DEFAULT) + .supportsHDL(); /** * Creates a new instance diff --git a/src/main/java/de/neemann/digital/core/wiring/Driver.java b/src/main/java/de/neemann/digital/core/wiring/Driver.java index 5360a91fd..d37ad96c6 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Driver.java +++ b/src/main/java/de/neemann/digital/core/wiring/Driver.java @@ -30,7 +30,8 @@ public class Driver extends Node implements Element, Countable { input("sel")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) - .addAttribute(Keys.FLIP_SEL_POSITON); + .addAttribute(Keys.FLIP_SEL_POSITON) + .supportsHDL(); private final ObservableValue output; private final int bits; diff --git a/src/main/java/de/neemann/digital/core/wiring/DriverInvSel.java b/src/main/java/de/neemann/digital/core/wiring/DriverInvSel.java index 2181b3e7b..38a689432 100644 --- a/src/main/java/de/neemann/digital/core/wiring/DriverInvSel.java +++ b/src/main/java/de/neemann/digital/core/wiring/DriverInvSel.java @@ -24,7 +24,8 @@ public class DriverInvSel extends Driver { input("sel")) .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) - .addAttribute(Keys.FLIP_SEL_POSITON); + .addAttribute(Keys.FLIP_SEL_POSITON) + .supportsHDL(); /** * Creates a new instance diff --git a/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java b/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java index 7238d82c5..8702d87d4 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java +++ b/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java @@ -41,7 +41,8 @@ public class Multiplexer extends FanIn { .addAttribute(Keys.ROTATE) .addAttribute(Keys.BITS) .addAttribute(Keys.SELECTOR_BITS) - .addAttribute(Keys.FLIP_SEL_POSITON); + .addAttribute(Keys.FLIP_SEL_POSITON) + .supportsHDL(); /** * Creates a new instance diff --git a/src/main/java/de/neemann/digital/core/wiring/PriorityEncoder.java b/src/main/java/de/neemann/digital/core/wiring/PriorityEncoder.java index c0ffb991d..48db9d967 100644 --- a/src/main/java/de/neemann/digital/core/wiring/PriorityEncoder.java +++ b/src/main/java/de/neemann/digital/core/wiring/PriorityEncoder.java @@ -36,7 +36,8 @@ public class PriorityEncoder extends Node implements Element, Countable { } .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) - .addAttribute(Keys.SELECTOR_BITS); + .addAttribute(Keys.SELECTOR_BITS) + .supportsHDL(); private final ObservableValue selOut; diff --git a/src/main/java/de/neemann/digital/core/wiring/Reset.java b/src/main/java/de/neemann/digital/core/wiring/Reset.java index 17972d460..20c4e5f35 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Reset.java +++ b/src/main/java/de/neemann/digital/core/wiring/Reset.java @@ -26,7 +26,8 @@ public class Reset implements Element { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription("Reset", Reset.class) .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) - .addAttribute(Keys.INVERT_OUTPUT); + .addAttribute(Keys.INVERT_OUTPUT) + .supportsHDL(); private final ObservableValue output; private final boolean invOut; diff --git a/src/main/java/de/neemann/digital/core/wiring/Splitter.java b/src/main/java/de/neemann/digital/core/wiring/Splitter.java index 366d5eecc..526797712 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Splitter.java +++ b/src/main/java/de/neemann/digital/core/wiring/Splitter.java @@ -58,7 +58,8 @@ public class Splitter implements Element { .addAttribute(Keys.INPUT_SPLIT) .addAttribute(Keys.OUTPUT_SPLIT) .addAttribute(Keys.SPLITTER_SPREADING) - .setShortName(""); + .setShortName("") + .supportsHDL(); private final ObservableValues outputs; private final Ports inPorts; diff --git a/src/main/java/de/neemann/digital/draw/elements/Tunnel.java b/src/main/java/de/neemann/digital/draw/elements/Tunnel.java index 753a58384..330c6d63a 100644 --- a/src/main/java/de/neemann/digital/draw/elements/Tunnel.java +++ b/src/main/java/de/neemann/digital/draw/elements/Tunnel.java @@ -27,7 +27,8 @@ public class Tunnel implements Element { public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Tunnel.class, input("in")) .addAttribute(Keys.ROTATE) - .addAttribute(Keys.NETNAME); + .addAttribute(Keys.NETNAME) + .supportsHDL(); private final String label; diff --git a/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java b/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java index 71fcb2273..2a9ce07c0 100644 --- a/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java +++ b/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java @@ -48,9 +48,9 @@ public class HDLCircuit implements Iterable, HDLModel.BitProvider, Prin private final ArrayList listOfNets; private final String description; private final File origin; + private final ArrayList nodes; private ArrayList ports; private NetList netList; - private ArrayList nodes; private HashMap nets; private String hdlEntityName; diff --git a/src/main/java/de/neemann/digital/hdl/vhdl2/entities/VHDLTemplate.java b/src/main/java/de/neemann/digital/hdl/vhdl2/entities/VHDLTemplate.java index 4fd7da481..b4f27c739 100644 --- a/src/main/java/de/neemann/digital/hdl/vhdl2/entities/VHDLTemplate.java +++ b/src/main/java/de/neemann/digital/hdl/vhdl2/entities/VHDLTemplate.java @@ -5,6 +5,7 @@ */ package de.neemann.digital.hdl.vhdl2.entities; +import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.hdl.hgs.*; import de.neemann.digital.hdl.hgs.function.JavaClass; import de.neemann.digital.hdl.model2.HDLNode; @@ -13,6 +14,7 @@ import de.neemann.digital.hdl.vhdl2.Separator; import de.neemann.digital.lang.Lang; import java.io.IOException; +import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -49,6 +51,21 @@ public class VHDLTemplate implements VHDLEntity { return "vhdl/" + name + ".tem"; } + /** + * Returns true, if a hdl template is available. + * + * @param etd the {@link ElementTypeDescription} + * @return true if VHDL template is available + */ + public static boolean isTemplate(ElementTypeDescription etd) { + ClassLoader cl = etd.getClassLoader(); + if (cl == null) + cl = ClassLoader.getSystemClassLoader(); + URL url = cl.getResource(createFileName(ENTITY_PREFIX + etd.getName())); + return url != null; + } + + /** * Creates the name of the file used to load the vhdl file for the given element * diff --git a/src/main/java/de/neemann/digital/testing/TestCaseElement.java b/src/main/java/de/neemann/digital/testing/TestCaseElement.java index 0940bd8f2..1106ea7f9 100644 --- a/src/main/java/de/neemann/digital/testing/TestCaseElement.java +++ b/src/main/java/de/neemann/digital/testing/TestCaseElement.java @@ -27,7 +27,8 @@ public class TestCaseElement implements Element { = new ElementTypeDescription("Testcase", TestCaseElement.class) .addAttribute(Keys.LABEL) .addAttribute(TESTDATA) - .addAttribute(Keys.ENABLED); + .addAttribute(Keys.ENABLED) + .supportsHDL(); /** * creates a new instance diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 8682229ef..ecfbb5ba0 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -1955,12 +1955,15 @@ Stellen Sie sicher, dass der Flash-Vorgang abgeschlossen ist, bevor Sie diesen D Netz umbenennen Es gibt noch {0} weitere Tunnel mit dem Netznamen ''{1}''. - Sollen alle {0} zu ''{2}'' umbenannt werden? + Sollen alle {0} zu ''{2}'' umbenannt werden? + Sollen die Änderungen im Feld "{0}" wirklich verworfen werden? Zwischenablage Kopiert den Text in die Zwischenablage. + Exportierbar zu VHDL/Verilog. + Ok 180° diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index cb9ca69ab..57fdbeba8 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -1910,10 +1910,13 @@ Make sure the flash process is complete before closing this dialog! Rename Net There are {0} more tunnels with the net name ''{1}''. - Do you want to rename all {0} to ''{2}''? + Do you want to rename all {0} to ''{2}''? + Do you really want to discard the changes in the "{0}" field? + Exportable to VHDL/Verilog. + Video mode was not detected ({0}) OK diff --git a/src/test/java/de/neemann/digital/hdl/TestHDLExportFlag.java b/src/test/java/de/neemann/digital/hdl/TestHDLExportFlag.java new file mode 100644 index 000000000..6d1f4cec0 --- /dev/null +++ b/src/test/java/de/neemann/digital/hdl/TestHDLExportFlag.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2020 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.hdl; + +import de.neemann.digital.core.element.ElementTypeDescription; +import de.neemann.digital.draw.library.ElementLibrary; +import de.neemann.digital.hdl.vhdl2.entities.VHDLTemplate; +import junit.framework.TestCase; + +public class TestHDLExportFlag extends TestCase { + + public void testHDLExportFlag() { + ElementLibrary lib = new ElementLibrary(); + for (ElementLibrary.ElementContainer ec : lib) { + ElementTypeDescription etd = ec.getDescription(); + boolean hdlExportFlag = etd.isSupportsHDL(); + if (VHDLTemplate.isTemplate(etd)) + assertTrue("HDL template available for " + etd.getName(), hdlExportFlag); + } + } +}