diff options
| author | azidar | 2016-02-08 14:55:21 -0800 |
|---|---|---|
| committer | azidar | 2016-02-09 18:57:07 -0800 |
| commit | bae6ba5d2405ba1caf7400f15d8875d4a79b8bae (patch) | |
| tree | 55345b1d4997c394efb4e6cdd83cd732807d7368 /src/main/scala/firrtl/WIR.scala | |
| parent | 666a193706308a6fbd6c8b4bd06cbc69ae4200a6 (diff) | |
More bug fixes
Diffstat (limited to 'src/main/scala/firrtl/WIR.scala')
| -rw-r--r-- | src/main/scala/firrtl/WIR.scala | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/main/scala/firrtl/WIR.scala b/src/main/scala/firrtl/WIR.scala index 8ebfa9a6..bbe6a235 100644 --- a/src/main/scala/firrtl/WIR.scala +++ b/src/main/scala/firrtl/WIR.scala @@ -3,6 +3,7 @@ package firrtl import scala.collection.Seq import Utils._ +import WrappedExpression._ trait Kind case class WireKind() extends Kind @@ -46,19 +47,19 @@ class WrappedExpression (val e1:Expression) { case (e1:SIntValue,e2:SIntValue) => if (e1.value == e2.value) true else false // TODO is this necessary? width(e1) == width(e2) case (e1:WRef,e2:WRef) => e1.name equals e2.name - case (e1:WSubField,e2:WSubField) => (e1.name equals e2.name) && (e1.exp == e2.exp) - case (e1:WSubIndex,e2:WSubIndex) => (e1.value == e2.value) && (e1.exp == e2.exp) - case (e1:WSubAccess,e2:WSubAccess) => (e1.index == e2.index) && (e1.exp == e2.exp) + case (e1:WSubField,e2:WSubField) => (e1.name equals e2.name) && weq(e1.exp,e2.exp) + case (e1:WSubIndex,e2:WSubIndex) => (e1.value == e2.value) && weq(e1.exp,e2.exp) + case (e1:WSubAccess,e2:WSubAccess) => weq(e1.index,e2.index) && weq(e1.exp,e2.exp) case (e1:WVoid,e2:WVoid) => true case (e1:WInvalid,e2:WInvalid) => true case (e1:DoPrim,e2:DoPrim) => { var are_equal = e1.op == e2.op - (e1.args,e2.args).zipped.foreach{ (x,y) => { if (x != y) are_equal = false }} + (e1.args,e2.args).zipped.foreach{ (x,y) => { if (!weq(x,y)) are_equal = false }} (e1.consts,e2.consts).zipped.foreach{ (x,y) => { if (x != y) are_equal = false }} are_equal } - case (e1:Mux,e2:Mux) => (e1.cond == e2.cond) && (e1.tval == e2.tval) && (e1.fval == e2.fval) - case (e1:ValidIf,e2:ValidIf) => (e1.cond == e2.cond) && (e1.value == e2.value) + case (e1:Mux,e2:Mux) => weq(e1.cond,e2.cond) && weq(e1.tval,e2.tval) && weq(e1.fval,e2.fval) + case (e1:ValidIf,e2:ValidIf) => weq(e1.cond,e2.cond) && weq(e1.value,e2.value) case (e1,e2) => false } } @@ -119,6 +120,7 @@ class WrappedWidth (val w:Width) { def eq (w1:Width,w2:Width) : Boolean = { (new WrappedWidth(w1)) == (new WrappedWidth(w2)) } + def ww (w:Width) : WrappedWidth = new WrappedWidth(w) override def equals (o:Any) : Boolean = { o match { case (w2:WrappedWidth) => { @@ -150,10 +152,10 @@ class WrappedWidth (val w:Width) { } case (w1:IntWidth,w2:IntWidth) => w1.width == w2.width case (w1:PlusWidth,w2:PlusWidth) => - (w1.arg1 == w2.arg1 && w1.arg2 == w2.arg2) || (w1.arg1 == w2.arg2 && w1.arg2 == w2.arg1) + (ww(w1.arg1) == ww(w2.arg1) && ww(w1.arg2) == ww(w2.arg2)) || (ww(w1.arg1) == ww(w2.arg2) && ww(w1.arg2) == ww(w2.arg1)) case (w1:MinusWidth,w2:MinusWidth) => - (w1.arg1 == w2.arg1 && w1.arg2 == w2.arg2) || (w1.arg1 == w2.arg2 && w1.arg2 == w2.arg1) - case (w1:ExpWidth,w2:ExpWidth) => w1.arg1 == w2.arg1 + (ww(w1.arg1) == ww(w2.arg1) && ww(w1.arg2) == ww(w2.arg2)) || (ww(w1.arg1) == ww(w2.arg2) && ww(w1.arg2) == ww(w2.arg1)) + case (w1:ExpWidth,w2:ExpWidth) => ww(w1.arg1) == ww(w2.arg1) case (w1:UnknownWidth,w2:UnknownWidth) => true case (w1,w2) => false } |
