From f8546a7c165e0bde4b3e5682dd6edd0a3e199b31 Mon Sep 17 00:00:00 2001 From: Jack Koenig Date: Mon, 13 Apr 2020 21:23:54 -0700 Subject: Allow casts in AsyncReset literal value check (#1523) Chisel emits all literals as UInts cast to the correct type, make CheckResets support casts when checking that async reset registers are reset to literal values. Co-authored-by: Schuyler Eldridge --- src/main/scala/firrtl/checks/CheckResets.scala | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src/main') diff --git a/src/main/scala/firrtl/checks/CheckResets.scala b/src/main/scala/firrtl/checks/CheckResets.scala index 406b7f62..facd5c01 100644 --- a/src/main/scala/firrtl/checks/CheckResets.scala +++ b/src/main/scala/firrtl/checks/CheckResets.scala @@ -6,10 +6,12 @@ import firrtl._ import firrtl.options.{Dependency, PreservesAll} import firrtl.passes.{Errors, PassException} import firrtl.ir._ +import firrtl.Utils.isCast import firrtl.traversals.Foreachers._ import firrtl.WrappedExpression._ import scala.collection.mutable +import scala.annotation.tailrec object CheckResets { class NonLiteralAsyncResetValueException(info: Info, mname: String, reg: String, init: String) extends PassException( @@ -52,12 +54,15 @@ class CheckResets extends Transform with PreservesAll[Transform] { stmt.foreach(onStmt(regCheck, drivers)) } - private def findDriver(drivers: DirectDriverMap)(expr: Expression): Expression = - drivers.get(we(expr)) match { - case Some(lit: Literal) => lit - case Some(other) => findDriver(drivers)(other) - case None => expr - } + @tailrec + private def findDriver(drivers: DirectDriverMap)(expr: Expression): Expression = expr match { + case lit: Literal => lit + case DoPrim(op, args, _,_) if isCast(op) => findDriver(drivers)(args.head) + case other => drivers.get(we(other)) match { + case Some(e) => findDriver(drivers)(e) + case None => other + } + } private def onMod(errors: Errors)(mod: DefModule): Unit = { val regCheck = new RegCheckList() -- cgit v1.2.3