From ffa0b01e32ea9e662c29670855ea51269ccc6239 Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 26 Jan 2021 20:59:26 +0100 Subject: [PATCH] allows to set the inverter config in generic code, see #622 --- .../digital/analyse/SubstituteLibrary.java | 6 ++ .../de/neemann/digital/hdl/hgs/Context.java | 3 +- .../neemann/digital/hdl/hgs/ParserTest.java | 11 +++ .../digital/integration/TestExamples.java | 4 +- .../dig/test/generics/inverterConfig.dig | 95 +++++++++++++++++++ 5 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/dig/test/generics/inverterConfig.dig diff --git a/src/main/java/de/neemann/digital/analyse/SubstituteLibrary.java b/src/main/java/de/neemann/digital/analyse/SubstituteLibrary.java index 0d68ce396..ffea4e1b2 100644 --- a/src/main/java/de/neemann/digital/analyse/SubstituteLibrary.java +++ b/src/main/java/de/neemann/digital/analyse/SubstituteLibrary.java @@ -12,6 +12,7 @@ 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.library.LibraryInterface; +import de.neemann.digital.draw.model.InverterConfig; import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.hdl.hgs.*; import de.neemann.digital.lang.Lang; @@ -229,6 +230,11 @@ public class SubstituteLibrary implements LibraryInterface { return (int) l; } else if (expectedClass == Color.class && val instanceof Number) { return new Color(((Number) val).intValue()); + } else if (expectedClass == InverterConfig.class && val instanceof java.util.List) { + InverterConfig.Builder b = new InverterConfig.Builder(); + for (Object i : (java.util.List) val) + b.add(i.toString()); + return b.build(); } else if (expectedClass == Rotation.class && val instanceof Number) { int r = ((Number) val).intValue(); return new Rotation(r % 4); diff --git a/src/main/java/de/neemann/digital/hdl/hgs/Context.java b/src/main/java/de/neemann/digital/hdl/hgs/Context.java index afed90364..516ccec25 100644 --- a/src/main/java/de/neemann/digital/hdl/hgs/Context.java +++ b/src/main/java/de/neemann/digital/hdl/hgs/Context.java @@ -57,7 +57,7 @@ public class Context implements HGSMap { BUILT_IN.put("loadHex", new FunctionLoadHex()); BUILT_IN.put("sizeOf", new Func(1, args -> Value.toArray(args[0]).hgsArraySize())); BUILT_IN.put("newMap", new Func(0, args -> new HashMap())); - BUILT_IN.put("newList", new Func(0, args -> new ArrayList())); + BUILT_IN.put("newList", new Func(-1, args -> new ArrayList<>(Arrays.asList(args)))); } private final Context parent; @@ -692,4 +692,5 @@ public class Context implements HGSMap { public int hashCode() { return Objects.hash(parent, map); } + } diff --git a/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java b/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java index e9a3bdb0b..6ffa350a9 100644 --- a/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java +++ b/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java @@ -331,6 +331,17 @@ public class ParserTest extends TestCase { assertEquals(7L, l.get(1)); } + public void testParseTemplateArray2() throws IOException, ParserException, HGSEvalException { + Context c = exec(";"); + assertEquals("7,2;", c.toString()); + Object lo = c.getVar("a"); + assertTrue(lo instanceof List); + List l = (List) lo; + assertEquals(2, l.size()); + assertEquals(1L, l.get(0)); + assertEquals(7L, l.get(1)); + } + public void testParseTemplateMap() throws IOException, ParserException, HGSEvalException { Context c = exec(";"); assertEquals("7;", c.toString()); diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java index a5764c70d..72b7d1dc8 100644 --- a/src/test/java/de/neemann/digital/integration/TestExamples.java +++ b/src/test/java/de/neemann/digital/integration/TestExamples.java @@ -51,8 +51,8 @@ public class TestExamples extends TestCase { */ public void testTestExamples() throws Exception { File examples = new File(Resources.getRoot(), "/dig/test"); - assertEquals(206, new FileScanner(this::check).scan(examples)); - assertEquals(192, testCasesInFiles); + assertEquals(207, new FileScanner(this::check).scan(examples)); + assertEquals(193, testCasesInFiles); } /** diff --git a/src/test/resources/dig/test/generics/inverterConfig.dig b/src/test/resources/dig/test/generics/inverterConfig.dig new file mode 100644 index 000000000..c79f852d9 --- /dev/null +++ b/src/test/resources/dig/test/generics/inverterConfig.dig @@ -0,0 +1,95 @@ + + + 1 + + + isGeneric + true + + + + + In + + + Label + D + + + + + + Out + + + Label + Q + + + + + + D_FF + + + generic + this.inverterConfig=newList("D"); + + + + + + GenericInitCode + + + + + Clock + + + Label + C + + + + + + Testcase + + + Testdata + + C D Q +c 0 1 +c 1 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file