From fe2f9e6a82dd222d5aecf2fcbc6880768346a4e1 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Fri, 11 Jan 2019 15:05:28 -0800 Subject: Move nameRecursively into Builder so it can be used elsewhere --- .../src/main/scala/chisel3/internal/Builder.scala | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'chiselFrontend/src/main/scala/chisel3/internal') diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala index ce4e1e88..0938ea9e 100644 --- a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala +++ b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala @@ -294,6 +294,21 @@ private[chisel3] object Builder { lastStack } + /** Recursively suggests names to supported "container" classes + * Arbitrary nestings of supported classes are allowed so long as the + * innermost element is of type HasId + * (Note: Map is Iterable[Tuple2[_,_]] and thus excluded) + */ + def nameRecursively(prefix: String, nameMe: Any, namer: (HasId, String) => Unit): Unit = nameMe match { + case (id: HasId) => namer(id, prefix) + case Some(elt) => nameRecursively(prefix, elt, namer) + case (iter: Iterable[_]) if iter.hasDefiniteSize => + for ((elt, i) <- iter.zipWithIndex) { + nameRecursively(s"${prefix}_${i}", elt, namer) + } + case _ => // Do nothing + } + def errors: ErrorLog = dynamicContext.errors def error(m: => String): Unit = if (dynamicContextVar.value.isDefined) errors.error(m) def warning(m: => String): Unit = if (dynamicContextVar.value.isDefined) errors.warning(m) -- cgit v1.2.3 From aa4983bf42271f6bd97765d1b87e7072ff00a031 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Fri, 11 Jan 2019 15:05:55 -0800 Subject: For chiselName, use nameRecursively rather than matching on HasId --- chiselFrontend/src/main/scala/chisel3/internal/Namer.scala | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'chiselFrontend/src/main/scala/chisel3/internal') diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala b/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala index a7196a22..79b48b1e 100644 --- a/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala +++ b/chiselFrontend/src/main/scala/chisel3/internal/Namer.scala @@ -84,10 +84,7 @@ class NamingContext { closed = true for ((ref, suffix) <- items) { // First name the top-level object - ref match { - case nameable: chisel3.internal.HasId => nameable.suggestName(prefix + suffix) - case _ => - } + chisel3.internal.Builder.nameRecursively(prefix + suffix, ref, (id, name) => id.suggestName(name)) // Then recurse into descendant contexts if (descendants.containsKey(ref)) { -- cgit v1.2.3