diff options
| author | Albert Magyar | 2020-08-28 15:01:56 -0700 |
|---|---|---|
| committer | Albert Magyar | 2020-08-28 17:19:48 -0700 |
| commit | c8f22cf195eb2e096d95b298c69142b303a7c7a0 (patch) | |
| tree | 1d2a34d7227eb479a0cf27a7fa87d71d4837ba39 | |
| parent | 318da49f7cb88ce33dcf1418f8b63c0b236be9a8 (diff) | |
Restrict boolean inlining to avoid context-sensitive width bugs
* Restore depth-agnostic inlining for simple 'lhs = ref' bool assignments
* Address review comments
* Run scalafmt
| -rw-r--r-- | src/main/scala/firrtl/transforms/InlineBooleanExpressions.scala | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/main/scala/firrtl/transforms/InlineBooleanExpressions.scala b/src/main/scala/firrtl/transforms/InlineBooleanExpressions.scala index 7c52d6ef..c02b8dd5 100644 --- a/src/main/scala/firrtl/transforms/InlineBooleanExpressions.scala +++ b/src/main/scala/firrtl/transforms/InlineBooleanExpressions.scala @@ -83,11 +83,22 @@ class InlineBooleanExpressions extends Transform with DependencyAPIMigration { /** Whether or not an can be inlined * @param refExpr the expression to check for inlining + * @param outerExpr the parent expression of refExpr, if any */ - def canInline(refExpr: Expression): Boolean = { - refExpr match { - case _: Mux => false - case _ => refExpr.tpe == Utils.BoolType + def canInline(refExpr: Expression, outerExpr: Option[Expression]): Boolean = { + val contextInsensitiveDetOps: Set[PrimOp] = Set(Lt, Leq, Gt, Geq, Eq, Neq, Andr, Orr, Xorr) + outerExpr match { + case None => true + case Some(o) if (o.tpe == Utils.BoolType) => + refExpr match { + case _: Mux => false + case e => e.tpe == Utils.BoolType + } + case Some(o) => + refExpr match { + case DoPrim(op, _, _, Utils.BoolType) => contextInsensitiveDetOps(op) + case _ => false + } } } @@ -105,7 +116,8 @@ class InlineBooleanExpressions extends Transform with DependencyAPIMigration { netlist.get(we(ref)) match { case Some((refExpr, refInfo)) if sameFileAndLineInfo(info, refInfo) => val inlineNum = inlineCounts.getOrElse(refKey, 1) - if (!outerExpr.isDefined || canInline(refExpr) && ((inlineNum + inlineCount) <= maxInlineCount)) { + val notTooDeep = !outerExpr.isDefined || ((inlineNum + inlineCount) <= maxInlineCount) + if (canInline(refExpr, outerExpr) && notTooDeep) { inlineCount += inlineNum refExpr } else { |
