diff options
4 files changed, 38 insertions, 10 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala index e03694a9..b5f617f0 100644 --- a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala +++ b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala @@ -440,6 +440,8 @@ object DynamicNamingStack { } prefixRef } + + def length() : Int = Builder.namingStackOption.get.length } /** Casts BigInt to Int, issuing an error when the input isn't representable. */ diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala b/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala index e6c8d473..353e51fd 100644 --- a/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala +++ b/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala @@ -147,4 +147,6 @@ class NamingStack { namingStack.top.addDescendant(prefixRef, until) } } + + def length() : Int = namingStack.length } diff --git a/coreMacros/src/main/scala/chisel3/internal/sourceinfo/NamingAnnotations.scala b/coreMacros/src/main/scala/chisel3/internal/sourceinfo/NamingAnnotations.scala index b4c79ac5..bf4879ec 100644 --- a/coreMacros/src/main/scala/chisel3/internal/sourceinfo/NamingAnnotations.scala +++ b/coreMacros/src/main/scala/chisel3/internal/sourceinfo/NamingAnnotations.scala @@ -76,7 +76,7 @@ class NamingTransforms(val c: Context) { /** Module-specific val name transform, containing logic to prevent from recursing into inner * classes and applies the naming transform on inner functions. */ - class ModuleTransformer(val contextVar: TermName) extends ValNameTransformer { + class ClassBodyTransformer(val contextVar: TermName) extends ValNameTransformer { override def transform(tree: Tree): Tree = tree match { case q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$stats }" => // scalastyle:ignore line.size.limit tree // don't recurse into inner classes @@ -112,18 +112,23 @@ class NamingTransforms(val c: Context) { } } - /** Applies the val name transform to a module body. Pretty straightforward, since Module is - * the naming top level. + /** Applies the val name transform to a class body. + * Closes context on top level or return local context to englobing context. + * Closing context only makes sense when top level a Module. + * A Module is always the naming top level. + * Transformed classes can be either Module or standard class. */ - def transformModuleBody(stats: List[c.Tree]): Tree = { + def transformClassBody(stats: List[c.Tree]): Tree = { val contextVar = TermName(c.freshName("namingContext")) - val transformedBody = (new ModuleTransformer(contextVar)).transformTrees(stats) - + val transformedBody = (new ClassBodyTransformer(contextVar)).transformTrees(stats) + // Note: passing "this" to popReturnContext is mandatory for propagation through non-module classes q""" val $contextVar = $globalNamingStack.pushContext() ..$transformedBody - $contextVar.namePrefix("") - $globalNamingStack.popReturnContext((), $contextVar) + if($globalNamingStack.length == 1){ + $contextVar.namePrefix("") + } + $globalNamingStack.popReturnContext(this, $contextVar) """ } @@ -161,7 +166,7 @@ class NamingTransforms(val c: Context) { val transformed = annottees.map(annottee => annottee match { // scalastyle:off line.size.limit case q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$stats }" => { - val transformedStats = transformModuleBody(stats) + val transformedStats = transformClassBody(stats) namedElts += 1 q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$transformedStats }" } diff --git a/src/test/scala/chiselTests/NamingAnnotationTest.scala b/src/test/scala/chiselTests/NamingAnnotationTest.scala index 4576176a..e35c77c1 100644 --- a/src/test/scala/chiselTests/NamingAnnotationTest.scala +++ b/src/test/scala/chiselTests/NamingAnnotationTest.scala @@ -47,6 +47,21 @@ trait NamedModuleTester extends MultiIOModule { failures.toList } } +@chiselName +class OuterNamedNonModule { + val value = Wire(Bool()) +} + +@chiselName +class NonModule { + val value = Wire(Bool()) + @chiselName + class InnerNamedNonModule { + val value = Wire(Bool()) + } + val inner = new InnerNamedNonModule + val outer = new OuterNamedNonModule +} @chiselName class NamedModule extends NamedModuleTester { @@ -84,10 +99,14 @@ class NamedModule extends NamedModuleTester { val noreturn = expectName(1.U + 2.U, "noreturn") } - val test = expectName(FunctionMockup(), "test") val test2 = expectName(test +& 2.U, "test2") val test3 = expectName(ImplicitlyNamed(), "test3") + + val test4 = new NonModule + expectName(test4.value, "test4_value") + expectName(test4.inner.value, "test4_inner_value") + expectName(test4.outer.value, "test4_outer_value") // Test that contents of for loops are named for (i <- 0 until 1) { |
