aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDonggyu Kim2016-08-18 21:30:45 -0700
committerDonggyu Kim2016-09-06 13:12:21 -0700
commit99dd51fefb3050ba825ca1a92c168e2d6d7b7ad8 (patch)
tree500ac72c55eb64fd00213eeff3d3d762648d9bfc /src
parent6a05468ed0ece1ace3019666b16f2ae83ef76ef9 (diff)
replace flatMap with foldLeft in create_exps
internal implementation for flatMap seems to be inefficient
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/Utils.scala33
-rw-r--r--src/main/scala/firrtl/passes/Passes.scala32
2 files changed, 26 insertions, 39 deletions
diff --git a/src/main/scala/firrtl/Utils.scala b/src/main/scala/firrtl/Utils.scala
index e6db4b2d..1db8ce78 100644
--- a/src/main/scala/firrtl/Utils.scala
+++ b/src/main/scala/firrtl/Utils.scala
@@ -151,27 +151,18 @@ object Utils extends LazyLogging {
}
def create_exps (n:String, t:Type) : Seq[Expression] =
create_exps(WRef(n,t,ExpKind(),UNKNOWNGENDER))
- def create_exps (e:Expression) : Seq[Expression] = {
- e match {
- case (e:Mux) => {
- val e1s = create_exps(e.tval)
- val e2s = create_exps(e.fval)
- (e1s, e2s).zipped.map { (e1,e2) => Mux(e.cond,e1,e2,mux_type_and_widths(e1,e2)) }
- }
- case (e:ValidIf) => create_exps(e.value).map { e1 => ValidIf(e.cond,e1,tpe(e1)) }
- case (e) => {
- tpe(e) match {
- case (t:UIntType) => Seq(e)
- case (t:SIntType) => Seq(e)
- case ClockType => Seq(e)
- case (t:BundleType) => {
- t.fields.flatMap { f => create_exps(WSubField(e,f.name,f.tpe,times(gender(e), f.flip))) }
- }
- case (t:VectorType) => {
- (0 until t.size).flatMap { i => create_exps(WSubIndex(e,i,t.tpe,gender(e))) }
- }
- }
- }
+ def create_exps (e:Expression) : Seq[Expression] = e match {
+ case (e:Mux) =>
+ val e1s = create_exps(e.tval)
+ val e2s = create_exps(e.fval)
+ (e1s,e2s).zipped map ((e1,e2) => Mux(e.cond,e1,e2,mux_type_and_widths(e1,e2)))
+ case (e:ValidIf) => create_exps(e.value) map (e1 => ValidIf(e.cond,e1,tpe(e1)))
+ case (e) => tpe(e) match {
+ case (_:GroundType) => Seq(e)
+ case (t:BundleType) => (t.fields foldLeft Seq[Expression]())((exps, f) =>
+ exps ++ create_exps(WSubField(e,f.name,f.tpe,times(gender(e), f.flip))))
+ case (t:VectorType) => ((0 until t.size) foldLeft Seq[Expression]())((exps, i) =>
+ exps ++ create_exps(WSubIndex(e,i,t.tpe,gender(e))))
}
}
def get_flip (t:Type, i:Int, f:Orientation) : Orientation = {
diff --git a/src/main/scala/firrtl/passes/Passes.scala b/src/main/scala/firrtl/passes/Passes.scala
index 1b6c76f4..7b4f9aa2 100644
--- a/src/main/scala/firrtl/passes/Passes.scala
+++ b/src/main/scala/firrtl/passes/Passes.scala
@@ -1061,24 +1061,20 @@ case class DataRef( val exp : Expression, val male : String, val female : String
object RemoveCHIRRTL extends Pass {
def name = "Remove CHIRRTL"
var mname = ""
- def create_exps (e:Expression) : Seq[Expression] = {
- (e) match {
- case (e:Mux)=>
- (create_exps(e.tval),create_exps(e.fval)).zipped.map((e1,e2) => {
- Mux(e.cond,e1,e2,mux_type(e1,e2))
- })
- case (e:ValidIf) =>
- create_exps(e.value).map(e1 => {
- ValidIf(e.cond,e1,tpe(e1))
- })
- case (e) => (tpe(e)) match {
- case (_:UIntType|_:SIntType|ClockType) => Seq(e)
- case (t:BundleType) =>
- t.fields.flatMap(f => create_exps(SubField(e,f.name,f.tpe)))
- case (t:VectorType)=>
- (0 until t.size).flatMap(i => create_exps(SubIndex(e,i,t.tpe)))
- case UnknownType => Seq(e)
- }
+ def create_exps (e:Expression) : Seq[Expression] = e match {
+ case (e:Mux) =>
+ val e1s = create_exps(e.tval)
+ val e2s = create_exps(e.fval)
+ (e1s,e2s).zipped map ((e1,e2) => Mux(e.cond,e1,e2,mux_type(e1,e2)))
+ case (e:ValidIf) =>
+ create_exps(e.value) map (e1 => ValidIf(e.cond,e1,tpe(e1)))
+ case (e) => (tpe(e)) match {
+ case (_:GroundType) => Seq(e)
+ case (t:BundleType) => (t.fields foldLeft Seq[Expression]())((exps, f) =>
+ exps ++ create_exps(SubField(e,f.name,f.tpe)))
+ case (t:VectorType) => ((0 until t.size) foldLeft Seq[Expression]())((exps, i) =>
+ exps ++ create_exps(SubIndex(e,i,t.tpe)))
+ case UnknownType => Seq(e)
}
}
def run (c:Circuit) : Circuit = {