summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala2
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/Builder.scala10
2 files changed, 7 insertions, 5 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
index 131719f1..92cf658d 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
@@ -411,7 +411,7 @@ abstract class Record extends Aggregate {
// identifier; however, Namespace sanitizes identifiers to make them legal for Firrtl/Verilog
// which can cause collisions
val _namespace = Namespace.empty
- for ((name, elt) <- elements) { elt.setRef(this, _namespace.name(name)) }
+ for ((name, elt) <- elements) { elt.setRef(this, _namespace.name(name, leadingDigitOk=true)) }
}
private[chisel3] final def allElements: Seq[Element] = elements.toIndexedSeq.flatMap(_._2.allElements)
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
index 147fa7d4..e0cbf302 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
@@ -21,18 +21,20 @@ private[chisel3] class Namespace(keywords: Set[String]) {
if (this contains tryName) rename(n) else tryName
}
- private def sanitize(s: String): String = {
+ private def sanitize(s: String, leadingDigitOk: Boolean = false): String = {
// TODO what character set does FIRRTL truly support? using ANSI C for now
def legalStart(c: Char) = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'
def legal(c: Char) = legalStart(c) || (c >= '0' && c <= '9')
val res = s filter legal
- if (res.isEmpty || !legalStart(res.head)) s"_$res" else res
+ val headOk = (!res.isEmpty) && (leadingDigitOk || legalStart(res.head))
+ if (headOk) res else s"_$res"
}
def contains(elem: String): Boolean = names.contains(elem)
- def name(elem: String): String = {
- val sanitized = sanitize(elem)
+ // leadingDigitOk is for use in fields of Records
+ def name(elem: String, leadingDigitOk: Boolean = false): String = {
+ val sanitized = sanitize(elem, leadingDigitOk)
if (this contains sanitized) {
name(rename(sanitized))
} else {