diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/Driver.scala | 63 | ||||
| -rw-r--r-- | src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala | 8 | ||||
| -rw-r--r-- | src/main/scala/firrtl/util/BackendCompilationUtilities.scala | 28 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/DriverSpec.scala | 15 |
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) + } + } } |
