diff options
Diffstat (limited to 'src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala')
| -rw-r--r-- | src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala b/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala index 1fe9a723..8aa1553a 100644 --- a/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala +++ b/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala @@ -1,3 +1,5 @@ +// See LICENSE for license details. + package firrtl package transforms @@ -24,10 +26,22 @@ object ReplaceTruncatingArithmetic { */ def onExpr(netlist: Netlist)(expr: Expression): Expression = expr.map(onExpr(netlist)) match { + // If an unsigned wrapping add/sub case orig @ DoPrim(Tail, Seq(e), SeqBIOne, tailtpe) => netlist.getOrElse(we(e), e) match { - case DoPrim(Add, args, cs, _) => DoPrim(Addw, args, cs, tailtpe) - case DoPrim(Sub, args, cs, _) => DoPrim(Subw, args, cs, tailtpe) + case DoPrim(Add, args, cs, u: UIntType) => DoPrim(Addw, args, cs, tailtpe) + case DoPrim(Sub, args, cs, u: UIntType) => DoPrim(Subw, args, cs, tailtpe) + case _ => orig // Not a candidate + } + // If a signed wrapping add/sub, there should be a cast + case orig @ DoPrim(AsSInt, Seq(x), _, casttpe) => + netlist.getOrElse(we(x), x) match { + case DoPrim(Tail, Seq(e), SeqBIOne, tailtpe) => + netlist.getOrElse(we(e), e) match { + case DoPrim(Add, args, cs, s: SIntType) => DoPrim(Addw, args, cs, casttpe) + case DoPrim(Sub, args, cs, s: SIntType) => DoPrim(Subw, args, cs, casttpe) + case _ => orig // Not a candidate + } case _ => orig // Not a candidate } case other => other // Not a candidate |
