aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes/InferWidths.scala
diff options
context:
space:
mode:
authorJack Koenig2017-02-07 16:54:35 -0800
committerAdam Izraelevitz2017-02-07 16:54:35 -0800
commit2f4ae9b4164cf415600de970b3ac5a1b9760efa5 (patch)
tree6e131cd16157f921bb3ae83cb15caa0f53feb51a /src/main/scala/firrtl/passes/InferWidths.scala
parent16238da2b50706e511f22f257402a3c2c009c004 (diff)
Rework Attach to work on arbitrary Analog hierarchies (#415)
* Rework Attach to work on arbitrary Analog hierarchies If there are zero or one Analog sources in an Attach (source meaning wire or parent module port), then the Attach will be emitted as a simple point to point connection. In the general case, alias is used for simulation while forwards and backwards assigns for synthesis. Verilator does not currently support the general case so an `ifdef Verilator `error is emitted. * Add helper functions for creating WRef from Reg and Wire
Diffstat (limited to 'src/main/scala/firrtl/passes/InferWidths.scala')
-rw-r--r--src/main/scala/firrtl/passes/InferWidths.scala6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/main/scala/firrtl/passes/InferWidths.scala b/src/main/scala/firrtl/passes/InferWidths.scala
index 397a5d91..f3f1e945 100644
--- a/src/main/scala/firrtl/passes/InferWidths.scala
+++ b/src/main/scala/firrtl/passes/InferWidths.scala
@@ -288,8 +288,10 @@ object InferWidths extends Pass {
case (s:Conditionally) => v ++=
get_constraints_t(s.pred.tpe, UIntType(IntWidth(1))) ++
get_constraints_t(UIntType(IntWidth(1)), s.pred.tpe)
- case (s: Attach) =>
- v += WGeq(getWidth(s.source), MaxWidth(s.exprs map (e => getWidth(e.tpe))))
+ case Attach(_, exprs) =>
+ // All widths must be equal
+ val widths = exprs map (e => getWidth(e.tpe))
+ v ++= widths.tail map (WGeq(widths.head, _))
case _ =>
}
s map get_constraints_e map get_constraints_s