diff options
| author | albertchen-sifive | 2018-09-13 22:09:18 -0700 |
|---|---|---|
| committer | Jack Koenig | 2018-09-13 22:09:18 -0700 |
| commit | 860e6844708e4b87ced04bcef0eda7810cba106a (patch) | |
| tree | 73f90f4f290548bd0a6987782264f80491a3058f | |
| parent | b8a2dee2a8767e85206433862b08bc18442cdb2f (diff) | |
Do not remove ExtMods with no ports by default (#888)
| -rw-r--r-- | src/main/scala/firrtl/transforms/DeadCodeElimination.scala | 7 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/DCETests.scala | 35 |
2 files changed, 39 insertions, 3 deletions
diff --git a/src/main/scala/firrtl/transforms/DeadCodeElimination.scala b/src/main/scala/firrtl/transforms/DeadCodeElimination.scala index 8a3d0a4f..c98b892c 100644 --- a/src/main/scala/firrtl/transforms/DeadCodeElimination.scala +++ b/src/main/scala/firrtl/transforms/DeadCodeElimination.scala @@ -178,7 +178,8 @@ class DeadCodeElimination extends Transform { deadNodes: collection.Set[LogicNode], moduleMap: collection.Map[String, DefModule], renames: RenameMap, - topName: String) + topName: String, + doTouchExtMods: Set[String]) (mod: DefModule): Option[DefModule] = { // For log-level debug def deleteMsg(decl: IsDeclaration): String = { @@ -257,7 +258,7 @@ class DeadCodeElimination extends Transform { Some(Module(info, name, portsx, bodyx)) } case ext: ExtModule => - if (portsx.isEmpty) { + if (portsx.isEmpty && doTouchExtMods.contains(ext.name)) { logger.debug(deleteMsg(mod)) None } @@ -308,7 +309,7 @@ class DeadCodeElimination extends Transform { // current status of the modulesxMap is used to either delete instances or update their types val modulesxMap = mutable.HashMap.empty[String, DefModule] topoSortedModules.foreach { case mod => - deleteDeadCode(moduleDeps(mod.name), deadNodes, modulesxMap, renames, c.main)(mod) match { + deleteDeadCode(moduleDeps(mod.name), deadNodes, modulesxMap, renames, c.main, doTouchExtMods)(mod) match { case Some(m) => modulesxMap += m.name -> m case None => renames.delete(ModuleName(mod.name, CircuitName(c.main))) } diff --git a/src/test/scala/firrtlTests/DCETests.scala b/src/test/scala/firrtlTests/DCETests.scala index b8345093..a6def402 100644 --- a/src/test/scala/firrtlTests/DCETests.scala +++ b/src/test/scala/firrtlTests/DCETests.scala @@ -8,6 +8,7 @@ import firrtl.passes._ import firrtl.transforms._ import firrtl.annotations._ import firrtl.passes.memlib.SimpleTransform +import FirrtlCheckers._ import java.io.File import java.nio.file.Paths @@ -320,6 +321,40 @@ class DCETests extends FirrtlFlatSpec { """.stripMargin exec(input, input) } + "extmodules with no ports" should "NOT be deleted by default" in { + val input = + """circuit Top : + | extmodule BlackBox : + | defname = BlackBox + | module Top : + | input x : UInt<1> + | output y : UInt<1> + | inst blackBox of BlackBox + | y <= x + |""".stripMargin + exec(input, input) + } + "extmodules with no ports marked optimizable" should "be deleted" in { + val input = + """circuit Top : + | extmodule BlackBox : + | defname = BlackBox + | module Top : + | input x : UInt<1> + | output y : UInt<1> + | inst blackBox of BlackBox + | y <= x + |""".stripMargin + val check = + """circuit Top : + | module Top : + | input x : UInt<1> + | output y : UInt<1> + | y <= x + |""".stripMargin + val doTouchAnno = OptimizableExtModuleAnnotation(ModuleName("BlackBox", CircuitName("Top"))) + exec(input, check, Seq(doTouchAnno)) + } // bar.z is not used and thus is dead code, but foo.z is used so this code isn't eliminated "Module deduplication" should "should be preserved despite unused output of ONE instance" in { val input = |
