Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/low-to-tree/low-to-tree.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/low-to-tree/low-to-tree.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3856, Sat May 14 12:49:20 2016 UTC revision 3857, Sat May 14 14:13:04 2016 UTC
# Line 112  Line 112 
112      fun mkBlock stms = T.Block{locals = ref [], body = stms}      fun mkBlock stms = T.Block{locals = ref [], body = stms}
113      fun mkIf (x, stms, []) = T.S_IfThen(x, mkBlock stms)      fun mkIf (x, stms, []) = T.S_IfThen(x, mkBlock stms)
114        | mkIf (x, stms1, stms2) = T.S_IfThenElse(x, mkBlock stms1, mkBlock stms2)        | mkIf (x, stms1, stms2) = T.S_IfThenElse(x, mkBlock stms1, mkBlock stms2)
115        fun mkAssign (x, e) = T.S_Assign(false, x, e)
116        fun mkDefn (x, e) = T.S_Assign(true, x, e)
117    
118      fun cvtScalarTy Ty.BoolTy = TTy.BoolTy      fun cvtScalarTy Ty.BoolTy = TTy.BoolTy
119        | cvtScalarTy Ty.IntTy = TTy.IntTy        | cvtScalarTy Ty.IntTy = TTy.IntTy
# Line 317  Line 319 
319           *)           *)
320            fun bindSimple rhs = (case eqClassRepOf(env, lhs)            fun bindSimple rhs = (case eqClassRepOf(env, lhs)
321                   of NOEQ => (Env.bindSimple (env, lhs, Env.TREE rhs); [])                   of NOEQ => (Env.bindSimple (env, lhs, Env.TREE rhs); [])
322                    | VAR x' => [T.S_Assign(x', rhs)]                    | VAR x' => [mkAssign(x', rhs)]
323                    | VEC _ => raise Fail "unexpected VEC"                    | VEC _ => raise Fail "unexpected VEC"
324                  (* end case *))                  (* end case *))
325            fun assignOp (rator, args) = let            fun assignOp (rator, args) = let
326  (* FIXME: what if lhs is EqClass var? *)  (* FIXME: what if lhs is EqClass var? *)
327                  val t = Util.newLocalVar lhs                  val t = Util.newLocalVar lhs
328                  val stm = T.S_Assign(t, T.E_Op(rator, List.map (scalarArg env) args))                  val stm = mkDefn(t, T.E_Op(rator, List.map (scalarArg env) args))
329                  in                  in
330                    Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));                    Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));
331                    [stm]                    [stm]
# Line 351  Line 353 
353                            val t = Util.newLocalVar lhs                            val t = Util.newLocalVar lhs
354                            in                            in
355                              Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));                              Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));
356                              [T.S_Assign(t, e)]                              [mkDefn(t, e)]
357                            end                            end
358                        | (Env.TREE e, VAR x', _) => [T.S_Assign(x', e)]                        | (Env.TREE e, VAR x', _) => [mkAssign(x', e)]
359                        | (Env.VEC(layout, es), NOEQ, true) => let                        | (Env.VEC(layout, es), NOEQ, true) => let
360                            val vs = Util.newVectorVars layout                            val vs = Util.newVectorVars layout
361                            in                            in
362                              Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));                              Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));
363                              ListPair.mapEq T.S_Assign (vs, es)                              ListPair.mapEq mkDefn (vs, es)
364                            end                            end
365                        | (Env.VEC(layout, es), VEC xs, _) => ListPair.mapEq T.S_Assign (xs, es)                        | (Env.VEC(layout, es), VEC xs, _) => ListPair.mapEq mkAssign (xs, es)
366                        | _ => raise Fail "inconsistent"                        | _ => raise Fail "inconsistent"
367                      (* end case *)                      (* end case *)
368                    end                    end
# Line 390  Line 392 
392                            val vs = Util.newVectorVars layout                            val vs = Util.newVectorVars layout
393                            in                            in
394                              Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));                              Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));
395                              ListPair.mapEq T.S_Assign (vs, es)                              ListPair.mapEq mkDefn (vs, es)
396                            end                            end
397                        | (VEC xs, _) => ListPair.mapEq T.S_Assign (xs, es)                        | (VEC xs, _) => ListPair.mapEq mkAssign (xs, es)
398                        | _ => raise Fail "inconsistent"                        | _ => raise Fail "inconsistent"
399                      (* end case *)                      (* end case *)
400                    end                    end
# Line 543  Line 545 
545                        (* end case *))                        (* end case *))
546                  (* end case *))                  (* end case *))
547            in            in
548              ScopeVars.assignScopes (doNode (IR.CFG.entry cfg, [], []))              doNode (IR.CFG.entry cfg, [], [])
549            end            end
550    
551      fun trCFG info cfg = trCFGWithEnv (Env.new info, cfg)      fun trCFG info cfg = ScopeVars.assignScopes ([], trCFGWithEnv (Env.new info, cfg))
552    
553      fun trStrand info strand = let      fun trStrand info strand = let
554            val trCFG = trCFG info            val trCFG = trCFG info
555            val IR.Strand{name, params, state, stateInit, initM, updateM, stabilizeM} = strand            val IR.Strand{name, params, state, stateInit, initM, updateM, stabilizeM} = strand
556            val params' = List.map Util.newParamVar params            val params' = List.map Util.newParamVar params
           val env = Env.new info  
           val () = ListPair.appEq  
                 (fn (x, x') => Env.bindSimple (env, x, Env.TREE(T.E_Var x'))) (params, params')  
557            val state' = List.map getStateVar state            val state' = List.map getStateVar state
558              val stateInit' = let
559                    val env = Env.new info
560                    in
561                      ListPair.appEq
562                        (fn (x, x') => Env.bindSimple (env, x, Env.TREE(T.E_Var x')))
563                          (params, params');
564                      ScopeVars.assignScopes (params', trCFGWithEnv (env, stateInit))
565                    end
566            in            in
567              T.Strand{              T.Strand{
568                  name = name,                  name = name,
569                  params = params',                  params = params',
570                  state = state',                  state = state',
571                  stateInit = trCFGWithEnv (env, stateInit),                  stateInit = stateInit',
572                  initM = Option.map trCFG initM,                  initM = Option.map trCFG initM,
573                  updateM = trCFG updateM,                  updateM = trCFG updateM,
574                  stabilizeM = Option.map trCFG stabilizeM                  stabilizeM = Option.map trCFG stabilizeM

Legend:
Removed from v.3856  
changed lines
  Added in v.3857

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0