diff options
| author | Chick Markley | 2016-10-18 16:08:55 -0700 |
|---|---|---|
| committer | Jack Koenig | 2016-10-18 16:08:55 -0700 |
| commit | cb59d096471cf0d25797483af045b8a9d09ed1ab (patch) | |
| tree | 006440621cf2a0e80015d8eef7779d89b0a2c486 /src/test | |
| parent | 85baeda249e59c7d9d9f159aaf29ff46d685cf02 (diff) | |
Create a simple system for executions and command line parameters (#337)
Create a simple system for executions and command line parameters
New model for tracking parameters and having those parameters
register scopt command to allow the parameters to be set by
command line args.
Create composable forms of the these parameters to allow separate
elements of the chisel3 toolchain to combine these parameters
Create execution return structures that simplify return values
to earlier toolchain elements
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/scala/firrtlTests/DriverSpec.scala | 158 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/ExecutionOptionManagerSpec.scala | 41 |
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") + } + } +} |
