diff options
| author | David Biancolin | 2019-01-21 18:50:51 -0500 |
|---|---|---|
| committer | GitHub | 2019-01-21 18:50:51 -0500 |
| commit | 10586d6a141859b843057ec9979011e26ad207f1 (patch) | |
| tree | ff23c30013159cdd1879b1e5c3dd5baca5bf4867 /src/main/scala/firrtl/passes | |
| parent | 73ae6257fce586ac145b6ab348ce1b47634e7a46 (diff) | |
| parent | df3a34f01d227ff9ad0e63a41ff10001ac01c01d (diff) | |
Merge branch 'master' into top-wiring-aggregates
Diffstat (limited to 'src/main/scala/firrtl/passes')
| -rw-r--r-- | src/main/scala/firrtl/passes/RemoveCHIRRTL.scala | 6 | ||||
| -rw-r--r-- | src/main/scala/firrtl/passes/Uniquify.scala | 35 |
2 files changed, 27 insertions, 14 deletions
diff --git a/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala b/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala index cc69be6f..5a9a60f8 100644 --- a/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala +++ b/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala @@ -103,7 +103,11 @@ object RemoveCHIRRTL extends Transform { rds map (_.name), wrs map (_.name), rws map (_.name)) Block(mem +: stmts) case sx: CDefMPort => - types(sx.name) = types(sx.mem) + types.get(sx.mem) match { + case Some(mem) => types(sx.name) = mem + case None => + throw new PassException(s"Undefined memory ${sx.mem} referenced by mport ${sx.name}") + } val addrs = ArrayBuffer[String]() val clks = ArrayBuffer[String]() val ens = ArrayBuffer[String]() diff --git a/src/main/scala/firrtl/passes/Uniquify.scala b/src/main/scala/firrtl/passes/Uniquify.scala index 2b6fa55d..c13fa261 100644 --- a/src/main/scala/firrtl/passes/Uniquify.scala +++ b/src/main/scala/firrtl/passes/Uniquify.scala @@ -3,14 +3,16 @@ package firrtl.passes import com.typesafe.scalalogging.LazyLogging -import scala.annotation.tailrec +import scala.annotation.tailrec import firrtl._ import firrtl.ir._ import firrtl.Utils._ import firrtl.Mappers._ import MemPortUtils.memType +import scala.collection.mutable + /** Resolve name collisions that would occur in [[LowerTypes]] * * @note Must be run after [[InferTypes]] because [[ir.DefNode]]s need type @@ -78,36 +80,43 @@ object Uniquify extends Transform { t: BundleType, namespace: collection.mutable.HashSet[String]) (implicit sinfo: Info, mname: String): BundleType = { - def recUniquifyNames(t: Type, namespace: collection.mutable.HashSet[String]): Type = t match { + def recUniquifyNames(t: Type, namespace: collection.mutable.HashSet[String]): (Type, Seq[String]) = t match { case tx: BundleType => // First add everything - val newFields = tx.fields map { f => + val newFieldsAndElts = tx.fields map { f => val newName = findValidPrefix(f.name, Seq(""), namespace) namespace += newName Field(newName, f.flip, f.tpe) } map { f => f.tpe match { - case _: GroundType => f + case _: GroundType => (f, Seq[String](f.name)) case _ => - val tpe = recUniquifyNames(f.tpe, collection.mutable.HashSet()) - val elts = enumerateNames(tpe) + val (tpe, eltsx) = recUniquifyNames(f.tpe, collection.mutable.HashSet()) // Need leading _ for findValidPrefix, it doesn't add _ for checks - val eltsNames = elts map (e => "_" + LowerTypes.loweredName(e)) + val eltsNames: Seq[String] = eltsx map (e => "_" + e) val prefix = findValidPrefix(f.name, eltsNames, namespace) // We added f.name in previous map, delete if we change it if (prefix != f.name) { namespace -= f.name namespace += prefix } - namespace ++= (elts map (e => LowerTypes.loweredName(prefix +: e))) - Field(prefix, f.flip, tpe) + val newElts: Seq[String] = eltsx map (e => LowerTypes.loweredName(prefix +: Seq(e))) + namespace ++= newElts + (Field(prefix, f.flip, tpe), prefix +: newElts) } } - BundleType(newFields) + val (newFields, elts) = newFieldsAndElts.unzip + (BundleType(newFields), elts.flatten) case tx: VectorType => - VectorType(recUniquifyNames(tx.tpe, namespace), tx.size) - case tx => tx + val (tpe, elts) = recUniquifyNames(tx.tpe, namespace) + val newElts = ((0 until tx.size) map (i => i.toString)) ++ + ((0 until tx.size) flatMap { i => + elts map (e => LowerTypes.loweredName(Seq(i.toString, e))) + }) + (VectorType(tpe, tx.size), newElts) + case tx => (tx, Nil) } - recUniquifyNames(t, namespace) match { + val (tpe, _) = recUniquifyNames(t, namespace) + tpe match { case tx: BundleType => tx case tx => throwInternalError(s"uniquifyNames: shouldn't be here - $tx") } |
