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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/translate/translate.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/translate/translate.sml

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

revision 3476, Wed Dec 2 20:44:59 2015 UTC revision 3485, Sun Dec 6 13:48:48 2015 UTC
# Line 21  Line 21 
21    
22      structure S = Simple      structure S = Simple
23      structure Ty = SimpleTypes      structure Ty = SimpleTypes
24      structure VMap = SimpleVar.Map      structure SV = SimpleVar
25      structure VSet = SimpleVar.Set      structure VMap = SV.Map
26        structure VSet = SV.Set
27      structure IR = HighIR      structure IR = HighIR
28      structure Op = HighOps      structure Op = HighOps
29      structure DstTy = HighTypes      structure DstTy = HighTypes
# Line 40  Line 41 
41            fun nl () = if (!wid > 0) then (print "\n"; wid := 0) else ()            fun nl () = if (!wid > 0) then (print "\n"; wid := 0) else ()
42            fun prElem (src, dst) = let            fun prElem (src, dst) = let
43                  val s = String.concat [                  val s = String.concat [
44                          " ", SimpleVar.uniqueNameOf src, "->", IR.Var.toString dst                          " ", SV.uniqueNameOf src, "->", IR.Var.toString dst
45                        ]                        ]
46                  in                  in
47                    pr s;                    pr s;
# Line 56  Line 57 
57      fun lookup env x = (case VMap.find (env, x)      fun lookup env x = (case VMap.find (env, x)
58             of SOME x' => x'             of SOME x' => x'
59              | NONE => raise Fail(concat[              | NONE => raise Fail(concat[
60                    "no binding for ", SimpleVar.uniqueNameOf x, " in environment"                    "no binding for ", SV.uniqueNameOf x, " in environment"
61                  ])                  ])
62            (* end case *))            (* end case *))
63    
64    (* create a new instance of a variable *)    (* create a new instance of a variable *)
65      fun newVar x = IR.Var.new (SimpleVar.nameOf x, cvtTy(SimpleVar.typeOf x))      fun newVar x = IR.Var.new (SV.nameOf x, cvtTy(SV.typeOf x))
66    
67    (* generate fresh SSA variables and add them to the environment *)    (* generate fresh SSA variables and add them to the environment *)
68      fun freshVars (env, xs) = let      fun freshVars (env, xs) = let
# Line 123  Line 124 
124                          val rhs = List.tabulate (arity, fn i => if (i = predIndex) then dstVar else dstVar')                          val rhs = List.tabulate (arity, fn i => if (i = predIndex) then dstVar else dstVar')
125                          in                          in
126  (*  (*
127  print(concat["recordAssign: ", SimpleVar.uniqueNameOf srcVar, " --> ", IR.Var.toString lhs,  print(concat["recordAssign: ", SV.uniqueNameOf srcVar, " --> ", IR.Var.toString lhs,
128  " @ ", IR.Node.toString nd, "\n"]);  " @ ", IR.Node.toString nd, "\n"]);
129  *)  *)
130                            phiMap := VMap.insert (m, srcVar, (lhs, rhs))                            phiMap := VMap.insert (m, srcVar, (lhs, rhs))
# Line 175  Line 176 
176                          val dstVar = List.nth(xs, ix)                          val dstVar = List.nth(xs, ix)
177                          in                          in
178  (*  (*
179  print(concat["doVar (", SimpleVar.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);  print(concat["doVar (", SV.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);
180  *)  *)
181                            recordAssign (joinStk, srcVar, dstVar);                            recordAssign (joinStk, srcVar, dstVar);
182                            VMap.insert (env, srcVar, dstVar)                            VMap.insert (env, srcVar, dstVar)
# Line 197  Line 198 
198                              end                              end
199                        fun doVar (srcVar, phi as (dstVar, srcVars), (env, phis)) = (                        fun doVar (srcVar, phi as (dstVar, srcVars), (env, phis)) = (
200  (*  (*
201  print(concat["doVar (", SimpleVar.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);  print(concat["doVar (", SV.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);
202  *)  *)
203                              recordAssign (joinStk, srcVar, dstVar);                              recordAssign (joinStk, srcVar, dstVar);
204                              (VMap.insert (env, srcVar, dstVar), (dstVar, filterPhiRHS srcVars) ::phis))                              (VMap.insert (env, srcVar, dstVar), (dstVar, filterPhiRHS srcVars) ::phis))
# Line 211  Line 212 
212                            val xs = List.map SOME xs                            val xs = List.map SOME xs
213                            in                            in
214  (*  (*
215  print(concat["doVar (", SimpleVar.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);  print(concat["doVar (", SV.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);
216  *)  *)
217                              recordAssign (joinStk, srcVar, dstVar);                              recordAssign (joinStk, srcVar, dstVar);
218                              IR.Var.setBinding (dstVar, IR.VB_PHI xs);                              IR.Var.setBinding (dstVar, IR.VB_PHI xs);
# Line 229  Line 230 
230      fun cvtExp (env : env, lhs, exp) = (case exp      fun cvtExp (env : env, lhs, exp) = (case exp
231             of S.E_Var x => [IR.ASSGN(lhs, IR.VAR(lookup env x))]             of S.E_Var x => [IR.ASSGN(lhs, IR.VAR(lookup env x))]
232              | S.E_Lit lit => [IR.ASSGN(lhs, IR.LIT lit)]              | S.E_Lit lit => [IR.ASSGN(lhs, IR.LIT lit)]
233              | S.E_Tuple xs => raise Fail "E_Tuple not implemeted"              | S.E_Select(x, fld) => raise Fail "FIXME"
234              | S.E_Apply _ => raise Fail "unexpected E_Apply"              | S.E_Apply _ => raise Fail "unexpected E_Apply"
235              | S.E_Prim(f, tyArgs, args, ty) => let              | S.E_Prim(f, tyArgs, args, ty) => let
236                  val args' = List.map (lookup env) args                  val args' = List.map (lookup env) args
237                  in                  in
238                    TranslateBasis.translate (lhs, f, tyArgs, args')                    TranslateBasis.translate (lhs, f, tyArgs, args')
239                  end                  end
240              | S.E_Cons(args, _) => [IR.ASSGN(lhs, IR.CONS(List.map (lookup env) args, IR.Var.ty lhs))]              | S.E_Tensor(args, _) => [IR.ASSGN(lhs, IR.CONS(List.map (lookup env) args, IR.Var.ty lhs))]
241              | S.E_Seq(args, _) => [IR.ASSGN(lhs, IR.SEQ(List.map (lookup env) args, IR.Var.ty lhs))]              | S.E_Seq(args, _) => [IR.ASSGN(lhs, IR.SEQ(List.map (lookup env) args, IR.Var.ty lhs))]
242              | S.E_Slice(x, indices, ty) => let              | S.E_Slice(x, indices, ty) => let
243                  val x = lookup env x                  val x = lookup env x
# Line 252  Line 253 
253              | S.E_Coerce{srcTy, dstTy, x} => (case (srcTy, dstTy)              | S.E_Coerce{srcTy, dstTy, x} => (case (srcTy, dstTy)
254                   of (Ty.T_Int, Ty.T_Tensor _) =>                   of (Ty.T_Int, Ty.T_Tensor _) =>
255                        [IR.ASSGN(lhs, IR.OP(Op.IntToReal, [lookup env x]))]                        [IR.ASSGN(lhs, IR.OP(Op.IntToReal, [lookup env x]))]
256                    | (Ty.T_Sequence(ty, n), Ty.T_DynSequence _) =>                    | (Ty.T_Sequence(ty, SOME n), Ty.T_Sequence(_, NONE)) =>
257                        [IR.ASSGN(lhs, IR.OP(Op.MkDynamic(cvtTy ty, n), [lookup env x]))]                        [IR.ASSGN(lhs, IR.OP(Op.MkDynamic(cvtTy ty, n), [lookup env x]))]
258                    | (Ty.T_Field _, Ty.T_Field _) =>                    | (Ty.T_Field _, Ty.T_Field _) =>
259                      (* change in continuity is a no-op *)                      (* change in continuity is a no-op *)
# Line 280  Line 281 
281      fun cvtBlock (state, env : env, joinStk, S.Block stms) = let      fun cvtBlock (state, env : env, joinStk, S.Block stms) = let
282            fun cvt (env : env, cfg, []) = (cfg, env)            fun cvt (env : env, cfg, []) = (cfg, env)
283              | cvt (env, cfg, stm::stms) = (case stm              | cvt (env, cfg, stm::stms) = (case stm
284                   of S.S_Var x => let                   of S.S_Var(x, NONE) => let
285                        val x' = newVar x                        val x' = newVar x
286                        in                        in
287                          cvt (VMap.insert (env, x, x'), cfg, stms)                          cvt (VMap.insert (env, x, x'), cfg, stms)
288                        end                        end
289                      | S.S_Var(x, SOME e) => let
290                          val x' = newVar x
291                          val assigns = cvtExp (env, x', e)
292                          in
293                            recordAssign (joinStk, x, x');
294                            cvt (
295                              VMap.insert(env, x, x'),
296                              IR.CFG.concat(cfg, IR.CFG.mkBlock assigns),
297                              stms)
298                          end
299                    | S.S_Assign(lhs, rhs) => let                    | S.S_Assign(lhs, rhs) => let
300                        val lhs' = newVar lhs                        val lhs' = newVar lhs
301                        val assigns = cvtExp (env, lhs', rhs)                        val assigns = cvtExp (env, lhs', rhs)
# Line 465  Line 476 
476                  val x' = newVar x                  val x' = newVar x
477                  val gx = IR.GlobalVar.new(                  val gx = IR.GlobalVar.new(
478                          true,                          true,
479                          SimpleVar.nameOf x,                          SV.nameOf x,
480                          cvtTy(SimpleVar.typeOf x))                          cvtTy(SV.typeOf x))
481                  val rhs = (case VMap.find(env, x)                  val rhs = (case VMap.find(env, x)
482                         of SOME dflt => IR.OP(Op.InputWithDefault(Inputs.map cvtTy inp), [dflt])                         of SOME dflt => IR.OP(Op.InputWithDefault(Inputs.map cvtTy inp), [dflt])
483                          | NONE => IR.OP(Op.Input(Inputs.map cvtTy inp), [])                          | NONE => IR.OP(Op.Input(Inputs.map cvtTy inp), [])
484                        (* end case *))                        (* end case *))
485                  val stms =  IR.ASSGN(x', rhs) :: IR.GASSGN(gx, x') :: stms                  val stms =  IR.ASSGN(x', rhs) :: IR.GASSGN(gx, x') :: stms
486                  in                  in
                   IR.GlobalVar.setBinding (gx, x');  
487                    ((x, gx)::gvs, stms)                    ((x, gx)::gvs, stms)
488                  end                  end
489            val (gvs, stms) = List.foldr cvt ([], []) inputs            val (gvs, stms) = List.foldr cvt ([], []) inputs
# Line 491  Line 501 
501            fun cvt x = let            fun cvt x = let
502                  val gx = IR.GlobalVar.new(                  val gx = IR.GlobalVar.new(
503                          false,                          false,
504                          SimpleVar.nameOf x,                          SV.nameOf x,
505                          cvtTy(SimpleVar.typeOf x))                          cvtTy(SV.typeOf x))
506                  in                  in
507                    (x, gx)                    (x, gx)
508                  end                  end
# Line 500  Line 510 
510              List.map cvt globals              List.map cvt globals
511            end            end
512    
513      fun translate (S.Program{props, inputDefaults, inputs, globals, globalInit, init, strands, ...}) = let      fun translate prog = let
514              val S.Program{
515                      props, consts, inputs, constInit, globals, funcs, init, strand, create, update
516                    } = prog
517            val (inputInit, inputGlobs) = cvtInputs (inputDefaults, inputs)            val (inputInit, inputGlobs) = cvtInputs (inputDefaults, inputs)
518            val globals = cvtGlobals globals            val globals = cvtGlobals globals
519          (* create the global initialization code *)          (* create the global initialization code *)
# Line 515  Line 528 
528                        fun saveGlob (x, gx) = let                        fun saveGlob (x, gx) = let
529                              val x' = lookup env x (* the local variable that holds the global *)                              val x' = lookup env x (* the local variable that holds the global *)
530                              in                              in
                               IR.GlobalVar.setBinding (gx, x');  
531                                IR.GASSGN(gx, x')                                IR.GASSGN(gx, x')
532                              end                              end
533                        in                        in
# Line 545  Line 557 
557                (* create the state variables *)                (* create the state variables *)
558                  val svars = let                  val svars = let
559                        fun newSVar x = IR.StateVar.new (                        fun newSVar x = IR.StateVar.new (
560                              SimpleVar.kindOf x = S.StrandOutputVar,                              SV.kindOf x = SV.StrandOutputVar,
561                              SimpleVar.nameOf x, cvtTy(SimpleVar.typeOf x))                              SV.nameOf x, cvtTy(SV.typeOf x))
562                        in                        in
563                          List.map newSVar state                          List.map newSVar state
564                        end                        end

Legend:
Removed from v.3476  
changed lines
  Added in v.3485

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