aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChick Markley2018-06-06 22:00:40 -0700
committerJack Koenig2018-06-06 22:00:40 -0700
commitdcdfc467a5f59058b482127340ebef375cec077a (patch)
tree5cf582d7df5b382d13571cf72ced308af9b06fb3 /src
parent7c49fa1726ab1860fbb3616156467807de2d7e3c (diff)
Mechanism to stop verilator from generating VCD file Chisel Issue #808 (#794)
Add optional argument to verilogToCpp to suppress VCD
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/ExecutionOptionsManager.scala3
-rw-r--r--src/main/scala/firrtl/util/BackendCompilationUtilities.scala20
-rw-r--r--src/test/scala/firrtlTests/DriverSpec.scala152
3 files changed, 105 insertions, 70 deletions
diff --git a/src/main/scala/firrtl/ExecutionOptionsManager.scala b/src/main/scala/firrtl/ExecutionOptionsManager.scala
index 76426d1e..c5f3506a 100644
--- a/src/main/scala/firrtl/ExecutionOptionsManager.scala
+++ b/src/main/scala/firrtl/ExecutionOptionsManager.scala
@@ -186,7 +186,8 @@ case class FirrtlExecutionOptions(
dontCheckCombLoops: Boolean = false,
noDCE: Boolean = false,
annotationFileNames: List[String] = List.empty,
- firrtlCircuit: Option[Circuit] = None)
+ firrtlCircuit: Option[Circuit] = None
+)
extends ComposableOptions {
require(!(emitOneFilePerModule && outputFileNameOverride.nonEmpty),
diff --git a/src/main/scala/firrtl/util/BackendCompilationUtilities.scala b/src/main/scala/firrtl/util/BackendCompilationUtilities.scala
index 97c9c5e3..0c5ab12f 100644
--- a/src/main/scala/firrtl/util/BackendCompilationUtilities.scala
+++ b/src/main/scala/firrtl/util/BackendCompilationUtilities.scala
@@ -7,6 +7,8 @@ import java.nio.file.Files
import java.text.SimpleDateFormat
import java.util.Calendar
+import firrtl.FirrtlExecutionOptions
+
import scala.sys.process.{ProcessBuilder, ProcessLogger, _}
trait BackendCompilationUtilities {
@@ -83,11 +85,13 @@ trait BackendCompilationUtilities {
* @param cppHarness C++ testharness to compile/link against
*/
def verilogToCpp(
- dutFile: String,
- dir: File,
- vSources: Seq[File],
- cppHarness: File
- ): ProcessBuilder = {
+ dutFile: String,
+ dir: File,
+ vSources: Seq[File],
+ cppHarness: File,
+ suppressVcd: Boolean = false
+ ): ProcessBuilder = {
+
val topModule = dutFile
val blackBoxVerilogList = {
@@ -109,8 +113,10 @@ trait BackendCompilationUtilities {
Seq("--assert",
"-Wno-fatal",
"-Wno-WIDTH",
- "-Wno-STMTDLY",
- "--trace",
+ "-Wno-STMTDLY"
+ ) ++
+ { if(suppressVcd) { Seq.empty } else { Seq("--trace")} } ++
+ Seq(
"-O1",
"--top-module", topModule,
"+define+TOP_TYPE=V" + dutFile,
diff --git a/src/test/scala/firrtlTests/DriverSpec.scala b/src/test/scala/firrtlTests/DriverSpec.scala
index df49e2bb..43275392 100644
--- a/src/test/scala/firrtlTests/DriverSpec.scala
+++ b/src/test/scala/firrtlTests/DriverSpec.scala
@@ -57,74 +57,74 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
}
"CommonOptions can create a directory" in {
var dir = new java.io.File("a/b/c")
- if(dir.exists()) {
+ if (dir.exists()) {
dir.delete()
}
val optionsManager = new ExecutionOptionsManager("test")
- optionsManager.parse(Array("--top-name", "dog", "--target-dir", "a/b/c")) should be (true)
+ optionsManager.parse(Array("--top-name", "dog", "--target-dir", "a/b/c")) should be(true)
val commonOptions = optionsManager.commonOptions
- commonOptions.topName should be ("dog")
- commonOptions.targetDirName should be ("a/b/c")
+ commonOptions.topName should be("dog")
+ commonOptions.targetDirName should be("a/b/c")
- optionsManager.makeTargetDir() should be (true)
+ optionsManager.makeTargetDir() should be(true)
dir = new java.io.File("a/b/c")
- dir.exists() should be (true)
- FileUtils.deleteDirectoryHierarchy("a") should be (true)
+ dir.exists() should be(true)
+ FileUtils.deleteDirectoryHierarchy("a") should be(true)
}
}
"options include by default a list of strings that are returned in commonOptions.programArgs" in {
val optionsManager = new ExecutionOptionsManager("test")
- optionsManager.parse(Array("--top-name", "dog", "fox", "tardigrade", "stomatopod")) should be (true)
+ optionsManager.parse(Array("--top-name", "dog", "fox", "tardigrade", "stomatopod")) should be(true)
println(s"programArgs ${optionsManager.commonOptions.programArgs}")
- optionsManager.commonOptions.programArgs.length should be (3)
- optionsManager.commonOptions.programArgs should be ("fox" :: "tardigrade" :: "stomatopod" :: Nil)
+ optionsManager.commonOptions.programArgs.length should be(3)
+ optionsManager.commonOptions.programArgs should be("fox" :: "tardigrade" :: "stomatopod" :: Nil)
optionsManager.commonOptions = CommonOptions()
optionsManager.parse(
- Array("dog", "stomatopod")) should be (true)
+ Array("dog", "stomatopod")) should be(true)
println(s"programArgs ${optionsManager.commonOptions.programArgs}")
- optionsManager.commonOptions.programArgs.length should be (2)
- optionsManager.commonOptions.programArgs should be ("dog" :: "stomatopod" :: Nil)
+ optionsManager.commonOptions.programArgs.length should be(2)
+ optionsManager.commonOptions.programArgs should be("dog" :: "stomatopod" :: Nil)
optionsManager.commonOptions = CommonOptions()
optionsManager.parse(
- Array("fox", "--top-name", "dog", "tardigrade", "stomatopod")) should be (true)
+ Array("fox", "--top-name", "dog", "tardigrade", "stomatopod")) should be(true)
println(s"programArgs ${optionsManager.commonOptions.programArgs}")
- optionsManager.commonOptions.programArgs.length should be (3)
- optionsManager.commonOptions.programArgs should be ("fox" :: "tardigrade" :: "stomatopod" :: Nil)
+ optionsManager.commonOptions.programArgs.length should be(3)
+ optionsManager.commonOptions.programArgs should be("fox" :: "tardigrade" :: "stomatopod" :: Nil)
}
}
"FirrtlOptions holds option information for the firrtl compiler" - {
"It includes a CommonOptions" in {
val optionsManager = new ExecutionOptionsManager("test")
- optionsManager.commonOptions.targetDirName should be (".")
+ optionsManager.commonOptions.targetDirName should be(".")
}
"It provides input and output file names based on target" in {
val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
- optionsManager.parse(Array("--top-name", "cat")) should be (true)
+ optionsManager.parse(Array("--top-name", "cat")) should be(true)
val firrtlOptions = optionsManager.firrtlOptions
val inputFileName = optionsManager.getBuildFileName("fir", firrtlOptions.inputFileNameOverride)
- inputFileName should be ("./cat.fir")
+ inputFileName should be("./cat.fir")
val outputFileName = firrtlOptions.getTargetFile(optionsManager)
- outputFileName should be ("./cat.v")
+ outputFileName should be("./cat.v")
}
"input and output file names can be overridden, overrides do not use targetDir" in {
val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
optionsManager.parse(
Array("--top-name", "cat", "-i", "./bob.fir", "-o", "carol.v")
- ) should be (true)
+ ) should be(true)
val firrtlOptions = optionsManager.firrtlOptions
val inputFileName = optionsManager.getBuildFileName("fir", firrtlOptions.inputFileNameOverride)
- inputFileName should be ("./bob.fir")
+ inputFileName should be("./bob.fir")
val outputFileName = firrtlOptions.getTargetFile(optionsManager)
- outputFileName should be ("carol.v")
+ outputFileName should be("carol.v")
}
val input = """
|circuit Top :
@@ -173,32 +173,32 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
optionsManager.parse(
Array("--inline", "module,module.submodule,module.submodule.instance")
- ) should be (true)
+ ) should be(true)
val firrtlOptions = optionsManager.firrtlOptions
- firrtlOptions.annotations.length should be (3)
- firrtlOptions.annotations.foreach(_ shouldBe an [InlineAnnotation])
+ firrtlOptions.annotations.length should be(3)
+ firrtlOptions.annotations.foreach(_ shouldBe an[InlineAnnotation])
}
"infer-rw annotation" in {
val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
optionsManager.parse(
Array("--infer-rw", "circuit")
- ) should be (true)
+ ) should be(true)
val firrtlOptions = optionsManager.firrtlOptions
- firrtlOptions.annotations.length should be (1)
- firrtlOptions.annotations.head should be (InferReadWriteAnnotation)
+ firrtlOptions.annotations.length should be(1)
+ firrtlOptions.annotations.head should be(InferReadWriteAnnotation)
}
"repl-seq-mem annotation" in {
val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
optionsManager.parse(
Array("--repl-seq-mem", "-c:circuit1:-i:infile1:-o:outfile1")
- ) should be (true)
+ ) should be(true)
val firrtlOptions = optionsManager.firrtlOptions
- firrtlOptions.annotations.length should be (1)
+ firrtlOptions.annotations.length should be(1)
firrtlOptions.annotations.head should matchPattern {
case ReplSeqMemAnnotation("infile1", "outfile1") =>
}
@@ -212,12 +212,12 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions {
commonOptions = commonOptions.copy(topName = top)
}
- val annoFile = new File(optionsManager.commonOptions.targetDirName, top + ".anno")
+ val annoFile = new File(optionsManager.commonOptions.targetDirName, top + ".anno")
copyResourceToFile("/annotations/SampleAnnotations.anno", annoFile)
- optionsManager.firrtlOptions.annotations.length should be (0)
+ optionsManager.firrtlOptions.annotations.length should be(0)
val annos = Driver.getAnnotations(optionsManager)
- annos.length should be (12) // 9 from circuit plus 3 general purpose
- annos.count(_.isInstanceOf[InlineAnnotation]) should be (9)
+ annos.length should be(12) // 9 from circuit plus 3 general purpose
+ annos.count(_.isInstanceOf[InlineAnnotation]) should be(9)
annoFile.delete()
}
@@ -229,12 +229,12 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
annotationFileNameOverride = "SampleAnnotations"
)
}
- val annotationsTestFile = new File(optionsManager.commonOptions.targetDirName, optionsManager.firrtlOptions.annotationFileNameOverride + ".anno")
+ val annotationsTestFile = new File(optionsManager.commonOptions.targetDirName, optionsManager.firrtlOptions.annotationFileNameOverride + ".anno")
copyResourceToFile("/annotations/SampleAnnotations.anno", annotationsTestFile)
- optionsManager.firrtlOptions.annotations.length should be (0)
+ optionsManager.firrtlOptions.annotations.length should be(0)
val annos = Driver.getAnnotations(optionsManager)
- annos.length should be (12) // 9 from circuit plus 3 general purpose
- annos.count(_.isInstanceOf[InlineAnnotation]) should be (9)
+ annos.length should be(12) // 9 from circuit plus 3 general purpose
+ annos.count(_.isInstanceOf[InlineAnnotation]) should be(9)
annotationsTestFile.delete()
}
@@ -242,7 +242,7 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
"Supported LegacyAnnotations will be converted automagically" in {
val testDir = createTestDirectory("test")
val annoFilename = "LegacyAnnotations.anno"
- val annotationsTestFile = new File(testDir, annoFilename)
+ val annotationsTestFile = new File(testDir, annoFilename)
val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions {
commonOptions = commonOptions.copy(topName = "test", targetDirName = testDir.toString)
firrtlOptions = firrtlOptions.copy(
@@ -276,7 +276,7 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
OptimizableExtModuleAnnotation(mname)
)
for (e <- expected) {
- annos should contain (e)
+ annos should contain(e)
}
}
@@ -284,12 +284,14 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
"UNsupported LegacyAnnotations should throw errors" in {
val testDir = createTestDirectory("test")
val annoFilename = "InvalidLegacyAnnotations.anno"
- val annotationsTestFile = new File(testDir, annoFilename)
+ val annotationsTestFile = new File(testDir, annoFilename)
copyResourceToFile(s"/annotations/$annoFilename", annotationsTestFile)
import net.jcazevedo.moultingyaml._
val text = io.Source.fromFile(annotationsTestFile).mkString
- val yamlAnnos = text.parseYaml match { case YamlArray(xs) => xs }
+ val yamlAnnos = text.parseYaml match {
+ case YamlArray(xs) => xs
+ }
// Since each one should error, emit each one to an anno file and try to read it
for ((anno, i) <- yamlAnnos.zipWithIndex) {
@@ -303,9 +305,9 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
annotationFileNames = List(annoFile.toString)
)
}
- (the [Exception] thrownBy {
+ (the[Exception] thrownBy {
Driver.getAnnotations(optionsManager)
- }).getMessage should include ("Old-style annotations")
+ }).getMessage should include("Old-style annotations")
}
}
@@ -319,10 +321,10 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
}
val annotationsTestFile = new File(optionsManager.commonOptions.targetDirName, filename)
copyResourceToFile(s"/annotations/$filename", annotationsTestFile)
- optionsManager.firrtlOptions.annotations.length should be (0)
+ optionsManager.firrtlOptions.annotations.length should be(0)
val annos = Driver.getAnnotations(optionsManager)
- annos.length should be (21) // 18 from files plus 3 general purpose
- annos.count(_.isInstanceOf[InlineAnnotation]) should be (18)
+ annos.length should be(21) // 18 from files plus 3 general purpose
+ annos.count(_.isInstanceOf[InlineAnnotation]) should be(18)
annotationsTestFile.delete()
}
@@ -333,17 +335,17 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
optionsManager.parse(
Array("--infer-rw", "circuit", "-faf", annoFile.toString)
- ) should be (true)
+ ) should be(true)
copyResourceToFile("/annotations/SampleAnnotations.anno.json", annoFile)
val firrtlOptions = optionsManager.firrtlOptions
- firrtlOptions.annotations.length should be (1) // infer-rw
+ firrtlOptions.annotations.length should be(1) // infer-rw
val anns = Driver.getAnnotations(optionsManager)
- anns should contain (BlackBoxTargetDirAnno(".")) // built in to getAnnotations
- anns should contain (InferReadWriteAnnotation) // --infer-rw
- anns.collect { case a: InlineAnnotation => a }.length should be (9) // annotations file
+ anns should contain(BlackBoxTargetDirAnno(".")) // built in to getAnnotations
+ anns should contain(InferReadWriteAnnotation) // --infer-rw
+ anns.collect { case a: InlineAnnotation => a }.length should be(9) // annotations file
annoFile.delete()
}
@@ -379,7 +381,7 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
firrtl.Driver.execute(manager)
val file = new File(expectedOutputFileName)
- file.exists() should be (true)
+ file.exists() should be(true)
file.delete()
}
}
@@ -394,8 +396,8 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
val manager = new ExecutionOptionsManager("test") with HasFirrtlOptions {
commonOptions = CommonOptions(topName = "Top")
firrtlOptions = FirrtlExecutionOptions(firrtlSource = Some(input),
- compilerName = compilerName,
- emitOneFilePerModule = true)
+ compilerName = compilerName,
+ emitOneFilePerModule = true)
}
firrtl.Driver.execute(manager) match {
@@ -407,7 +409,7 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
for (name <- expectedOutputFileNames) {
val file = new File(name)
- file.exists() should be (true)
+ file.exists() should be(true)
file.delete()
}
}
@@ -419,12 +421,38 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
"for example making a directory tree, and deleting it looks like" in {
FileUtils.makeDirectory("dog/fox/wolf")
val dir = new File("dog/fox/wolf")
- dir.exists() should be (true)
- dir.isDirectory should be (true)
+ dir.exists() should be(true)
+ dir.isDirectory should be(true)
+
+ FileUtils.deleteDirectoryHierarchy("wolf") should be(false)
+ FileUtils.deleteDirectoryHierarchy("dog") should be(true)
+ dir.exists() should be(false)
+ }
+ }
+}
+
+class VcdSuppressionSpec extends FirrtlFlatSpec {
+ "Default option" should "generate a vcd" in {
+ val prefix = "ZeroPortMem"
- FileUtils.deleteDirectoryHierarchy("wolf") should be (false)
- FileUtils.deleteDirectoryHierarchy("dog") should be (true)
- dir.exists() should be (false)
+ def testIfVcdCreated(suppress: Boolean): Unit = {
+ val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
+
+ val testDir = compileFirrtlTest(prefix, "/features", Seq.empty, Seq.empty)
+ val harness = new File(testDir, s"top.cpp")
+ copyResourceToFile(cppHarnessResourceName, harness)
+
+ verilogToCpp(prefix, testDir, Seq.empty, harness, suppress).!
+ cppToExe(prefix, testDir).!
+
+ assert(executeExpectingSuccess(prefix, testDir))
+
+ val vcdFile = new File(s"$testDir/dump.vcd")
+ println(s"file ${vcdFile.getAbsolutePath} ${vcdFile.exists()}")
+ vcdFile.exists() should be(! suppress)
}
+
+ testIfVcdCreated(suppress = false)
+ testIfVcdCreated(suppress = true)
}
}