aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorJack Koenig2018-10-31 14:59:40 -0700
committerJack Koenig2018-10-31 15:22:26 -0700
commit9bc2e6daaf3a3a08aefe485aa924c820689de981 (patch)
tree5626a130bc1607e6a4c68eec864b7944f3a322e8 /src/main
parent8d599182114306f77d098ba7effa836328b1e802 (diff)
Remove all uses of get_flip and deprecate
It is O(n) and every use is in an O(n) iteration resulting in O(n^2). Same information can be extracted from create_exps which happens to also be called at every use of get_flip.
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/firrtl/Utils.scala1
-rw-r--r--src/main/scala/firrtl/passes/ExpandWhens.scala5
-rw-r--r--src/main/scala/firrtl/passes/InferWidths.scala8
-rw-r--r--src/main/scala/firrtl/passes/Passes.scala6
4 files changed, 10 insertions, 10 deletions
diff --git a/src/main/scala/firrtl/Utils.scala b/src/main/scala/firrtl/Utils.scala
index 53e8c157..44b16bf8 100644
--- a/src/main/scala/firrtl/Utils.scala
+++ b/src/main/scala/firrtl/Utils.scala
@@ -300,6 +300,7 @@ object Utils extends LazyLogging {
onExp(expression)
ReferenceTarget(main, module, Nil, ref, tokens)
}
+ @deprecated("get_flip is fundamentally slow, use to_flip(gender(expr))", "1.2")
def get_flip(t: Type, i: Int, f: Orientation): Orientation = {
if (i >= get_size(t)) throwInternalError(s"get_flip: shouldn't be here - $i >= get_size($t)")
t match {
diff --git a/src/main/scala/firrtl/passes/ExpandWhens.scala b/src/main/scala/firrtl/passes/ExpandWhens.scala
index 964b8494..9136c913 100644
--- a/src/main/scala/firrtl/passes/ExpandWhens.scala
+++ b/src/main/scala/firrtl/passes/ExpandWhens.scala
@@ -204,12 +204,11 @@ object ExpandWhens extends Pass {
/** Returns all references to all Female leaf subcomponents of a reference */
private def getFemaleRefs(n: String, t: Type, g: Gender): Seq[Expression] = {
- def getGender(t: Type, i: Int, g: Gender): Gender = times(g, get_flip(t, i, Default))
val exps = create_exps(WRef(n, t, ExpKind, g))
- exps.zipWithIndex.flatMap { case (exp, j) =>
+ exps.flatMap { case exp =>
exp.tpe match {
case AnalogType(w) => None
- case _ => getGender(t, j, g) match {
+ case _ => gender(exp) match {
case (BIGENDER | FEMALE) => Some(exp)
case _ => None
}
diff --git a/src/main/scala/firrtl/passes/InferWidths.scala b/src/main/scala/firrtl/passes/InferWidths.scala
index 1e9532c8..26d346bb 100644
--- a/src/main/scala/firrtl/passes/InferWidths.scala
+++ b/src/main/scala/firrtl/passes/InferWidths.scala
@@ -263,12 +263,12 @@ object InferWidths extends Pass {
val n = get_size(s.loc.tpe)
val locs = create_exps(s.loc)
val exps = create_exps(s.expr)
- v ++= ((locs zip exps).zipWithIndex flatMap {case ((locx, expx), i) =>
- get_flip(s.loc.tpe, i, Default) match {
+ v ++= locs.zip(exps).flatMap { case (locx, expx) =>
+ to_flip(gender(locx)) match {
case Default => get_constraints_t(locx.tpe, expx.tpe)//WGeq(getWidth(locx), getWidth(expx))
case Flip => get_constraints_t(expx.tpe, locx.tpe)//WGeq(getWidth(expx), getWidth(locx))
}
- })
+ }
case (s: PartialConnect) =>
val ls = get_valid_points(s.loc.tpe, s.expr.tpe, Default, Default)
val locs = create_exps(s.loc)
@@ -276,7 +276,7 @@ object InferWidths extends Pass {
v ++= (ls flatMap {case (x, y) =>
val locx = locs(x)
val expx = exps(y)
- get_flip(s.loc.tpe, x, Default) match {
+ to_flip(gender(locx)) match {
case Default => get_constraints_t(locx.tpe, expx.tpe)//WGeq(getWidth(locx), getWidth(expx))
case Flip => get_constraints_t(expx.tpe, locx.tpe)//WGeq(getWidth(expx), getWidth(locx))
}
diff --git a/src/main/scala/firrtl/passes/Passes.scala b/src/main/scala/firrtl/passes/Passes.scala
index 45413348..bb65201b 100644
--- a/src/main/scala/firrtl/passes/Passes.scala
+++ b/src/main/scala/firrtl/passes/Passes.scala
@@ -140,8 +140,8 @@ object ExpandConnects extends Pass {
case sx: Connect =>
val locs = create_exps(sx.loc)
val exps = create_exps(sx.expr)
- Block((locs zip exps).zipWithIndex map {case ((locx, expx), i) =>
- get_flip(sx.loc.tpe, i, Default) match {
+ Block(locs.zip(exps).map { case (locx, expx) =>
+ to_flip(gender(locx)) match {
case Default => Connect(sx.info, locx, expx)
case Flip => Connect(sx.info, expx, locx)
}
@@ -154,7 +154,7 @@ object ExpandConnects extends Pass {
locs(x).tpe match {
case AnalogType(_) => Attach(sx.info, Seq(locs(x), exps(y)))
case _ =>
- get_flip(sx.loc.tpe, x, Default) match {
+ to_flip(gender(locs(x))) match {
case Default => Connect(sx.info, locs(x), exps(y))
case Flip => Connect(sx.info, exps(y), locs(x))
}