aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/scala/firrtlTests/analyses/InstanceKeyGraphSpec.scala124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/test/scala/firrtlTests/analyses/InstanceKeyGraphSpec.scala b/src/test/scala/firrtlTests/analyses/InstanceKeyGraphSpec.scala
new file mode 100644
index 00000000..8d073ecb
--- /dev/null
+++ b/src/test/scala/firrtlTests/analyses/InstanceKeyGraphSpec.scala
@@ -0,0 +1,124 @@
+// See LICENSE for license details.
+
+package firrtlTests.analyses
+
+import firrtl.analyses.InstanceKeyGraph
+import firrtl.analyses.InstanceKeyGraph.InstanceKey
+import firrtl.testutils.FirrtlFlatSpec
+
+class InstanceKeyGraphSpec extends FirrtlFlatSpec {
+ behavior of "InstanceKeyGraph"
+
+ // Note that due to optimized implementations of Map1-4, at least 5 entries are needed to
+ // experience non-determinism
+ it should "preserve Module declaration order" in {
+ val input = """
+ |circuit Top :
+ | module Top :
+ | inst c1 of Child1
+ | inst c2 of Child2
+ | module Child1 :
+ | inst a of Child1a
+ | inst b of Child1b
+ | skip
+ | module Child1a :
+ | skip
+ | module Child1b :
+ | skip
+ | module Child2 :
+ | skip
+ |""".stripMargin
+ val circuit = parse(input)
+ val instGraph = new InstanceKeyGraph(circuit)
+ val childMap = instGraph.getChildInstances
+ childMap.map(_._1) should equal (Seq("Top", "Child1", "Child1a", "Child1b", "Child2"))
+ }
+
+ // Note that due to optimized implementations of Map1-4, at least 5 entries are needed to
+ // experience non-determinism
+ it should "preserve Instance declaration order" in {
+ val input = """
+ |circuit Top :
+ | module Top :
+ | inst a of Child
+ | inst b of Child
+ | inst c of Child
+ | inst d of Child
+ | inst e of Child
+ | inst f of Child
+ | module Child :
+ | skip
+ |""".stripMargin
+ val circuit = parse(input)
+ val instGraph = new InstanceKeyGraph(circuit)
+ val childMap = instGraph.getChildInstances.toMap
+ val insts = childMap("Top").map(_.name)
+ insts should equal (Seq("a", "b", "c", "d", "e", "f"))
+ }
+
+ it should "compute a correct and deterministic module order" in {
+ val input = """
+ |circuit Top :
+ | module Top :
+ | inst c1 of Child1
+ | inst c2 of Child2
+ | inst c4 of Child4
+ | inst c3 of Child3
+ | module Child1 :
+ | inst a of Child1a
+ | inst b of Child1b
+ | skip
+ | module Child1a :
+ | skip
+ | module Child1b :
+ | skip
+ | module Child2 :
+ | skip
+ | module Child3 :
+ | skip
+ | module Child4 :
+ | skip
+ |""".stripMargin
+ val circuit = parse(input)
+ val instGraph = new InstanceKeyGraph(circuit)
+ val order = instGraph.moduleOrder.map(_.name)
+ // Where it has freedom, the instance declaration order will be reversed.
+ order should equal (Seq("Top", "Child3", "Child4", "Child2", "Child1", "Child1b", "Child1a"))
+ }
+
+ it should "find hierarchical instances correctly in disconnected hierarchies" in {
+ val input =
+ """circuit Top :
+ | module Top :
+ | inst c of Child1
+ | module Child1 :
+ | skip
+ |
+ | module Top2 :
+ | inst a of Child2
+ | inst b of Child3
+ | skip
+ | module Child2 :
+ | inst a of Child2a
+ | inst b of Child2b
+ | skip
+ | module Child2a :
+ | skip
+ | module Child2b :
+ | skip
+ | module Child3 :
+ | skip
+ |""".stripMargin
+
+ val circuit = parse(input)
+ val iGraph = new InstanceKeyGraph(circuit)
+ iGraph.findInstancesInHierarchy("Top") shouldBe Seq(Seq(InstanceKey("Top", "Top")))
+ iGraph.findInstancesInHierarchy("Child1") shouldBe Seq(Seq(InstanceKey("Top", "Top"), InstanceKey("c", "Child1")))
+ iGraph.findInstancesInHierarchy("Top2") shouldBe Nil
+ iGraph.findInstancesInHierarchy("Child2") shouldBe Nil
+ iGraph.findInstancesInHierarchy("Child2a") shouldBe Nil
+ iGraph.findInstancesInHierarchy("Child2b") shouldBe Nil
+ iGraph.findInstancesInHierarchy("Child3") shouldBe Nil
+ }
+
+}