summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJack Koenig2021-06-29 16:39:45 -0700
committerJack Koenig2021-06-29 16:55:15 -0700
commit25a84b5667614ea3f437b656f1939caba57e6f66 (patch)
treed5dbd592ceed3040209bb74dfe1928b983052c08 /src
parent0531cb53d3cedaff33c2a280e34418f6af5bc6a1 (diff)
Change behavior of aop.Select to not include CloneModuleAsRecord
Previously, CloneModuleAsRecord clones would result in the same BaseModule object coming up multiple times when using APIs like .instances, .collectDeep, and .getDeep. This was not the intended behavior and can lead to very subtle bugs.
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/chisel3/aop/Select.scala7
-rw-r--r--src/test/scala/chiselTests/aop/SelectSpec.scala7
2 files changed, 8 insertions, 6 deletions
diff --git a/src/main/scala/chisel3/aop/Select.scala b/src/main/scala/chisel3/aop/Select.scala
index 08cf40ff..a16c415c 100644
--- a/src/main/scala/chisel3/aop/Select.scala
+++ b/src/main/scala/chisel3/aop/Select.scala
@@ -82,11 +82,12 @@ object Select {
def instances(module: BaseModule): Seq[BaseModule] = {
check(module)
module._component.get match {
- case d: DefModule => d.commands.collect {
+ case d: DefModule => d.commands.flatMap {
case i: DefInstance => i.id match {
- case clone: ModuleClone => clone._proto
- case other => other
+ case _: ModuleClone => None
+ case other => Some(other)
}
+ case _ => None
}
case other => Nil
}
diff --git a/src/test/scala/chiselTests/aop/SelectSpec.scala b/src/test/scala/chiselTests/aop/SelectSpec.scala
index d34f4391..14ae202d 100644
--- a/src/test/scala/chiselTests/aop/SelectSpec.scala
+++ b/src/test/scala/chiselTests/aop/SelectSpec.scala
@@ -153,7 +153,7 @@ class SelectSpec extends ChiselFlatSpec {
assert(bbs.size == 1)
}
- "CloneModuleAsRecord" should "show up in Select aspects as duplicates" in {
+ "CloneModuleAsRecord" should "NOT show up in Select aspects" in {
import chisel3.experimental.CloneModuleAsRecord
class Child extends RawModule {
val in = IO(Input(UInt(8.W)))
@@ -174,8 +174,9 @@ class SelectSpec extends ChiselFlatSpec {
}).elaborate
.collectFirst { case DesignAnnotation(design: Top) => design }
.get
- val mods = Select.collectDeep(top) { case mod => mod }
- mods should equal (Seq(top, top.inst0, top.inst0))
+ Select.collectDeep(top) { case x => x } should equal (Seq(top, top.inst0))
+ Select.getDeep(top)(x => Seq(x)) should equal (Seq(top, top.inst0))
+ Select.instances(top) should equal (Seq(top.inst0))
}
}