From 2b405652a266114377816b8175ef9fad7d36ed14 Mon Sep 17 00:00:00 2001 From: Jack Koenig Date: Mon, 2 Jul 2018 17:18:32 -0700 Subject: Make ZeroWidth properly rename removed empty aggregates (#839) Fixes #756--- src/main/scala/firrtl/passes/ZeroWidth.scala | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/main/scala') diff --git a/src/main/scala/firrtl/passes/ZeroWidth.scala b/src/main/scala/firrtl/passes/ZeroWidth.scala index a8e6141c..12da7d9b 100644 --- a/src/main/scala/firrtl/passes/ZeroWidth.scala +++ b/src/main/scala/firrtl/passes/ZeroWidth.scala @@ -55,13 +55,27 @@ object ZeroWidth extends Transform { state.copy(circuit = result) } + // This is slightly different and specialized version of create_exps, TODO unify? + private def findRemovable(expr: => Expression, tpe: Type): Seq[Expression] = tpe match { + case GroundType(width) => width match { + case IntWidth(ZERO) => List(expr) + case _ => List.empty + } + case BundleType(fields) => + if (fields.isEmpty) List(expr) + else fields.flatMap(f => findRemovable(WSubField(expr, f.name, f.tpe, MALE), f.tpe)) + case VectorType(vtpe, size) => + if (size == 0) List(expr) + else findRemovable(WSubIndex(expr, 0, vtpe, MALE), vtpe).flatMap { e => + (0 until size).map(i => e.asInstanceOf[WSubIndex].copy(value = i)) + } + } + private val ZERO = BigInt(0) private def getRemoved(x: IsDeclaration): Seq[String] = { var removedNames: Seq[String] = Seq.empty def onType(name: String)(t: Type): Type = { - removedNames = Utils.create_exps(name, t) map {e => (e, e.tpe)} collect { - case (e, GroundType(IntWidth(ZERO))) => e.serialize - } + removedNames = findRemovable(WRef(name), t).map(_.serialize) t } x match { -- cgit v1.2.3