aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/scala/firrtlTests/DriverSpec.scala158
-rw-r--r--src/test/scala/firrtlTests/ExecutionOptionManagerSpec.scala41
2 files changed, 199 insertions, 0 deletions
diff --git a/src/test/scala/firrtlTests/DriverSpec.scala b/src/test/scala/firrtlTests/DriverSpec.scala
new file mode 100644
index 00000000..c2066831
--- /dev/null
+++ b/src/test/scala/firrtlTests/DriverSpec.scala
@@ -0,0 +1,158 @@
+// See LICENSE for license details.
+
+package firrtlTests
+
+import java.io.File
+
+import firrtl.passes.memlib.ReplSeqMemAnnotation
+import org.scalatest.{Matchers, FreeSpec}
+
+import firrtl._
+
+class DriverSpec extends FreeSpec with Matchers {
+ "CommonOptions are some simple options available across the chisel3 ecosystem" - {
+ "CommonOption provide an scopt implementation of an OptionParser" - {
+ "Options can be set from an Array[String] as is passed into a main" - {
+ "With no arguments default values come out" in {
+ val optionsManager = new ExecutionOptionsManager("test")
+ optionsManager.parse(Array.empty[String]) should be(true)
+
+ val commonOptions = optionsManager.commonOptions
+ commonOptions.topName should be("")
+ commonOptions.targetDirName should be("test_run_dir")
+ }
+ "top name and target can be set" in {
+ val optionsManager = new ExecutionOptionsManager("test")
+ 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")
+
+ optionsManager.getBuildFileName(".fir") should be("a/b/c/dog.fir")
+ optionsManager.getBuildFileName("fir") should be("a/b/c/dog.fir")
+ }
+ }
+ "CommonOptions can create a directory" in {
+ var dir = new java.io.File("a/b/c")
+ if(dir.exists()) {
+ dir.delete()
+ }
+ val optionsManager = new ExecutionOptionsManager("test")
+ 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")
+
+ optionsManager.makeTargetDir() should be (true)
+ dir = new java.io.File("a/b/c")
+ dir.exists() should be (true)
+ FileUtils.deleteDirectoryHierarchy(commonOptions.targetDirName)
+ }
+ }
+ }
+ "FirrtlOptions holds option information for the firrtl compiler" - {
+ "It includes a CommonOptions" in {
+ val optionsManager = new ExecutionOptionsManager("test")
+ optionsManager.commonOptions.targetDirName should be ("test_run_dir")
+ }
+ "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)
+
+ val firrtlOptions = optionsManager.firrtlOptions
+ val inputFileName = optionsManager.getBuildFileName("fir", firrtlOptions.inputFileNameOverride)
+ inputFileName should be ("test_run_dir/cat.fir")
+ val outputFileName = optionsManager.getBuildFileName("v", firrtlOptions.outputFileNameOverride)
+ outputFileName should be ("test_run_dir/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)
+
+ val firrtlOptions = optionsManager.firrtlOptions
+ val inputFileName = optionsManager.getBuildFileName("fir", firrtlOptions.inputFileNameOverride)
+ inputFileName should be ("./bob.fir")
+ val outputFileName = optionsManager.getBuildFileName("v", firrtlOptions.outputFileNameOverride)
+ outputFileName should be ("carol.v")
+ }
+ "various annotations can be created from command line, currently:" - {
+ "inline annotation" in {
+ val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
+
+ optionsManager.parse(
+ Array("--inline", "module,module.submodule,module.submodule.instance")
+ ) should be (true)
+
+ val firrtlOptions = optionsManager.firrtlOptions
+ firrtlOptions.annotations.length should be (3)
+ firrtlOptions.annotations.foreach { annotation =>
+ annotation shouldBe a [passes.InlineAnnotation]
+ }
+ }
+ "infer-rw annotation" in {
+ val optionsManager = new ExecutionOptionsManager("test") with HasFirrtlOptions
+
+ optionsManager.parse(
+ Array("--infer-rw", "circuit")
+ ) should be (true)
+
+ val firrtlOptions = optionsManager.firrtlOptions
+ firrtlOptions.annotations.length should be (1)
+ firrtlOptions.annotations.foreach { annotation =>
+ annotation shouldBe a [passes.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)
+
+ val firrtlOptions = optionsManager.firrtlOptions
+
+ firrtlOptions.annotations.length should be (1)
+ firrtlOptions.annotations.foreach { annotation =>
+ annotation shouldBe a [ReplSeqMemAnnotation]
+ }
+ }
+ }
+ }
+
+ val input =
+ """
+ |circuit Dummy :
+ | module Dummy :
+ | input x : UInt<1>
+ | output y : UInt<1>
+ | y <= x
+ """.stripMargin
+
+ "Driver produces files with different names depending on the compiler" - {
+ "compiler changes the default name of the output file" in {
+
+ Seq(
+ "low" -> "test_run_dir/Dummy.lo.fir",
+ "high" -> "test_run_dir/Dummy.hi.fir",
+ "verilog" -> "test_run_dir/Dummy.v"
+ ).foreach { case (compilerName, expectedOutputFileName) =>
+ val manager = new ExecutionOptionsManager("test") with HasFirrtlOptions {
+ commonOptions = CommonOptions(topName = "Dummy")
+ firrtlOptions = FirrtlExecutionOptions(firrtlSource = Some(input), compilerName = compilerName)
+ }
+
+ firrtl.Driver.execute(manager)
+
+ val file = new File(expectedOutputFileName)
+ file.exists() should be (true)
+ file.delete()
+ }
+ }
+ }
+}
diff --git a/src/test/scala/firrtlTests/ExecutionOptionManagerSpec.scala b/src/test/scala/firrtlTests/ExecutionOptionManagerSpec.scala
new file mode 100644
index 00000000..0edef8cc
--- /dev/null
+++ b/src/test/scala/firrtlTests/ExecutionOptionManagerSpec.scala
@@ -0,0 +1,41 @@
+// See LICENSE for license details.
+
+package firrtlTests
+
+import firrtl._
+import org.scalatest.{Matchers, FreeSpec}
+
+class ExecutionOptionManagerSpec extends FreeSpec with Matchers {
+ "ExecutionOptionManager is a container for one more more ComposableOptions Block" - {
+ "It has a default CommonOptionsBlock" in {
+ val manager = new ExecutionOptionsManager("test")
+ manager.commonOptions.targetDirName should be ("test_run_dir")
+ }
+ "But can override defaults like this" in {
+ val manager = new ExecutionOptionsManager("test") { commonOptions = CommonOptions(topName = "dog") }
+ manager.commonOptions shouldBe a [CommonOptions]
+ manager.topName should be ("dog")
+ manager.commonOptions.topName should be ("dog")
+ }
+ "The add method should put a new version of a given type the manager" in {
+ val manager = new ExecutionOptionsManager("test") { commonOptions = CommonOptions(topName = "dog") }
+ val initialCommon = manager.commonOptions
+ initialCommon.topName should be ("dog")
+
+ manager.commonOptions = CommonOptions(topName = "cat")
+
+ val afterCommon = manager.commonOptions
+ afterCommon.topName should be ("cat")
+ initialCommon.topName should be ("dog")
+ }
+ "multiple composable blocks should be separable" in {
+ val manager = new ExecutionOptionsManager("test") with HasFirrtlOptions {
+ commonOptions = CommonOptions(topName = "spoon")
+ firrtlOptions = FirrtlExecutionOptions(inputFileNameOverride = "fork")
+ }
+
+ manager.firrtlOptions.inputFileNameOverride should be ("fork")
+ manager.commonOptions.topName should be ("spoon")
+ }
+ }
+}