aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchuyler Eldridge2020-02-13 11:42:46 -0500
committerGitHub2020-02-13 11:42:46 -0500
commit8ef2ab50411642f9eaa2c1aac7147658fbab8368 (patch)
tree8493e32ba0936a7f576745de94f361b0ce91f5b5 /src
parentdd6bbd4f6b21025913005658c562d2ad530aa3b1 (diff)
parentadf1a2f43d7e36dc3a34daa2b397ad5db60356a7 (diff)
Merge pull request #1391 from freechipsproject/instance-graph-helpers
Add InstaceGraph (Un)?Reachable Helpers
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/analyses/InstanceGraph.scala10
-rw-r--r--src/test/scala/firrtlTests/analyses/InstanceGraphTests.scala18
2 files changed, 28 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/analyses/InstanceGraph.scala b/src/main/scala/firrtl/analyses/InstanceGraph.scala
index b8b40065..7b60b110 100644
--- a/src/main/scala/firrtl/analyses/InstanceGraph.scala
+++ b/src/main/scala/firrtl/analyses/InstanceGraph.scala
@@ -140,6 +140,16 @@ class InstanceGraph(c: Circuit) {
def getChildrenInstanceMap: collection.Map[OfModule, collection.Map[Instance, OfModule]] =
childInstances.map(kv => kv._1.OfModule -> asOrderedMap(kv._2, (i: WDefInstance) => i.toTokens))
+ /** The set of all modules in the circuit */
+ lazy val modules: collection.Set[OfModule] = graph.getVertices.map(_.OfModule)
+
+ /** The set of all modules in the circuit reachable from the top module */
+ lazy val reachableModules: collection.Set[OfModule] =
+ mutable.LinkedHashSet(trueTopInstance.OfModule) ++ graph.reachableFrom(trueTopInstance).map(_.OfModule)
+
+ /** The set of all modules *not* reachable in the circuit */
+ lazy val unreachableModules: collection.Set[OfModule] = modules diff reachableModules
+
}
object InstanceGraph {
diff --git a/src/test/scala/firrtlTests/analyses/InstanceGraphTests.scala b/src/test/scala/firrtlTests/analyses/InstanceGraphTests.scala
index ee6ecd5f..8f748732 100644
--- a/src/test/scala/firrtlTests/analyses/InstanceGraphTests.scala
+++ b/src/test/scala/firrtlTests/analyses/InstanceGraphTests.scala
@@ -244,4 +244,22 @@ circuit Top :
OfModule("Bar") -> 0)
iGraph.staticInstanceCount should be (expectedCounts)
}
+
+ behavior of "Reachable/Unreachable helper methods"
+
+ they should "report correct reachable/unreachable counts" in {
+ val input =
+ """|circuit Top:
+ | module Unreachable:
+ | skip
+ | module Reachable:
+ | skip
+ | module Top:
+ | inst reachable of Reachable
+ |""".stripMargin
+ val iGraph = new InstanceGraph(ToWorkingIR.run(parse(input)))
+ iGraph.modules should contain theSameElementsAs Seq(OfModule("Top"), OfModule("Reachable"), OfModule("Unreachable"))
+ iGraph.reachableModules should contain theSameElementsAs Seq(OfModule("Top"), OfModule("Reachable"))
+ iGraph.unreachableModules should contain theSameElementsAs Seq(OfModule("Unreachable"))
+ }
}