aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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"))
+ }
}