diff options
| author | Donggyu Kim | 2016-08-18 21:30:45 -0700 |
|---|---|---|
| committer | Donggyu Kim | 2016-09-06 13:12:21 -0700 |
| commit | 99dd51fefb3050ba825ca1a92c168e2d6d7b7ad8 (patch) | |
| tree | 500ac72c55eb64fd00213eeff3d3d762648d9bfc /src | |
| parent | 6a05468ed0ece1ace3019666b16f2ae83ef76ef9 (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.scala | 33 | ||||
| -rw-r--r-- | src/main/scala/firrtl/passes/Passes.scala | 32 |
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 = { |
