summaryrefslogtreecommitdiff
path: root/src/main/scala/chisel3/testers/TesterDriver.scala
diff options
context:
space:
mode:
authorJim Lawson2016-06-20 11:08:46 -0700
committerJim Lawson2016-06-20 11:08:46 -0700
commitd408d73a171535bd7c2ba9d0037c194022b8a62f (patch)
tree81885a99ec56e89532bc3fa338f22b163dcc4d1f /src/main/scala/chisel3/testers/TesterDriver.scala
parentb5a534914795d9d17f4dfe623525f1b804e4c60f (diff)
Rename chisel3 package.
Diffstat (limited to 'src/main/scala/chisel3/testers/TesterDriver.scala')
-rw-r--r--src/main/scala/chisel3/testers/TesterDriver.scala69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/main/scala/chisel3/testers/TesterDriver.scala b/src/main/scala/chisel3/testers/TesterDriver.scala
new file mode 100644
index 00000000..5c0275e0
--- /dev/null
+++ b/src/main/scala/chisel3/testers/TesterDriver.scala
@@ -0,0 +1,69 @@
+// See LICENSE for license details.
+
+package chisel.testers
+
+import chisel._
+import scala.io.Source
+import scala.sys.process._
+import java.io._
+
+object TesterDriver extends BackendCompilationUtilities {
+ /** Copy the contents of a resource to a destination file.
+ */
+ def copyResourceToFile(name: String, file: File) {
+ val in = getClass().getResourceAsStream(name)
+ if (in == null) {
+ throw new FileNotFoundException(s"Resource '$name'")
+ }
+ val out = new FileOutputStream(file)
+ Iterator.continually(in.read).takeWhile(-1 !=).foreach(out.write)
+ out.close()
+ }
+
+ /** For use with modules that should successfully be elaborated by the
+ * frontend, and which can be turned into executables with assertions. */
+ def execute(t: () => BasicTester, additionalVResources: Seq[String] = Seq()): Boolean = {
+ // Invoke the chisel compiler to get the circuit's IR
+ val circuit = Driver.elaborate(finishWrapper(t))
+
+ // Set up a bunch of file handlers based on a random temp filename,
+ // plus the quirks of Verilator's naming conventions
+ val target = circuit.name
+
+ val path = createTempDirectory(target)
+ val fname = new File(path, target)
+
+ // For now, dump the IR out to a file
+ Driver.dumpFirrtl(circuit, Some(new File(fname.toString + ".fir")))
+
+ // Copy CPP harness and other Verilog sources from resources into files
+ val cppHarness = new File(path, "top.cpp")
+ copyResourceToFile("/top.cpp", cppHarness)
+ val additionalVFiles = additionalVResources.map((name: String) => {
+ val mangledResourceName = name.replace("/", "_")
+ val out = new File(path, mangledResourceName)
+ copyResourceToFile(name, out)
+ out
+ })
+
+ // Use sys.Process to invoke a bunch of backend stuff, then run the resulting exe
+ if ((firrtlToVerilog(target, path) #&&
+ verilogToCpp(target, target, path, additionalVFiles, cppHarness) #&&
+ cppToExe(target, path)).! == 0) {
+ executeExpectingSuccess(target, path)
+ } else {
+ false
+ }
+ }
+ /**
+ * Calls the finish method of an BasicTester or a class that extends it.
+ * The finish method is a hook for code that augments the circuit built in the constructor.
+ */
+ def finishWrapper(test: () => BasicTester): () => BasicTester = {
+ () => {
+ val tester = test()
+ tester.finish()
+ tester
+ }
+ }
+}