aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJack Koenig2017-05-17 20:13:26 -0700
committerGitHub2017-05-17 20:13:26 -0700
commitd824c60c9643973e0ae9cddc5007b3d9592f8a52 (patch)
tree8c4d55c57d0eaf93411a9425f8795e66aba785c0 /src
parent23f1b8d1f9f94975fb5b4fe22f15343d853808d9 (diff)
Make sure not to DCE input-only extmodules unless specified (#590)
Fixes #589
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/transforms/DeadCodeElimination.scala5
-rw-r--r--src/test/scala/firrtlTests/DCETests.scala23
2 files changed, 27 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/transforms/DeadCodeElimination.scala b/src/main/scala/firrtl/transforms/DeadCodeElimination.scala
index 5199276c..bf7ff7eb 100644
--- a/src/main/scala/firrtl/transforms/DeadCodeElimination.scala
+++ b/src/main/scala/firrtl/transforms/DeadCodeElimination.scala
@@ -151,6 +151,9 @@ class DeadCodeElimination extends Transform {
case ext: ExtModule =>
// Connect all inputs to all outputs
val node = LogicNode(ext)
+ // Don't touch external modules *unless* they are specifically marked as doTouch
+ // Simply marking the extmodule itself is sufficient to prevent inputs from being removed
+ if (!doTouchExtMods.contains(ext.name)) depGraph.addEdge(circuitSink, node)
ext.ports.foreach {
case Port(_, pname, _, AnalogType(_)) =>
depGraph.addEdge(LogicNode(ext.name, pname), node)
@@ -158,7 +161,7 @@ class DeadCodeElimination extends Transform {
case Port(_, pname, Output, _) =>
val portNode = LogicNode(ext.name, pname)
depGraph.addEdge(portNode, node)
- // Don't touch external modules *unless* they are specifically marked as doTouch
+ // Also mark all outputs as circuit sinks (unless marked doTouch obviously)
if (!doTouchExtMods.contains(ext.name)) depGraph.addEdge(circuitSink, portNode)
case Port(_, pname, Input, _) => depGraph.addEdge(node, LogicNode(ext.name, pname))
}
diff --git a/src/test/scala/firrtlTests/DCETests.scala b/src/test/scala/firrtlTests/DCETests.scala
index deb73b3b..129460e1 100644
--- a/src/test/scala/firrtlTests/DCETests.scala
+++ b/src/test/scala/firrtlTests/DCETests.scala
@@ -254,6 +254,29 @@ class DCETests extends FirrtlFlatSpec {
| z <= x""".stripMargin
exec(input, check)
}
+ "Extmodule with only inputs" should "NOT be deleted by default" in {
+ val input =
+ """circuit Top :
+ | extmodule InputsOnly :
+ | input x : UInt<1>
+ | module Top :
+ | input x : UInt<1>
+ | output z : UInt<1>
+ | inst ext of InputsOnly
+ | ext.x <= x
+ | z <= x""".stripMargin
+ val check =
+ """circuit Top :
+ | extmodule InputsOnly :
+ | input x : UInt<1>
+ | module Top :
+ | input x : UInt<1>
+ | output z : UInt<1>
+ | inst ext of InputsOnly
+ | ext.x <= x
+ | z <= x""".stripMargin
+ exec(input, check)
+ }
"Globally dead extmodule marked optimizable" should "be deleted" in {
val input =
"""circuit Top :