From 25a84b5667614ea3f437b656f1939caba57e6f66 Mon Sep 17 00:00:00 2001 From: Jack Koenig Date: Tue, 29 Jun 2021 16:39:45 -0700 Subject: 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. --- src/main/scala/chisel3/aop/Select.scala | 7 ++++--- src/test/scala/chiselTests/aop/SelectSpec.scala | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'src') 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)) } } -- cgit v1.2.3