From f4e5b86261802de3977ee6cc2331b219b932cd11 Mon Sep 17 00:00:00 2001 From: Tudor Timi Date: Sun, 12 May 2024 16:27:53 +0300 Subject: [PATCH 1/5] Add property for SV private include directories to HDVL compile spec --- .../gradle/hdvl/HDVLCompileSpec.java | 1 + .../hdvl/internal/DefaultHDVLCompileSpec.java | 14 +++++++++++++- .../gradle/hdvl/internal/WriteCompileSpecFile.java | 5 ++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/HDVLCompileSpec.java b/src/main/java/com/verificationgentleman/gradle/hdvl/HDVLCompileSpec.java index de77439..ae98bd9 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/HDVLCompileSpec.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/HDVLCompileSpec.java @@ -5,4 +5,5 @@ public interface HDVLCompileSpec { Set getSvSourceFiles(); + Set getSvPrivateIncludeDirs(); } diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/DefaultHDVLCompileSpec.java b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/DefaultHDVLCompileSpec.java index f9e71a7..88ab55c 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/DefaultHDVLCompileSpec.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/DefaultHDVLCompileSpec.java @@ -18,18 +18,30 @@ public class DefaultHDVLCompileSpec implements HDVLCompileSpec { @XmlJavaTypeAdapter(value=FileAdapter.class) private final File[] svSourceFiles; - public DefaultHDVLCompileSpec(Set svSourceFiles) { + @XmlElementWrapper + @XmlElement(name="svPrivateIncludeDir") + @XmlJavaTypeAdapter(value=FileAdapter.class) + private final File[] svPrivateIncludeDirs; + + public DefaultHDVLCompileSpec(Set svSourceFiles, Set svPrivateIncludeDirs) { this.svSourceFiles = svSourceFiles.toArray(new File[0]); + this.svPrivateIncludeDirs = svPrivateIncludeDirs.toArray(new File[0]); } // Needed for JAXB @SuppressWarnings("unused") private DefaultHDVLCompileSpec() { this.svSourceFiles = new File[0]; + this.svPrivateIncludeDirs = new File[0]; } @Override public Set getSvSourceFiles() { return new HashSet<>(Arrays.asList(svSourceFiles)); } + + @Override + public Set getSvPrivateIncludeDirs() { + return new HashSet<>(Arrays.asList(svPrivateIncludeDirs)); + } } diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java index d19dadb..415a05b 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java @@ -8,6 +8,8 @@ import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.*; +import java.util.Collections; + public class WriteCompileSpecFile extends DefaultTask { private final RegularFileProperty destination; @@ -32,7 +34,8 @@ public ConfigurableFileCollection getSvSource() { @TaskAction protected void generate() { - DefaultHDVLCompileSpec compileSpec = new DefaultHDVLCompileSpec(getSvSource().getFiles()); + DefaultHDVLCompileSpec compileSpec = new DefaultHDVLCompileSpec(getSvSource().getFiles(), + Collections.emptySet()); try { JAXBContext jaxbContext = JAXBContext.newInstance(DefaultHDVLCompileSpec.class); Marshaller marshaller = jaxbContext.createMarshaller(); From 7bb400c5351edbfad6f64a189ffa4bcc78412166 Mon Sep 17 00:00:00 2001 From: Tudor Timi Date: Sun, 12 May 2024 16:39:59 +0300 Subject: [PATCH 2/5] Write SV private include dirs to compile spec --- .../gradle/hdvl/internal/WriteCompileSpecFile.java | 13 ++++++++++--- .../hdvl/systemverilog/SystemVerilogPlugin.java | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java index 415a05b..25cb135 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteCompileSpecFile.java @@ -8,16 +8,16 @@ import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.*; -import java.util.Collections; - public class WriteCompileSpecFile extends DefaultTask { private final RegularFileProperty destination; private final ConfigurableFileCollection svSourceFiles; + private final ConfigurableFileCollection svSPrivateIncludeDirs; public WriteCompileSpecFile() { destination = getProject().getObjects().fileProperty(); svSourceFiles = getProject().getObjects().fileCollection(); + svSPrivateIncludeDirs = getProject().getObjects().fileCollection(); } @OutputFile @@ -32,10 +32,17 @@ public ConfigurableFileCollection getSvSource() { return svSourceFiles; } + @InputFiles + @SkipWhenEmpty + @PathSensitive(PathSensitivity.ABSOLUTE) + public ConfigurableFileCollection getSvSPrivateIncludeDirs() { + return svSPrivateIncludeDirs; + } + @TaskAction protected void generate() { DefaultHDVLCompileSpec compileSpec = new DefaultHDVLCompileSpec(getSvSource().getFiles(), - Collections.emptySet()); + svSPrivateIncludeDirs.getFiles()); try { JAXBContext jaxbContext = JAXBContext.newInstance(DefaultHDVLCompileSpec.class); Marshaller marshaller = jaxbContext.createMarshaller(); diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java b/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java index ebbf339..4345e09 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java @@ -51,6 +51,7 @@ public void execute(SourceSet sourceSet) { if (sourceSet.getName() == "main") { project.getTasks().withType(WriteCompileSpecFile.class, task -> { task.getSvSource().from(svSourceSet.getSv()); + task.getSvSPrivateIncludeDirs().from(svSourceSet.getSv().getSourceDirectories()); }); project.getTasks().getByName("hdvlSourcesArchive", task -> { Zip hdvlSourcesArchive = (Zip) task; From 0da3edcfbc513b15c25ccd0091fceb9e34fbebfc Mon Sep 17 00:00:00 2001 From: Tudor Timi Date: Sun, 12 May 2024 16:09:43 +0200 Subject: [PATCH 3/5] Also zip SV private headers into HDVL sources archive Technically, this zips all files in the source tree, which would also include private headers. We still need to implement proper handling of headers in order to fix this. --- .../SystemVerilogPluginSpec.groovy | 21 +++++++++++++++++++ .../systemverilog/SystemVerilogPlugin.java | 7 +++++++ 2 files changed, 28 insertions(+) diff --git a/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy b/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy index 9c82c95..89266a6 100644 --- a/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy +++ b/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy @@ -924,6 +924,27 @@ class SystemVerilogPluginSpec extends Specification { entries[1].name == 'src/main/sv/main.sv' } + def "can produce archive with private header"() { + File mainSv = testProjectDir.newFolder('src', 'main', 'sv') + new File(mainSv, "main.sv").createNewFile() + new File(mainSv, "private_header.svh").createNewFile() + + when: + def result = GradleRunner.create() + .withProjectDir(testProjectDir.root) + .withPluginClasspath() + .withArguments(':hdvlSourcesArchive') + .build() + + then: + new File(testProjectDir.root, 'build/hdvl-sources.zip').exists() + def zipFile = new ZipFile(new File(testProjectDir.root, 'build/hdvl-sources.zip')) + def entries = zipFile.entries().findAll { !it.directory } + entries.size() == 3 + entries[1].name == 'src/main/sv/main.sv' + entries[2].name == 'src/main/sv/private_header.svh' + } + def "can publishing metadata for archive"() { File mainSv = testProjectDir.newFolder('src', 'main', 'sv') new File(mainSv, "main.sv").createNewFile() diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java b/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java index 4345e09..cb85ff1 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPlugin.java @@ -22,6 +22,7 @@ import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.file.DuplicatesStrategy; import org.gradle.api.internal.plugins.DslObject; import org.gradle.api.tasks.bundling.Zip; @@ -58,6 +59,12 @@ public void execute(SourceSet sourceSet) { hdvlSourcesArchive.from(svSourceSet.getSv(), it -> { it.into("src/main/sv"); // FIXME Assumes source in conventional location }); + + // FIXME Implement proper handling of SV private headers + hdvlSourcesArchive.setDuplicatesStrategy(DuplicatesStrategy.EXCLUDE); + hdvlSourcesArchive.from(project.files("src/main/sv").getFiles(), it -> { + it.into("src/main/sv"); // FIXME Assumes source in conventional location + }); }); } } From 4850c67486d9dbf6b99d3e67d6770954d5f73993 Mon Sep 17 00:00:00 2001 From: Tudor Timi Date: Sun, 12 May 2024 16:19:49 +0200 Subject: [PATCH 4/5] Handle SV private include dirs when consuming HDVL source archives --- .../SystemVerilogPluginSpec.groovy | 57 +++++++++++++++++++ .../hdvl/internal/WriteXrunArgsFile.java | 6 ++ 2 files changed, 63 insertions(+) diff --git a/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy b/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy index 89266a6..602b5bc 100644 --- a/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy +++ b/src/functTest/groovy/com/verificationgentleman/gradle/hdvl/systemverilog/SystemVerilogPluginSpec.groovy @@ -1039,4 +1039,61 @@ class SystemVerilogPluginSpec extends Specification { } } + def "can consume source archive with private include directory"() { + File dependencyProjectBuildFile = newStandardProject('dependency-project') + dependencyProjectBuildFile << """ + plugins { + id 'maven-publish' + } + + group = "org.example" + version = "1.0.0" + + publishing { + repositories { + maven { + name = 'dummy' + url = layout.buildDirectory.dir('dummy-repo') + } + } + } + """ + + File dependencyProjectPrivateHeader = new File(dependencyProjectBuildFile.parentFile, 'src/main/sv/dependency-project-private-header.svh') + dependencyProjectPrivateHeader.text = "dummy" + + GradleRunner.create() + .withProjectDir(dependencyProjectBuildFile.parentFile) + .withPluginClasspath() + .withArguments(':publish') + .build() + + File mainProjectBuildFile = newStandardProject('main-project') + mainProjectBuildFile << """ + dependencies { + compile 'org.example:dependency-project:1.0.0' + } + + repositories { + maven { + url = layout.projectDirectory.dir('../dependency-project/build/dummy-repo') + } + } + """ + + when: + def result = GradleRunner.create() + .withProjectDir(mainProjectBuildFile.parentFile) + .withPluginClasspath() + .withDebug(true) + .withArguments(':genFullXrunArgsFile') + .build() + + then: + def lines = new File(mainProjectBuildFile.parentFile, 'build/full_xrun_args.f').text.split("\n") + def xrunArgsForDependencyProject = new File(lines[0].split(/\s+/)[1]) + Files.lines(xrunArgsForDependencyProject.toPath()).anyMatch { line -> + line.contains('-incdir') && line.endsWith('src/main/sv') + } + } } diff --git a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteXrunArgsFile.java b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteXrunArgsFile.java index 51bca69..7608ebe 100644 --- a/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteXrunArgsFile.java +++ b/src/main/java/com/verificationgentleman/gradle/hdvl/internal/WriteXrunArgsFile.java @@ -42,6 +42,10 @@ private static DefaultHDVLCompileSpec getCompileSpec(File input) { assert svSourceFile.isAbsolute() : "not absolute: " + svSourceFile; assert svSourceFile.exists() : "doesn't exist: " + svSourceFile; } + for (File svPrivateIncludeDir : result.getSvPrivateIncludeDirs()) { + assert svPrivateIncludeDir.isAbsolute() : "not absolute: " + svPrivateIncludeDir; + assert svPrivateIncludeDir.exists() : "doesn't exist: " + svPrivateIncludeDir; + } return result; } catch (JAXBException e) { @@ -52,6 +56,8 @@ private static DefaultHDVLCompileSpec getCompileSpec(File input) { private static void writeXrunArgsFile(File xrunArgsFile, HDVLCompileSpec compileSpec) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(xrunArgsFile, true))) { writer.write("-makelib worklib\n"); + for (File svPrivateIncludeDir: compileSpec.getSvPrivateIncludeDirs()) + writer.write(" -incdir " + svPrivateIncludeDir + "\n"); for (File svSourceFile : compileSpec.getSvSourceFiles()) writer.write(" " + svSourceFile + "\n"); writer.write("-endlib\n"); From bbd4793284b5f12b166153983e04ed5cf32848e6 Mon Sep 17 00:00:00 2001 From: Tudor Timi Date: Sun, 12 May 2024 16:04:04 +0200 Subject: [PATCH 5/5] Add private header to example using published dependency --- .../some-project/src/main/sv/some_project.sv | 7 +++++++ .../some-published-dependency/src/main/sv/some_class.svh | 2 ++ .../src/main/sv/some_published_dependency.sv | 1 + 3 files changed, 10 insertions(+) create mode 100644 examples/using-published/some-published-dependency/src/main/sv/some_class.svh diff --git a/examples/using-published/some-project/src/main/sv/some_project.sv b/examples/using-published/some-project/src/main/sv/some_project.sv index 9145917..0dc52b3 100644 --- a/examples/using-published/some-project/src/main/sv/some_project.sv +++ b/examples/using-published/some-project/src/main/sv/some_project.sv @@ -1,3 +1,10 @@ module some_project; import some_published_dependency::*; + + initial + do_stuff(); + + function automatic void do_stuff(); + some_class o = new(); + endfunction endmodule diff --git a/examples/using-published/some-published-dependency/src/main/sv/some_class.svh b/examples/using-published/some-published-dependency/src/main/sv/some_class.svh new file mode 100644 index 0000000..c304f90 --- /dev/null +++ b/examples/using-published/some-published-dependency/src/main/sv/some_class.svh @@ -0,0 +1,2 @@ +class some_class; +endclass diff --git a/examples/using-published/some-published-dependency/src/main/sv/some_published_dependency.sv b/examples/using-published/some-published-dependency/src/main/sv/some_published_dependency.sv index 17e1ed2..c41e751 100644 --- a/examples/using-published/some-published-dependency/src/main/sv/some_published_dependency.sv +++ b/examples/using-published/some-published-dependency/src/main/sv/some_published_dependency.sv @@ -1,2 +1,3 @@ package some_published_dependency; + `include "some_class.svh" endpackage