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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml

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

revision 535, Tue Feb 15 17:17:20 2011 UTC revision 552, Fri Feb 18 15:09:08 2011 UTC
# Line 27  Line 27 
27              | Ty.IVecTy n => T.ivecTy n         (* FIXME: what about vector splits? *)              | Ty.IVecTy n => T.ivecTy n         (* FIXME: what about vector splits? *)
28              | Ty.VecTy 1 => T.realTy              | Ty.VecTy 1 => T.realTy
29              | Ty.VecTy n => T.vecTy n           (* FIXME: what about vector splits? *)              | Ty.VecTy n => T.vecTy n           (* FIXME: what about vector splits? *)
30              | Ty.AddrTy => T.boolTy (* FIXME *)              | Ty.AddrTy info => T.imageDataTy info
31              | Ty.ImageTy => T.boolTy (* FIXME *)              | Ty.ImageTy info => T.imageTy info
32            (* end case *))            (* end case *))
33    
34        fun addBindings (env, xs, ys) =
35              ListPair.foldlEq (fn (x, y, env) => V.Map.insert(env, x, y)) env (xs, ys)
36    
37      fun lookup (env, x) = (case V.Map.find (env, x)      fun lookup (env, x) = (case V.Map.find (env, x)
38             of SOME x' => x'             of SOME x' => x'
39              | NONE => raise Fail(concat["lookup(_, ", V.name x, ")"])              | NONE => raise Fail(concat["lookup(_, ", V.name x, ")"])
# Line 39  Line 42 
42      fun trExp (env, e) = (case e      fun trExp (env, e) = (case e
43             of IL.E_Var x => (case V.kind x             of IL.E_Var x => (case V.kind x
44                   of IL.VK_Global => T.Expr.global(lookup(env, x))                   of IL.VK_Global => T.Expr.global(lookup(env, x))
45                    | IL.VK_State strand => raise Fail "FIXME: state var"                    | IL.VK_State strand => T.Expr.getState(lookup(env, x))
46                    | IL.VK_Local => T.Expr.var(lookup(env, x))                    | IL.VK_Local => T.Expr.var(lookup(env, x))
47                  (* end case *))                  (* end case *))
48              | IL.E_Lit(Literal.Int n) => T.Expr.intLit n              | IL.E_Lit(Literal.Int n) => T.Expr.intLit n
# Line 81  Line 84 
84                    | (Op.RoundToInt d, [a])      => T.Expr.roundToInt a                    | (Op.RoundToInt d, [a])      => T.Expr.roundToInt a
85                    | (Op.CeilToInt d, [a])       => T.Expr.ceilToInt a                    | (Op.CeilToInt d, [a])       => T.Expr.ceilToInt a
86                    | (Op.FloorToInt d, [a])      => T.Expr.floorToInt a                    | (Op.FloorToInt d, [a])      => T.Expr.floorToInt a
87                    | (Op.ImageAddress, [a])      => T.Expr.imageAddr a                    | (Op.ImageAddress d, [a])    => T.Expr.imageAddr a
88                    | (Op.LoadVoxels(rTy, n), [a]) => T.Expr.intLit 0 (* FIXME *)                    | (Op.LoadVoxels(info, 1), [a]) => T.Expr.getImgData a
89                    | (Op.PosToImgSpace d, [v, x]) => T.Expr.intLit 0 (* FIXME *)                    | (Op.LoadVoxels _, [a])      => raise Fail "impossible"
90                      | (Op.PosToImgSpace d, [v, x]) => T.Expr.posToImgSpace(v, x)
91                    | (Op.GradToWorldSpace d, [v, x]) => T.Expr.intLit 0 (* FIXME *)                    | (Op.GradToWorldSpace d, [v, x]) => T.Expr.intLit 0 (* FIXME *)
92                    | (Op.LoadImage info, [a]) => raise Fail "impossible"                    | (Op.LoadImage info, [a]) => raise Fail "impossible"
93                    | (Op.Inside d, [v, x]) => raise Fail "impossible"                    | (Op.Inside(d, s), [x, v])   => T.Expr.inside(x, v, s)
94                    | (Op.Input(ty, name), []) => raise Fail "impossible"                    | (Op.Input(ty, name), []) => raise Fail "impossible"
95                    | (Op.InputWithDefault(ty, name), [a]) => T.Expr.intLit 0 (* FIXME *)                    | (Op.InputWithDefault(ty, name), [a]) => T.Expr.intLit 0 (* FIXME *)
96                    | _ => raise Fail(concat[                    | _ => raise Fail(concat[
# Line 99  Line 103 
103    
104      fun trStmt (env, stm) = (case stm      fun trStmt (env, stm) = (case stm
105             of IL.S_Comment text => [T.Stmt.comment text]             of IL.S_Comment text => [T.Stmt.comment text]
 (* FIXME: special case for when x is a strand-state variable *)  
106              | IL.S_Assign(x, exp) => (case V.kind x              | IL.S_Assign(x, exp) => (case V.kind x
107                   of IL.VK_Global => [T.Stmt.assign(lookup(env, x), trExp(env, exp))]                   of IL.VK_Global => [T.Stmt.assign(lookup(env, x), trExp(env, exp))]
108                    | IL.VK_State strand => raise Fail "FIXME: state var"                    | IL.VK_State strand =>
109                          [T.Stmt.assignState(lookup(env, x), trExp(env, exp))]
110                    | IL.VK_Local => [T.Stmt.assign(lookup(env, x), trExp(env, exp))]                    | IL.VK_Local => [T.Stmt.assign(lookup(env, x), trExp(env, exp))]
111                  (* end case *))                  (* end case *))
112              | IL.S_Cons(lhs, args) =>              | IL.S_Cons(lhs, args) =>
113                  [T.Stmt.cons(lookup(env, lhs), trExps(env, args))]                  [T.Stmt.cons(lookup(env, lhs), trExps(env, args))]
114                | IL.S_LoadVoxels(lhs, dim, addr) =>
115                    [T.Stmt.getImgData(lookup(env, lhs), dim, trExp(env, addr))]
116              | IL.S_LoadImage(lhs, dim, name) =>              | IL.S_LoadImage(lhs, dim, name) =>
117                  T.Stmt.loadImage (lookup(env, lhs), dim, trExp(env, name))                  T.Stmt.loadImage (lookup(env, lhs), dim, trExp(env, name))
118              | IL.S_Input(lhs, name, optDflt) =>              | IL.S_Input(lhs, name, optDflt) =>
# Line 121  Line 127 
127              | IL.S_Stabilize => [T.Stmt.stabilize()]              | IL.S_Stabilize => [T.Stmt.stabilize()]
128            (* end case *))            (* end case *))
129    
130      and trBlock (env, IL.Block{locals, body}) = (      and trBlock (env, IL.Block{locals, body}) = let
131  (* what about the locals?? *)            val env = List.foldl
132            T.Stmt.block(List.foldr (fn (stm, stms) => trStmt(env, stm)@stms) [] body))                  (fn (x, env) => V.Map.insert(env, x, T.Var.var(cvtTy(V.ty x), V.name x)))
133                      env locals
134              in
135                T.Stmt.block(List.foldr (fn (stm, stms) => trStmt(env, stm)@stms) [] body)
136              end
137    
138        fun trMethod (strand, env) (IL.Method{name, body}) =
139              T.Strand.method (strand, Atom.toString name, trBlock (env, body))
140    
141        fun trStrand (prog, env) (IL.Strand{name, params, state, stateInit, methods}) = let
142              val strand = T.Strand.define(prog, Atom.toString name)
143              val state' =
144                    List.map (fn x => T.Var.state(strand, cvtTy(V.ty x), V.name x)) state
145              val env = addBindings (env, state, state')
146            (* define the parameters and add them to the environment *)
147              val params' = List.map (fn x => T.Var.param(cvtTy(V.ty x), V.name x)) params
148              val env = addBindings (env, params, params')
149              in
150                T.Strand.init (strand, params', trBlock (env, stateInit));
151                List.app (trMethod (strand, env)) methods
152              end
153    
154      fun generate (fileStem, srcProg) = let      fun generate (fileStem, srcProg) = let
155            val treeProg as TreeIL.Program{globals, globalInit, strands} = LowToTree.translate srcProg            val treeProg as TreeIL.Program{globals, globalInit, strands} = LowToTree.translate srcProg
# Line 141  Line 167 
167            in            in
168            (* global initialization *)            (* global initialization *)
169              T.globalInit (prog, trBlock (env, globalInit));              T.globalInit (prog, trBlock (env, globalInit));
170              (* translate strands *)
171                List.app (trStrand (prog, env)) strands;
172            (* output the program *)            (* output the program *)
173              T.generate (fileStem, prog)              T.generate (fileStem, prog)
174            end            end

Legend:
Removed from v.535  
changed lines
  Added in v.552

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