aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/scala/firrtl/Driver.scala63
-rw-r--r--src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala8
-rw-r--r--src/main/scala/firrtl/util/BackendCompilationUtilities.scala28
-rw-r--r--src/test/scala/firrtlTests/DriverSpec.scala15
4 files changed, 76 insertions, 38 deletions
diff --git a/src/main/scala/firrtl/Driver.scala b/src/main/scala/firrtl/Driver.scala
index 238906c8..fb897936 100644
--- a/src/main/scala/firrtl/Driver.scala
+++ b/src/main/scala/firrtl/Driver.scala
@@ -67,6 +67,7 @@ object Driver {
*
* @param message error message
*/
+ //scalastyle:off regex
def dramaticError(message: String): Unit = {
println(Console.RED + "-"*78)
println(s"Error: $message")
@@ -86,29 +87,28 @@ object Driver {
The annotation file if needed is found via
s"$targetDirName/$topName.anno" or s"$annotationFileNameOverride.anno"
*/
- val firrtlConfig = optionsManager.firrtlOptions
+ def firrtlConfig = optionsManager.firrtlOptions
+
if(firrtlConfig.annotations.isEmpty) {
val annotationFileName = firrtlConfig.getAnnotationFileName(optionsManager)
val annotationFile = new File(annotationFileName)
if (annotationFile.exists) {
val annotationsYaml = io.Source.fromFile(annotationFile).getLines().mkString("\n").parseYaml
- val annotationArray = {
- val annos = annotationsYaml.convertTo[Array[Annotation]]
-
- if (annos.nonEmpty) {
- annos ++ List(Annotation(
- CircuitName("All"),
- classOf[BlackBoxSourceHelper],
- BlackBoxTargetDir(optionsManager.targetDirName).serialize
- ))
- }
- else {
- annos
- }
- }
+ val annotationArray = annotationsYaml.convertTo[Array[Annotation]]
optionsManager.firrtlOptions = firrtlConfig.copy(annotations = firrtlConfig.annotations ++ annotationArray)
}
}
+
+ if(firrtlConfig.annotations.nonEmpty) {
+ val targetDirAnno = List(Annotation(
+ CircuitName("All"),
+ classOf[BlackBoxSourceHelper],
+ BlackBoxTargetDir(optionsManager.targetDirName).serialize
+ ))
+
+ optionsManager.firrtlOptions = optionsManager.firrtlOptions.copy(
+ annotations = firrtlConfig.annotations ++ targetDirAnno)
+ }
}
/**
@@ -119,7 +119,7 @@ object Driver {
* for downstream tools as desired
*/
def execute(optionsManager: ExecutionOptionsManager with HasFirrtlOptions): FirrtlExecutionResult = {
- val firrtlConfig = optionsManager.firrtlOptions
+ def firrtlConfig = optionsManager.firrtlOptions
Logger.setOptions(optionsManager)
@@ -229,19 +229,32 @@ object FileUtils {
*
* @param directoryPathName a directory hierarchy to delete
*/
- def deleteDirectoryHierarchy(directoryPathName: String): Unit = {
- if(directoryPathName.isEmpty || directoryPathName.startsWith("/")) {
- // don't delete absolute path
+ def deleteDirectoryHierarchy(directoryPathName: String): Boolean = {
+ deleteDirectoryHierarchy(new File(directoryPathName))
+ }
+ /**
+ * recursively delete all directories in a relative path
+ * DO NOT DELETE absolute paths
+ *
+ * @param file: a directory hierarchy to delete
+ */
+ def deleteDirectoryHierarchy(file: File, atTop: Boolean = true): Boolean = {
+ if(file.getPath.split("/").last.isEmpty ||
+ file.getAbsolutePath == "/" ||
+ file.getPath.startsWith("/")) {
+ Driver.dramaticError(s"delete directory ${file.getPath} will not delete absolute paths")
+ false
}
else {
- val directory = new java.io.File(directoryPathName)
- if(directory.isDirectory) {
- directory.delete()
- val directories = directoryPathName.split("/+").reverse.tail
- if (directories.nonEmpty) {
- deleteDirectoryHierarchy(directories.reverse.mkString("/"))
+ val result = {
+ if(file.isDirectory) {
+ file.listFiles().forall( f => deleteDirectoryHierarchy(f)) && file.delete()
+ }
+ else {
+ file.delete()
}
}
+ result
}
}
}
diff --git a/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala b/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala
index 914ca859..15878dc2 100644
--- a/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala
+++ b/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala
@@ -116,9 +116,11 @@ class BlackBoxSourceHelper extends firrtl.Transform {
}
state
}
- val writer = new PrintWriter(new File(targetDir, BlackBoxSourceHelper.FileListName))
- writer.write(fileList.map { fileName => s"-v $fileName" }.mkString("\n"))
- writer.close()
+ if(fileList.nonEmpty) {
+ val writer = new PrintWriter(new File(targetDir, BlackBoxSourceHelper.FileListName))
+ writer.write(fileList.map { fileName => s"-v $fileName" }.mkString("\n"))
+ writer.close()
+ }
resultState
}
diff --git a/src/main/scala/firrtl/util/BackendCompilationUtilities.scala b/src/main/scala/firrtl/util/BackendCompilationUtilities.scala
index 8c07192b..8f4ab73d 100644
--- a/src/main/scala/firrtl/util/BackendCompilationUtilities.scala
+++ b/src/main/scala/firrtl/util/BackendCompilationUtilities.scala
@@ -2,16 +2,12 @@
package firrtl.util
-import scala.sys.process._
import java.io._
import java.nio.file.Files
import java.text.SimpleDateFormat
import java.util.Calendar
-import firrtl._
-import firrtl.{Driver, ExecutionOptionsManager}
-
-import scala.sys.process.{ProcessBuilder, ProcessLogger}
+import scala.sys.process.{ProcessBuilder, ProcessLogger, _}
trait BackendCompilationUtilities {
/** Parent directory for tests */
@@ -93,8 +89,22 @@ trait BackendCompilationUtilities {
cppHarness: File
): ProcessBuilder = {
val topModule = dutFile
- val command = Seq("verilator",
- "--cc", s"$dutFile.v") ++
+
+ val blackBoxVerilogList = {
+ val list_file = new File(dir, firrtl.transforms.BlackBoxSourceHelper.FileListName)
+ if(list_file.exists()) {
+ Seq("-f", list_file.getAbsolutePath)
+ }
+ else {
+ Seq.empty[String]
+ }
+ }
+
+ val command = Seq(
+ "verilator",
+ "--cc", s"$dutFile.v"
+ ) ++
+ blackBoxVerilogList ++
vSources.flatMap(file => Seq("-v", file.getAbsolutePath)) ++
Seq("--assert",
"-Wno-fatal",
@@ -115,7 +125,7 @@ trait BackendCompilationUtilities {
}
def cppToExe(prefix: String, dir: File): ProcessBuilder =
- Seq("make", "-C", dir.toString, "-j", "-f", s"V${prefix}.mk", s"V${prefix}")
+ Seq("make", "-C", dir.toString, "-j", "-f", s"V$prefix.mk", s"V$prefix")
def executeExpectingFailure(
prefix: String,
@@ -123,7 +133,7 @@ trait BackendCompilationUtilities {
assertionMsg: String = ""): Boolean = {
var triggered = false
val assertionMessageSupplied = assertionMsg != ""
- val e = Process(s"./V${prefix}", dir) !
+ val e = Process(s"./V$prefix", dir) !
ProcessLogger(line => {
triggered = triggered || (assertionMessageSupplied && line.contains(assertionMsg))
System.out.println(line) // scalastyle:ignore regex
diff --git a/src/test/scala/firrtlTests/DriverSpec.scala b/src/test/scala/firrtlTests/DriverSpec.scala
index 5bed2a2b..4e1add39 100644
--- a/src/test/scala/firrtlTests/DriverSpec.scala
+++ b/src/test/scala/firrtlTests/DriverSpec.scala
@@ -49,7 +49,7 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
optionsManager.makeTargetDir() should be (true)
dir = new java.io.File("a/b/c")
dir.exists() should be (true)
- FileUtils.deleteDirectoryHierarchy(commonOptions.targetDirName)
+ FileUtils.deleteDirectoryHierarchy("a") should be (true)
}
}
}
@@ -173,4 +173,17 @@ class DriverSpec extends FreeSpec with Matchers with BackendCompilationUtilities
}
}
}
+
+ "Directory deleter is handy for cleaning up after tests" - {
+ "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)
+
+ FileUtils.deleteDirectoryHierarchy("wolf") should be (false)
+ FileUtils.deleteDirectoryHierarchy("dog") should be (true)
+ dir.exists() should be (false)
+ }
+ }
}