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

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/simplify/simplify.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/simplify/simplify.sml

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

revision 2010, Sat Oct 6 11:49:30 2012 UTC revision 2011, Sun Oct 7 21:14:31 2012 UTC
# Line 24  Line 24 
24    (* make a block out of a list of statements that are in reverse order *)    (* make a block out of a list of statements that are in reverse order *)
25      fun mkBlock stms = S.Block(List.rev stms)      fun mkBlock stms = S.Block(List.rev stms)
26    
27        fun expToInit exp = (case exp
28               of AST.E_Lit(Literal.Int n) => Inputs.Int n
29                | AST.E_Lit(Literal.Float f) => Inputs.Real f
30                | AST.E_Lit(Literal.String s) => Inputs.String s
31                | AST.E_Lit(Bool b) => Inputs.Bool b
32                | AST.E_Tuple es => raise Fail "E_Tuple not yet implemented"
33                | AST.E_Cons es => let
34                    fun toReal (AST.E_Lit(Literal.Int n)) = FloatLit.fromInt n
35                      | toReal (AST.E_Lit(Literal.Float f)) = f
36                      | toReal (AST.E_Coerce{e, ...}) = toReal e
37                      | toReal _ = raise Fail "impossible"
38                    fun toTensor [e] = ??
39                      | toTensor (es as e1::_) = (case e1
40                           of AST.E_Cons _ => let
41                                val (shp, vs) = ??
42                                in
43                                  (List.length es :: shp, List.concat vs)
44                                end
45                            | _ => ([List.length es], List.map toReal (e1::es))
46                          (* end case *))
47                    in
48                      Inputs.Tensor(shp, Vector.fromList vs)
49                    end
50                | AST.E_Seq es => ??
51                | AST.E_Coerce{srcTy, dstTy, e} => ??
52                | _ => raise Fail "impossible initialization expression"
53              (* end case *))
54    
55      fun simplifyProgram (AST.Program dcls) = let      fun simplifyProgram (AST.Program dcls) = let
56              val inputs = ref []
57            val globals = ref []            val globals = ref []
58            val globalInit = ref []            val globalInit = ref []
59            val initially = ref NONE            val initially = ref NONE
# Line 36  Line 65 
65                  (* end case *))                  (* end case *))
66            fun simplifyDecl dcl = (case dcl            fun simplifyDecl dcl = (case dcl
67                   of AST.D_Input(x, desc, NONE) => let                   of AST.D_Input(x, desc, NONE) => let
68                        val rhs = (case Var.monoTypeOf x                        val (ty, init) = (case Var.monoTypeOf x
69                               of ty as Ty.T_DynSequence _ => S.E_InputNrrd(ty, Var.nameOf x, desc, NONE)                               of ty as Ty.T_Image{dim, shape} =>
70                                | ty as Ty.T_Image _ => S.E_InputNrrd(ty, Var.nameOf x, desc, NONE)                                    (ty, SOME(Inputs.Image(ImageInfo.fromNrrd(NrrdInfo.getInfo nrrd, ?, ?))))
71                                | ty => S.E_Input(ty, Var.nameOf x, desc, NONE)                                | ty => (ty, NONE)
72                              (* end case *))                              (* end case *))
73                          val inp = Inputs.INP{
74                                  ty = ty,
75                                  name = Var.nameOf x,
76                                  desc = desc,
77                                  init = init
78                                }
79                        in                        in
80                          globals := x :: !globals;                          inputs := (x, inp) :: !inputs
                         globalInit := S.S_Assign(x, rhs) :: !globalInit  
81                        end                        end
82                    | AST.D_Input(x, desc, SOME(AST.E_LoadNrrd(tvs, nrrd, ty))) => let                    | AST.D_Input(x, desc, SOME(AST.E_LoadNrrd(tvs, nrrd, ty))) => let
83                      (* load the nrrd proxy here *)                      (* load the nrrd proxy here *)
84                        val info = NrrdInfo.getInfo nrrd                        val info = NrrdInfo.getInfo nrrd
85  (* FIXME: what do we do with the proxy info? *)                        val (ty, init) = (case Var.monoTypeOf x
86                        val rhs = (case TypeUtil.pruneHead ty                               of ty as Ty.T_DynSequence _ => (ty, Inputs.DynSeq nrrd)
87                               of ty as Ty.T_DynSequence _ =>                                | ty as Ty.T_Image{dim, shape} =>
88                                    S.E_InputNrrd(ty, Var.nameOf x, desc, SOME nrrd)                                    (ty, Inputs.Proxy(nrrd, ImageInfo.fromNrrd(NrrdInfo.getInfo nrrd, ?, ?)))
                               | Ty.T_Image _ =>  
                                   S.E_InputNrrd(ty, Var.nameOf x, desc, SOME nrrd)  
89                                | _ => raise Fail "impossible"                                | _ => raise Fail "impossible"
90                              (* end case *))                              (* end case *))
91                        val stm = S.S_Assign(x, rhs)                        val inp = Inputs.INP{
92                                  ty = ty,
93                                  name = Var.nameOf x,
94                                  desc = desc,
95                                  init = SOME init
96                                }
97                        in                        in
98                          globals := x :: !globals;                          inputs := (x, inp) :: !inputs
                         globalInit := stm :: !globalInit  
99                        end                        end
100                    | AST.D_Input(x, desc, SOME e) => let                    | AST.D_Input(x, desc, SOME e) => let
101                        val (stms, x') = simplifyExpToVar (e, [])                        val inp = Inputs.INP{
102                        val e' = S.E_Input(Var.monoTypeOf x, Var.nameOf x, desc, SOME x')                                ty = Var.monoTypeOf x,
103                                  name = Var.nameOf x,
104                                  desc = desc,
105                                  init = SOME(expToInit e)
106                                }
107                        in                        in
108                          globals := x :: !globals;                          inputs := (x, inp) :: !inputs
                         globalInit := S.S_Assign(x, e') :: (stms @ !globalInit)  
109                        end                        end
110                    | AST.D_Var(AST.VD_Decl(x, e)) => let                    | AST.D_Var(AST.VD_Decl(x, e)) => let
111                        val (stms, e') = simplifyExp (e, [])                        val (stms, e') = simplifyExp (e, [])
# Line 83  Line 122 
122            in            in
123              List.app simplifyDecl dcls;              List.app simplifyDecl dcls;
124              S.Program{              S.Program{
125                    inputs = List.rev(!inputs),
126                  globals = List.rev(!globals),                  globals = List.rev(!globals),
127                  globalInit = mkBlock (!globalInit),                  globalInit = mkBlock (!globalInit),
128                  init = (case !initially                  init = (case !initially

Legend:
Removed from v.2010  
changed lines
  Added in v.2011

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