diff --git a/src/main/dig/generic/gray/GrayCounter.dig b/src/main/dig/generic/gray/GrayCounter.dig
index 7d76ae064..734c6184a 100644
--- a/src/main/dig/generic/gray/GrayCounter.dig
+++ b/src/main/dig/generic/gray/GrayCounter.dig
@@ -47,8 +47,19 @@ C 0
+
+ generic
+ ?>C G
+0 0
+loop (n,(1<< <?=args.bits?> )-1)
+C ((n+1) ^ ((n+1)>>1))
+end loop
+C 0<?
+
+this.Testdata=output();
+
-
+
Text
@@ -153,7 +164,7 @@ if (args.bits>3) {
bits := 3;
-
+
diff --git a/src/main/java/de/neemann/digital/cli/CommandLineTester.java b/src/main/java/de/neemann/digital/cli/CommandLineTester.java
index 55fab611a..7bc3432d9 100644
--- a/src/main/java/de/neemann/digital/cli/CommandLineTester.java
+++ b/src/main/java/de/neemann/digital/cli/CommandLineTester.java
@@ -10,17 +10,14 @@ import de.neemann.digital.cli.cli.BasicCommand;
import de.neemann.digital.cli.cli.CLIException;
import de.neemann.digital.core.ErrorDetector;
import de.neemann.digital.core.Model;
-import de.neemann.digital.core.element.Keys;
import de.neemann.digital.draw.elements.Circuit;
-import de.neemann.digital.draw.elements.VisualElement;
import de.neemann.digital.lang.Lang;
-import de.neemann.digital.testing.TestCaseDescription;
import de.neemann.digital.testing.TestExecutor;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
-import java.util.ArrayList;
+import java.util.List;
/**
* Tester used from the command line
@@ -28,7 +25,7 @@ import java.util.ArrayList;
public class CommandLineTester {
private final CircuitLoader circuitLoader;
- private ArrayList testCases;
+ private List testCases;
private int testsPassed;
private boolean allowMissingInputs;
@@ -51,19 +48,10 @@ public class CommandLineTester {
*/
public CommandLineTester useTestCasesFrom(File file) throws IOException {
Circuit c = Circuit.loadCircuit(file, circuitLoader.getShapeFactory());
- testCases = getTestCasesFrom(c);
+ testCases = c.getTestCases();
return this;
}
- private ArrayList getTestCasesFrom(Circuit circuit) {
- ArrayList tsl = new ArrayList<>();
- for (VisualElement el : circuit.getTestCases())
- tsl.add(new TestCase(
- el.getElementAttributes().get(Keys.TESTDATA),
- el.getElementAttributes().getLabel()));
- return tsl;
- }
-
/**
* Executes test test
*
@@ -72,7 +60,7 @@ public class CommandLineTester {
*/
public int execute(PrintStream out) {
if (testCases == null)
- testCases = getTestCasesFrom(circuitLoader.getCircuit());
+ testCases = circuitLoader.getCircuit().getTestCases();
int errorCount = 0;
@@ -80,7 +68,7 @@ public class CommandLineTester {
out.println("no test cases given");
errorCount++;
} else {
- for (TestCase t : testCases) {
+ for (Circuit.TestCase t : testCases) {
String label = t.getLabel();
if (label.isEmpty())
label = "unnamed";
@@ -123,24 +111,6 @@ public class CommandLineTester {
return testsPassed;
}
- private static final class TestCase {
- private final TestCaseDescription testCaseDescription;
- private final String label;
-
- private TestCase(TestCaseDescription testCaseDescription, String label) {
- this.testCaseDescription = testCaseDescription;
- this.label = label;
- }
-
- private TestCaseDescription getTestCaseDescription() {
- return testCaseDescription;
- }
-
- private String getLabel() {
- return label;
- }
- }
-
private CommandLineTester setAllowMissingInputs(boolean allowMissingInputs) {
this.allowMissingInputs = allowMissingInputs;
return this;
diff --git a/src/main/java/de/neemann/digital/draw/elements/Circuit.java b/src/main/java/de/neemann/digital/draw/elements/Circuit.java
index c9c3ef809..ee5ac4187 100644
--- a/src/main/java/de/neemann/digital/draw/elements/Circuit.java
+++ b/src/main/java/de/neemann/digital/draw/elements/Circuit.java
@@ -348,8 +348,41 @@ public class Circuit implements Copyable {
*
* @return the test case elements
*/
- public List getTestCases() {
- return getElements(v -> v.equalsDescription(TestCaseElement.TESTCASEDESCRIPTION) && v.getElementAttributes().get(Keys.ENABLED));
+ public List getTestCases() {
+ ArrayList tc = new ArrayList<>();
+ for (VisualElement ve : getElements(v -> v.equalsDescription(TestCaseElement.TESTCASEDESCRIPTION) && v.getElementAttributes().get(Keys.ENABLED))) {
+ tc.add(new TestCase(
+ ve.getElementAttributes().getLabel(),
+ new TestCaseDescription(ve.getElementAttributes().get(Keys.TESTDATA))));
+ }
+ return tc;
+ }
+
+ /**
+ * A simple java bean to encapsulate a test case description
+ */
+ public static final class TestCase {
+ private final String label;
+ private final TestCaseDescription testCaseDescription;
+
+ private TestCase(String label, TestCaseDescription testCaseDescription) {
+ this.label = label;
+ this.testCaseDescription = testCaseDescription;
+ }
+
+ /**
+ * @return the label of the test case
+ */
+ public String getLabel() {
+ return label;
+ }
+
+ /**
+ * @return the test case description
+ */
+ public TestCaseDescription getTestCaseDescription() {
+ return testCaseDescription;
+ }
}
/**
diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java
index d38fe2ec6..e22afd582 100644
--- a/src/main/java/de/neemann/digital/gui/Main.java
+++ b/src/main/java/de/neemann/digital/gui/Main.java
@@ -1128,10 +1128,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
public void startTests() {
try {
ArrayList tsl = new ArrayList<>();
- for (VisualElement el : circuitComponent.getCircuit().getTestCases())
- tsl.add(new ValueTableDialog.TestSet(
- el.getElementAttributes().get(Keys.TESTDATA),
- el.getElementAttributes().getLabel()));
+ for (Circuit.TestCase tc : circuitComponent.getCircuit().getTestCases())
+ tsl.add(new ValueTableDialog.TestSet(tc.getTestCaseDescription(), tc.getLabel()));
if (tsl.isEmpty())
throw new TestingDataException(Lang.get("err_noTestData"));
diff --git a/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java b/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java
index d3d390c8e..a2a5d58d1 100644
--- a/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java
+++ b/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java
@@ -5,17 +5,15 @@
*/
package de.neemann.digital.hdl.verilog2;
-import de.neemann.digital.hdl.vhdl2.*;
-import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.data.Value;
import de.neemann.digital.draw.elements.Circuit;
-import de.neemann.digital.draw.elements.VisualElement;
import de.neemann.digital.hdl.model2.HDLCircuit;
import de.neemann.digital.hdl.model2.HDLException;
import de.neemann.digital.hdl.model2.HDLModel;
import de.neemann.digital.hdl.model2.HDLPort;
import de.neemann.digital.hdl.printer.CodePrinter;
import de.neemann.digital.hdl.printer.CodePrinterStr;
+import de.neemann.digital.hdl.vhdl2.Separator;
import de.neemann.digital.lang.Lang;
import de.neemann.digital.testing.TestCaseDescription;
import de.neemann.digital.testing.TestingDataException;
@@ -27,9 +25,7 @@ import de.neemann.digital.testing.parser.TestRow;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
-
-import static de.neemann.digital.core.element.Keys.TESTDATA;
-
+import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -38,7 +34,7 @@ import java.util.logging.Logger;
* The needed test date is taken from the test cases in the circuit
*/
public class VerilogTestBenchCreator {
- private final ArrayList testCases;
+ private final List testCases;
private final HDLCircuit main;
private final String topModuleName;
private final HDLModel.Renaming renaming;
@@ -54,9 +50,7 @@ public class VerilogTestBenchCreator {
public VerilogTestBenchCreator(Circuit circuit, HDLModel model, String topModuleName) {
this.main = model.getMain();
this.topModuleName = topModuleName;
- testCases = new ArrayList<>();
- for (VisualElement ve : circuit.getTestCases())
- testCases.add(ve.getElementAttributes());
+ testCases = circuit.getTestCases();
testFileWritten = new ArrayList<>();
renaming = model.getRenaming();
}
@@ -75,7 +69,7 @@ public class VerilogTestBenchCreator {
if (p > 0)
filename = filename.substring(0, p);
- for (ElementAttributes tc : testCases) {
+ for (Circuit.TestCase tc : testCases) {
String testName = tc.getLabel();
if (testName.length() > 0)
testName = filename + "_" + testName + "_tb";
@@ -107,7 +101,7 @@ public class VerilogTestBenchCreator {
return testFileWritten;
}
- private void writeTestBench(CodePrinter out, String moduleName, String testName, ElementAttributes tc) throws IOException, HDLException, TestingDataException, ParserException {
+ private void writeTestBench(CodePrinter out, String moduleName, String testName, Circuit.TestCase tc) throws IOException, HDLException, TestingDataException, ParserException {
out.print("// A testbench for ").println(testName);
out.println("`timescale 1us/1ns").println();
out.print("module ").print(testName).println(";");
@@ -131,7 +125,7 @@ public class VerilogTestBenchCreator {
}
out.dec().println().print(");").println().println();
- TestCaseDescription testdata = tc.get(TESTDATA);
+ TestCaseDescription testdata = tc.getTestCaseDescription();
ArrayList dataOrder = new ArrayList<>();
ArrayList inputsInOrder = new ArrayList<>();
diff --git a/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java b/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java
index df0b058c0..6f8ac0c02 100644
--- a/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java
+++ b/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java
@@ -5,10 +5,8 @@
*/
package de.neemann.digital.hdl.vhdl2;
-import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.data.Value;
import de.neemann.digital.draw.elements.Circuit;
-import de.neemann.digital.draw.elements.VisualElement;
import de.neemann.digital.hdl.model2.HDLCircuit;
import de.neemann.digital.hdl.model2.HDLException;
import de.neemann.digital.hdl.model2.HDLModel;
@@ -25,15 +23,14 @@ import de.neemann.digital.testing.parser.TestRow;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
-
-import static de.neemann.digital.core.element.Keys.TESTDATA;
+import java.util.List;
/**
* Creates a test bench for a model.
* The needed test data is taken from the test cases in the circuit
*/
public class VHDLTestBenchCreator {
- private final ArrayList testCases;
+ private final List testCases;
private final HDLCircuit main;
private final HDLModel.Renaming renaming;
private ArrayList testFileWritten;
@@ -47,9 +44,7 @@ public class VHDLTestBenchCreator {
VHDLTestBenchCreator(Circuit circuit, HDLModel model) {
this.main = model.getMain();
this.renaming = model.getRenaming();
- testCases = new ArrayList<>();
- for (VisualElement ve : circuit.getTestCases())
- testCases.add(ve.getElementAttributes());
+ testCases = circuit.getTestCases();
testFileWritten = new ArrayList<>();
}
@@ -68,7 +63,7 @@ public class VHDLTestBenchCreator {
filename = filename.substring(0, p);
VHDLRenaming renaming = new VHDLRenaming();
- for (ElementAttributes tc : testCases) {
+ for (Circuit.TestCase tc : testCases) {
String testName = tc.getLabel();
if (testName.length() > 0) {
testName = filename + "_" + renaming.checkName(testName) + "_tb";
@@ -95,7 +90,7 @@ public class VHDLTestBenchCreator {
return testFileWritten;
}
- private void writeTestBench(CodePrinter out, String testName, ElementAttributes tc) throws IOException, TestingDataException, ParserException {
+ private void writeTestBench(CodePrinter out, String testName, Circuit.TestCase tc) throws IOException, TestingDataException, ParserException {
out.print("-- A testbench for ").println(testName);
out.println("LIBRARY ieee;");
out.println("USE ieee.std_logic_1164.all;");
@@ -140,7 +135,7 @@ public class VHDLTestBenchCreator {
out.println("process").inc();
- TestCaseDescription testdata = tc.get(TESTDATA);
+ TestCaseDescription testdata = tc.getTestCaseDescription();
ArrayList dataOrder = new ArrayList<>();
out.println("type pattern_type is record").inc();
diff --git a/src/main/java/de/neemann/digital/testing/FolderTestRunner.java b/src/main/java/de/neemann/digital/testing/FolderTestRunner.java
index 03b7f7b7c..1bea6fc4e 100644
--- a/src/main/java/de/neemann/digital/testing/FolderTestRunner.java
+++ b/src/main/java/de/neemann/digital/testing/FolderTestRunner.java
@@ -7,10 +7,8 @@ package de.neemann.digital.testing;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
-import de.neemann.digital.core.element.Keys;
import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.draw.elements.PinException;
-import de.neemann.digital.draw.elements.VisualElement;
import de.neemann.digital.draw.library.ElementLibrary;
import de.neemann.digital.draw.library.ElementNotFoundException;
import de.neemann.digital.draw.model.ModelCreator;
@@ -23,6 +21,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.List;
/**
* Runs all tests in al circuits in a folder
@@ -186,12 +185,7 @@ public class FolderTestRunner {
FileToTest f = files.get(i);
try {
Circuit circuit = Circuit.loadCircuit(f.file, shapeFactory);
- ArrayList testCases = new ArrayList<>();
- for (VisualElement el : circuit.getTestCases()) {
- String label = el.getElementAttributes().getLabel();
- TestCaseDescription testData = el.getElementAttributes().get(Keys.TESTDATA);
- testCases.add(new TestCase(label, testData));
- }
+ List testCases = circuit.getTestCases();
if (testCases.isEmpty()) {
// if no test data is available, at least check if the model is error free
try {
@@ -204,21 +198,21 @@ public class FolderTestRunner {
} else {
StringBuilder sb = new StringBuilder();
int rowCount = 0;
- for (TestCase tc : testCases) {
+ for (Circuit.TestCase tc : testCases) {
Model model = new ModelCreator(circuit, library).createModel(false);
try {
- TestExecutor te = new TestExecutor(tc.testData).create(model);
+ TestExecutor te = new TestExecutor(tc.getTestCaseDescription()).create(model);
if (te.allPassed()) {
rowCount += te.getResult().getRows();
} else {
if (sb.length() > 0)
sb.append("; ");
- sb.append(Lang.get("msg_test_N_Failed", tc.label));
+ sb.append(Lang.get("msg_test_N_Failed", tc.getLabel()));
}
} catch (TestingDataException | NodeException e) {
if (sb.length() > 0)
sb.append("; ");
- sb.append(tc.label).append(": ").append(e.getMessage());
+ sb.append(tc.getLabel()).append(": ").append(e.getMessage());
}
}
if (sb.length() == 0) {
@@ -240,16 +234,6 @@ public class FolderTestRunner {
}
}
- private static final class TestCase {
- private final String label;
- private final TestCaseDescription testData;
-
- private TestCase(String label, TestCaseDescription testData) {
- this.label = label;
- this.testData = testData;
- }
- }
-
/**
* Interface to notify a listener for changes
*/
diff --git a/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java b/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java
index 163f961e3..d8682141d 100644
--- a/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java
+++ b/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java
@@ -6,6 +6,7 @@
package de.neemann.digital.draw.library;
import de.neemann.digital.core.element.Keys;
+import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.draw.elements.VisualElement;
import de.neemann.digital.integration.Resources;
import de.neemann.digital.integration.ToBreakRunner;
@@ -36,13 +37,7 @@ public class JarComponentManagerTest extends TestCase {
}
};
- for (VisualElement ve : br.getCircuit().getElements()) {
- if (ve.equalsDescription(TestCaseElement.TESTCASEDESCRIPTION)) {
- TestCaseDescription td = ve.getElementAttributes().get(Keys.TESTDATA);
- TestExecutor tr = new TestExecutor(td).create(br.getModel());
- assertTrue(tr.allPassed());
- }
- }
+ for (Circuit.TestCase tc : br.getCircuit().getTestCases())
+ assertTrue(new TestExecutor(tc.getTestCaseDescription()).create(br.getModel()).allPassed());
}
-
}
diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java
index d5d1e4e39..ef540faec 100644
--- a/src/test/java/de/neemann/digital/integration/TestExamples.java
+++ b/src/test/java/de/neemann/digital/integration/TestExamples.java
@@ -18,7 +18,6 @@ import de.neemann.digital.draw.library.GenericInitCode;
import de.neemann.digital.draw.library.ResolveGenerics;
import de.neemann.digital.draw.model.ModelCreator;
import de.neemann.digital.testing.TestCaseDescription;
-import de.neemann.digital.testing.TestCaseElement;
import de.neemann.digital.testing.TestExecutor;
import junit.framework.TestCase;
@@ -79,29 +78,28 @@ public class TestExamples extends TestCase {
assertEquals("wrong locked mode", isLib, (boolean) br.getCircuit().getAttributes().get(Keys.LOCKED_MODE));
try {
- for (VisualElement el : br.getCircuit().getElements())
- if (el.equalsDescription(TestCaseElement.TESTCASEDESCRIPTION)) {
- testCasesInFiles++;
+ for (Circuit.TestCase tc : br.getCircuit().getTestCases()) {
+ testCasesInFiles++;
- String label = el.getElementAttributes().getLabel();
- TestCaseDescription td = el.getElementAttributes().get(Keys.TESTDATA);
+ String label = tc.getLabel();
+ TestCaseDescription td = tc.getTestCaseDescription();
- Model model = new ModelCreator(br.getCircuit(), br.getLibrary()).createModel(false);
- ErrorDetector ed = new ErrorDetector();
- model.addObserver(ed);
- try {
- TestExecutor tr = new TestExecutor(td).create(model);
+ Model model = new ModelCreator(br.getCircuit(), br.getLibrary()).createModel(false);
+ ErrorDetector ed = new ErrorDetector();
+ model.addObserver(ed);
+ try {
+ TestExecutor tr = new TestExecutor(td).create(model);
- if (label.contains("Failing"))
- assertFalse(dig.getName() + ":" + label, tr.allPassed());
- else
- assertTrue(dig.getName() + ":" + label, tr.allPassed());
+ if (label.contains("Failing"))
+ assertFalse(dig.getName() + ":" + label, tr.allPassed());
+ else
+ assertTrue(dig.getName() + ":" + label, tr.allPassed());
- } finally {
- model.close();
- }
- ed.check();
+ } finally {
+ model.close();
}
+ ed.check();
+ }
} catch (Exception e) {
if (shouldFail) {
return;
@@ -114,8 +112,15 @@ public class TestExamples extends TestCase {
br.close();
}
- if (br.getCircuit().getAttributes().get(Keys.IS_GENERIC))
- checkGeneric(br.getCircuit(), br.getLibrary());
+ if (br.getCircuit().
+
+ getAttributes().
+
+ get(Keys.IS_GENERIC))
+
+ checkGeneric(br.getCircuit(), br.
+
+ getLibrary());
}
private void checkGeneric(Circuit circuit, ElementLibrary library) throws NodeException, ElementNotFoundException, PinException {