From 50e091c3b59802b6fdd7204458b6ef215ce56966 Mon Sep 17 00:00:00 2001 From: Aditya Naik Date: Mon, 24 Nov 2025 22:52:29 -0800 Subject: [PATCH 1/5] Add transparent inline to Module constructor --- core/src/main/scala-3/chisel3/ModuleIntf.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala-3/chisel3/ModuleIntf.scala b/core/src/main/scala-3/chisel3/ModuleIntf.scala index 72a6e6a0772..0bbd7f38195 100644 --- a/core/src/main/scala-3/chisel3/ModuleIntf.scala +++ b/core/src/main/scala-3/chisel3/ModuleIntf.scala @@ -4,7 +4,7 @@ package chisel3 import chisel3.experimental.{BaseModule, SourceInfo} -private[chisel3] trait Module$Intf extends SourceInfoDoc { self: Module.type => +transparent private[chisel3] trait Module$Intf extends SourceInfoDoc { self: Module.type => /** A wrapper method that all Module instantiations must be wrapped in * (necessary to help Chisel track internal state). @@ -15,5 +15,5 @@ private[chisel3] trait Module$Intf extends SourceInfoDoc { self: Module.type => */ // TODO(adkian-sifive) the callsite here explicitly passes // sourceInfo so it cannot be a contextual parameter - def apply[T <: BaseModule](bc: => T): T = _applyImpl(bc) + transparent inline def apply[T <: BaseModule](inline bc: => T): T = _applyImpl(bc) } From 8f63a1fcddbaf8f821b27c0dedba54e4fcbede07 Mon Sep 17 00:00:00 2001 From: Aditya Naik Date: Mon, 24 Nov 2025 23:04:53 -0800 Subject: [PATCH 2/5] Add trait Selectable to Module --- core/src/main/scala/chisel3/Module.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/chisel3/Module.scala b/core/src/main/scala/chisel3/Module.scala index ccec2281e0c..0e5ff740316 100644 --- a/core/src/main/scala/chisel3/Module.scala +++ b/core/src/main/scala/chisel3/Module.scala @@ -413,7 +413,7 @@ package experimental { /** Abstract base class for Modules, an instantiable organizational unit for RTL. */ // TODO: seal this? - abstract class BaseModule extends HasId with IsInstantiable { + abstract class BaseModule extends HasId with IsInstantiable with Selectable { _parent.foreach(_.addId(this)) // Set if the returned top-level module of a nested call to the Chisel Builder, see Definition.apply From 2f25686933218e9e528221411705fb36c94fed50 Mon Sep 17 00:00:00 2001 From: Aditya Naik Date: Tue, 25 Nov 2025 12:20:08 -0800 Subject: [PATCH 3/5] Undo ModuleIntf changes --- core/src/main/scala-3/chisel3/ModuleIntf.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala-3/chisel3/ModuleIntf.scala b/core/src/main/scala-3/chisel3/ModuleIntf.scala index 0bbd7f38195..72a6e6a0772 100644 --- a/core/src/main/scala-3/chisel3/ModuleIntf.scala +++ b/core/src/main/scala-3/chisel3/ModuleIntf.scala @@ -4,7 +4,7 @@ package chisel3 import chisel3.experimental.{BaseModule, SourceInfo} -transparent private[chisel3] trait Module$Intf extends SourceInfoDoc { self: Module.type => +private[chisel3] trait Module$Intf extends SourceInfoDoc { self: Module.type => /** A wrapper method that all Module instantiations must be wrapped in * (necessary to help Chisel track internal state). @@ -15,5 +15,5 @@ transparent private[chisel3] trait Module$Intf extends SourceInfoDoc { self: Mod */ // TODO(adkian-sifive) the callsite here explicitly passes // sourceInfo so it cannot be a contextual parameter - transparent inline def apply[T <: BaseModule](inline bc: => T): T = _applyImpl(bc) + def apply[T <: BaseModule](bc: => T): T = _applyImpl(bc) } From e659f70c4be1c6d5044f0664a437c60361c573ea Mon Sep 17 00:00:00 2001 From: Aditya Naik Date: Tue, 25 Nov 2025 13:26:05 -0800 Subject: [PATCH 4/5] Add scala.reflect.Selectable Update SelectableCompat --- core/src/main/scala-2/chisel3/SelectableCompat.scala | 11 ++++++++--- core/src/main/scala-3/chisel3/SelectableCompat.scala | 5 +++++ core/src/main/scala/chisel3/Module.scala | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 core/src/main/scala-3/chisel3/SelectableCompat.scala diff --git a/core/src/main/scala-2/chisel3/SelectableCompat.scala b/core/src/main/scala-2/chisel3/SelectableCompat.scala index 6075ae53cf3..3ad2fdad167 100644 --- a/core/src/main/scala-2/chisel3/SelectableCompat.scala +++ b/core/src/main/scala-2/chisel3/SelectableCompat.scala @@ -2,8 +2,13 @@ package chisel3 -/** Does nothing in Scala 2; this stub trait is for maintaining - * compatibility with Scala 3's selectable, required to support - * structurally-typed Bundles in Scala 3. +/** These traits do nothing in Scala 2 other than maintaining + * compatibility with Scala 3's Selectable and + * scala.reflect.Selectable, required to support structural selection + * in Scala 3. + * + * SelectableCompat => scala.reflect.Selectable + * Selectable => scala.Selectable */ +trait SelectableCompat trait Selectable diff --git a/core/src/main/scala-3/chisel3/SelectableCompat.scala b/core/src/main/scala-3/chisel3/SelectableCompat.scala new file mode 100644 index 00000000000..767da994939 --- /dev/null +++ b/core/src/main/scala-3/chisel3/SelectableCompat.scala @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + +package chisel3 + +trait SelectableCompat extends scala.reflect.Selectable diff --git a/core/src/main/scala/chisel3/Module.scala b/core/src/main/scala/chisel3/Module.scala index 0e5ff740316..bb15388c229 100644 --- a/core/src/main/scala/chisel3/Module.scala +++ b/core/src/main/scala/chisel3/Module.scala @@ -413,7 +413,7 @@ package experimental { /** Abstract base class for Modules, an instantiable organizational unit for RTL. */ // TODO: seal this? - abstract class BaseModule extends HasId with IsInstantiable with Selectable { + abstract class BaseModule extends HasId with IsInstantiable with SelectableCompat { _parent.foreach(_.addId(this)) // Set if the returned top-level module of a nested call to the Chisel Builder, see Definition.apply From 719a6995293d47d8174fe70b79700b688ef8bbf2 Mon Sep 17 00:00:00 2001 From: Aditya Naik <91489422+adkian-sifive@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:45:58 -0800 Subject: [PATCH 5/5] Code review updates --- .../main/scala-2/chisel3/SelectableCompat.scala | 17 ++++++++++------- .../main/scala-3/chisel3/SelectableCompat.scala | 2 +- core/src/main/scala/chisel3/Module.scala | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/core/src/main/scala-2/chisel3/SelectableCompat.scala b/core/src/main/scala-2/chisel3/SelectableCompat.scala index 3ad2fdad167..cb253dbc2ad 100644 --- a/core/src/main/scala-2/chisel3/SelectableCompat.scala +++ b/core/src/main/scala-2/chisel3/SelectableCompat.scala @@ -2,13 +2,16 @@ package chisel3 -/** These traits do nothing in Scala 2 other than maintaining - * compatibility with Scala 3's Selectable and - * scala.reflect.Selectable, required to support structural selection - * in Scala 3. +/** Shim for Scala 3's `scala.reflect.Selectable` * - * SelectableCompat => scala.reflect.Selectable - * Selectable => scala.Selectable + * Allows Chisel to cross-compile Scala 2 and Scala 3 + * while enabling structural typing in Scala 3. + */ +trait ReflectSelectable + +/** Shim for Scala 3's `scala.Selectable` + * + * Allows Chisel to cross-compile Scala 2 and Scala 3 + * while enabling structural typing in Scala 3. */ -trait SelectableCompat trait Selectable diff --git a/core/src/main/scala-3/chisel3/SelectableCompat.scala b/core/src/main/scala-3/chisel3/SelectableCompat.scala index 767da994939..cf8e3e830f2 100644 --- a/core/src/main/scala-3/chisel3/SelectableCompat.scala +++ b/core/src/main/scala-3/chisel3/SelectableCompat.scala @@ -2,4 +2,4 @@ package chisel3 -trait SelectableCompat extends scala.reflect.Selectable +type ReflectSelectable = scala.reflect.Selectable diff --git a/core/src/main/scala/chisel3/Module.scala b/core/src/main/scala/chisel3/Module.scala index bb15388c229..0d6de1bf3f6 100644 --- a/core/src/main/scala/chisel3/Module.scala +++ b/core/src/main/scala/chisel3/Module.scala @@ -413,7 +413,7 @@ package experimental { /** Abstract base class for Modules, an instantiable organizational unit for RTL. */ // TODO: seal this? - abstract class BaseModule extends HasId with IsInstantiable with SelectableCompat { + abstract class BaseModule extends HasId with IsInstantiable with ReflectSelectable { _parent.foreach(_.addId(this)) // Set if the returned top-level module of a nested call to the Chisel Builder, see Definition.apply