diff options
| author | Richard Lin | 2019-04-01 14:00:55 -0700 |
|---|---|---|
| committer | GitHub | 2019-04-01 14:00:55 -0700 |
| commit | 9f77bf54543724594711f0455ef91f51edfbd22e (patch) | |
| tree | d61325c120a65ad6e12e1772dc92ceef86f1a872 /chiselFrontend | |
| parent | 69e8250dd47210cee809c9ae231c1e320d76c084 (diff) | |
Detect bundle aliasing (#1050)
Diffstat (limited to 'chiselFrontend')
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala index 7a6b9b56..51b45828 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala @@ -12,6 +12,8 @@ import chisel3.internal.firrtl._ import chisel3.internal.sourceinfo._ import chisel3.SourceInfoDoc +class AliasedAggregateFieldException(message: String) extends ChiselException(message) + /** An abstract class for data types that solely consist of (are an aggregate * of) other Data objects. */ @@ -20,6 +22,10 @@ sealed abstract class Aggregate extends Data { binding = target val resolvedDirection = SpecifiedDirection.fromParent(parentDirection, specifiedDirection) + val duplicates = getElements.groupBy(identity).collect { case (x, elts) if elts.size > 1 => x } + if (!duplicates.isEmpty) { + throw new AliasedAggregateFieldException(s"Aggregate $this contains aliased fields $duplicates") + } for (child <- getElements) { child.bind(ChildBinding(this), resolvedDirection) } @@ -589,15 +595,13 @@ abstract class Bundle(implicit compileOptions: CompileOptions) extends Record { */ final lazy val elements: ListMap[String, Data] = { val nameMap = LinkedHashMap[String, Data]() - val seen = HashSet[Data]() for (m <- getPublicFields(classOf[Bundle])) { getBundleField(m) match { case Some(d: Data) => if (nameMap contains m.getName) { require(nameMap(m.getName) eq d) - } else if (!seen(d)) { + } else { nameMap(m.getName) = d - seen += d } case None => if (!ignoreSeq) { |
