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

SCM Repository

[diderot] Diff of /trunk/src/compiler/high-to-mid/high-to-mid.sml
ViewVC logotype

Diff of /trunk/src/compiler/high-to-mid/high-to-mid.sml

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

revision 1639, Wed Nov 16 01:48:07 2011 UTC revision 1640, Wed Nov 16 02:19:51 2011 UTC
# Line 15  Line 15 
15      structure SrcIL = HighIL      structure SrcIL = HighIL
16      structure SrcTy = HighILTypes      structure SrcTy = HighILTypes
17      structure SrcOp = HighOps      structure SrcOp = HighOps
18        structure SrcSV = SrcIL.StateVar
19      structure VTbl = SrcIL.Var.Tbl      structure VTbl = SrcIL.Var.Tbl
20      structure DstIL = MidIL      structure DstIL = MidIL
21      structure DstTy = MidILTypes      structure DstTy = MidILTypes
22      structure DstOp = MidOps      structure DstOp = MidOps
23    
     type var_env = DstIL.var VTbl.hash_table  
   
24      fun getRHS x  = (case SrcIL.Var.binding x      fun getRHS x  = (case SrcIL.Var.binding x
25             of SrcIL.VB_RHS(SrcIL.OP(rator, args)) => (rator, args)             of SrcIL.VB_RHS(SrcIL.OP(rator, args)) => (rator, args)
26              | SrcIL.VB_RHS(SrcIL.VAR x') => getRHS x'              | SrcIL.VB_RHS(SrcIL.VAR x') => getRHS x'
# Line 35  Line 34 
34        | cvtTy SrcTy.StringTy = DstTy.StringTy        | cvtTy SrcTy.StringTy = DstTy.StringTy
35        | cvtTy SrcTy.IntTy = DstTy.intTy        | cvtTy SrcTy.IntTy = DstTy.intTy
36        | cvtTy (SrcTy.TensorTy dd) = DstTy.tensorTy dd        | cvtTy (SrcTy.TensorTy dd) = DstTy.tensorTy dd
37          | cvtTy (SrcTy.TupleTy tys) = DstTy.TupleTy(List.map cvtTy tys)
38          | cvtTy (SrcTy.SeqTy(ty, n)) = DstTy.SeqTy(cvtTy ty, n)
39      (* we replace Kernel and Field operations by 0, so the types are mapped to int *)      (* we replace Kernel and Field operations by 0, so the types are mapped to int *)
40        | cvtTy SrcTy.KernelTy = DstTy.intTy        | cvtTy SrcTy.KernelTy = DstTy.intTy
41        | cvtTy SrcTy.FieldTy = DstTy.intTy        | cvtTy SrcTy.FieldTy = DstTy.intTy
42        | cvtTy ty = raise Fail("unexpected type " ^ SrcTy.toString ty)        | cvtTy ty = raise Fail("unexpected type " ^ SrcTy.toString ty)
43    
44      (* instantiate the translation environment *)
45        local
46          type var_env = DstIL.var VTbl.hash_table
47          type state_var_env = DstIL.state_var SrcSV.Tbl.hash_table
48    
49      fun rename (env : var_env, x) = (case VTbl.find env x      fun rename (env : var_env, x) = (case VTbl.find env x
50             of SOME x' => x'             of SOME x' => x'
51              | NONE => let              | NONE => let
# Line 62  Line 68 
68            (* end case *))            (* end case *))
69  handle Fail msg => raise Fail(concat["rename(_, ", SrcIL.Var.toString x, "): ", msg])  handle Fail msg => raise Fail(concat["rename(_, ", SrcIL.Var.toString x, "): ", msg])
70    
71      fun renameList (env, xs) = List.map (fn x => rename(env, x)) xs          fun renameSV (env : state_var_env, x) = (case SrcSV.Tbl.find env x
72                   of SOME x' => x'
73                    | NONE => let
74                        val dstTy = cvtTy (SrcSV.ty x)
75                        val x' = DstIL.StateVar.new (SrcSV.isOutput x, SrcSV.name x, dstTy)
76                        in
77                          SrcSV.Tbl.insert env (x, x');
78                          x'
79                        end
80                  (* end case *))
81        in
82        structure Env = TranslateEnvFn (
83          struct
84            structure SrcIL = SrcIL
85            structure DstIL = DstIL
86            type var_env = var_env
87            type state_var_env = state_var_env
88            val rename = rename
89            val renameSV = renameSV
90          end)
91        end
92    
93    (* expand raising a real to an integer power.  When we know the exponent, we can inline    (* expand raising a real to an integer power.  When we know the exponent, we can inline
94     * multiplications.     * multiplications.
# Line 73  Line 99 
99                    | SrcIL.VB_RHS(SrcIL.LIT(Literal.Int n)) => SOME n                    | SrcIL.VB_RHS(SrcIL.LIT(Literal.Int n)) => SOME n
100                    | vb => NONE                    | vb => NONE
101                  (* end case *))                  (* end case *))
102            val x = rename(env, x)            val x = Env.rename(env, x)
103            fun pow () = let            fun pow () = let
104                  val t = DstIL.Var.new("n", DstTy.realTy)                  val t = DstIL.Var.new("n", DstTy.realTy)
105                  in [                  in [
106                    (t, DstIL.OP(DstOp.IntToReal, [rename(env, n)])),                    (t, DstIL.OP(DstOp.IntToReal, [Env.rename(env, n)])),
107                    (y, DstIL.APPLY(ILBasis.pow, [x, t]))                    (y, DstIL.APPLY(ILBasis.pow, [x, t]))
108                  ] end                  ] end
109            in            in
# Line 90  Line 116 
116                      (t, DstIL.LIT(Literal.Float(FloatLit.one))),                      (t, DstIL.LIT(Literal.Float(FloatLit.one))),
117                      (y, DstIL.OP(DstOp.Div DstTy.realTy, [t, x]))                      (y, DstIL.OP(DstOp.Div DstTy.realTy, [t, x]))
118                    ] end                    ] end
119  (* FIXME: expand into multiplications                | SOME 2 => [(y, DstIL.OP(DstOp.Mul DstTy.realTy, [x, x]))]
120    (* FIXME: expand into multiplications; ~2 ==> sqrt
121                | SOME n =>                | SOME n =>
122  *) | SOME _ => pow()  *) | SOME _ => pow()
123                | NONE => pow()                | NONE => pow()
# Line 100  Line 127 
127      fun expandInside (env, result, pos, fld) = (case getRHS fld      fun expandInside (env, result, pos, fld) = (case getRHS fld
128             of (SrcOp.Field d, [img, h]) => (case (getRHS img, getRHS h)             of (SrcOp.Field d, [img, h]) => (case (getRHS img, getRHS h)
129                   of ((SrcOp.LoadImage v, _), (SrcOp.Kernel(h, _), [])) => let                   of ((SrcOp.LoadImage v, _), (SrcOp.Kernel(h, _), [])) => let
130                        val pos = rename (env, pos)                        val pos = Env.rename (env, pos)
131                        val img = rename (env, img)                        val img = Env.rename (env, img)
132                        val imgPos = DstIL.Var.new ("x", DstTy.vecTy d)                        val imgPos = DstIL.Var.new ("x", DstTy.vecTy d)
133                        val s = Kernel.support h                        val s = Kernel.support h
134                        in [                        in [
# Line 117  Line 144 
144             of (SrcOp.Field _, [img, h]) => (case (getRHS img, getRHS h)             of (SrcOp.Field _, [img, h]) => (case (getRHS img, getRHS h)
145                   of ((SrcOp.LoadImage v, _), (SrcOp.Kernel(h, k), _)) => Probe.expand {                   of ((SrcOp.LoadImage v, _), (SrcOp.Kernel(h, k), _)) => Probe.expand {
146                          result = result,                          result = result,
147                          img = rename (env, img),                          img = Env.rename (env, img),
148                          v = v, h = h, k = k,                          v = v, h = h, k = k,
149                          pos = rename (env, pos)                          pos = Env.rename (env, pos)
150                        }                        }
151                    | _ => raise Fail "bogus image/kernel binding"                    | _ => raise Fail "bogus image/kernel binding"
152                  (* end case *))                  (* end case *))
# Line 140  Line 167 
167                            val b = DstIL.Var.new("b", DstTy.realTy)                            val b = DstIL.Var.new("b", DstTy.realTy)
168                            val x = mkVar (i, j)                            val x = mkVar (i, j)
169                            val code = (x, DstIL.OP(DstOp.Mul DstTy.realTy, [a, b]))                            val code = (x, DstIL.OP(DstOp.Mul DstTy.realTy, [a, b]))
170                                  :: (b, DstIL.OP(DstOp.Select(colTy, j), [v2]))                                  :: (b, DstIL.OP(DstOp.Index(colTy, j), [v2]))
171                                  :: (a, DstIL.OP(DstOp.Select(rowTy, i), [v1]))                                  :: (a, DstIL.OP(DstOp.Index(rowTy, i), [v1]))
172                                  :: code                                  :: code
173                            in                            in
174                              colLp (j+1, x::colVars, code)                              colLp (j+1, x::colVars, code)
# Line 166  Line 193 
193    
194      fun expandOp (env, y, rator, args) = let      fun expandOp (env, y, rator, args) = let
195            fun assign rator' =            fun assign rator' =
196                  [(y, DstIL.OP(rator', renameList(env, args)))]                  [(y, DstIL.OP(rator', Env.renameList(env, args)))]
197            fun cvtToInt rator' = let            fun cvtToInt rator' = let
198                  val t = DstIL.Var.new ("t", DstTy.realTy)                  val t = DstIL.Var.new ("t", DstTy.realTy)
199                  in [                  in [
200                    (t, DstIL.OP(rator', renameList(env, args))),                    (t, DstIL.OP(rator', Env.renameList(env, args))),
201                    (y, DstIL.OP(DstOp.RealToInt 1, [t]))                    (y, DstIL.OP(DstOp.RealToInt 1, [t]))
202                  ] end                  ] end
203            fun dummy () = [(y, DstIL.LIT(Literal.Int 0))]            fun dummy () = [(y, DstIL.LIT(Literal.Int 0))]
# Line 201  Line 228 
228                    assign (DstOp.MulMatMat(d1, d2, d3))                    assign (DstOp.MulMatMat(d1, d2, d3))
229                | SrcOp.Cross => assign DstOp.Cross                | SrcOp.Cross => assign DstOp.Cross
230                | SrcOp.Outer(SrcTy.TensorTy[d1, d2]) => let                | SrcOp.Outer(SrcTy.TensorTy[d1, d2]) => let
231                    val [v1, v2] = renameList(env, args)                    val [v1, v2] = Env.renameList(env, args)
232                    in                    in
233                      expandOuter (env, y, d1, d2, v1, v2)                      expandOuter (env, y, d1, d2, v1, v2)
234                    end                    end
# Line 213  Line 240 
240                | SrcOp.Zero ty => assign (DstOp.Zero(cvtTy ty))                | SrcOp.Zero ty => assign (DstOp.Zero(cvtTy ty))
241                | SrcOp.Trace(SrcTy.TensorTy[d, _]) => assign (DstOp.Trace d)                | SrcOp.Trace(SrcTy.TensorTy[d, _]) => assign (DstOp.Trace d)
242                | SrcOp.Slice(ty, mask) => raise Fail "FIXME: Slice"                | SrcOp.Slice(ty, mask) => raise Fail "FIXME: Slice"
243                | SrcOp.Subscript ty => assign (DstOp.Subscript(cvtTy ty))                | SrcOp.TensorSub(ty as SrcTy.TensorTy _) => assign (DstOp.Subscript(cvtTy ty))
244                  | SrcOp.Select(ty as SrcTy.TupleTy _, i) => assign (DstOp.Select(cvtTy ty, i))
245                  | SrcOp.Select(ty as SrcTy.SeqTy _, i) => assign (DstOp.Index(cvtTy ty, i))
246                  | SrcOp.SeqSub(ty as SrcTy.SeqTy _) => assign (DstOp.Subscript(cvtTy ty))
247                | SrcOp.IntToReal => assign DstOp.IntToReal                | SrcOp.IntToReal => assign DstOp.IntToReal
248                | SrcOp.TruncToInt => cvtToInt (DstOp.Trunc 1)                | SrcOp.TruncToInt => cvtToInt (DstOp.Trunc 1)
249                | SrcOp.RoundToInt => cvtToInt (DstOp.Round 1)                | SrcOp.RoundToInt => cvtToInt (DstOp.Round 1)
# Line 243  Line 273 
273    
274    (* expand a SrcIL assignment to a list of DstIL assignments *)    (* expand a SrcIL assignment to a list of DstIL assignments *)
275      fun expand (env, (y, rhs)) = let      fun expand (env, (y, rhs)) = let
276            fun assign rhs = [(rename (env, y), rhs)]            fun assign rhs = [DstIL.ASSGN(Env.rename (env, y), rhs)]
277            in            in
278              case rhs              case rhs
279               of SrcIL.VAR x => assign (DstIL.VAR(rename(env, x)))               of SrcIL.STATE x => assign (DstIL.STATE(Env.renameSV(env, x)))
280                  | SrcIL.VAR x => assign (DstIL.VAR(Env.rename(env, x)))
281                | SrcIL.LIT lit => assign (DstIL.LIT lit)                | SrcIL.LIT lit => assign (DstIL.LIT lit)
282                | SrcIL.OP(SrcOp.Field _, args) => []                | SrcIL.OP(SrcOp.Field _, args) => []
283                | SrcIL.OP(rator, args) => expandOp (env, rename (env, y), rator, args)                | SrcIL.OP(rator, args) =>
284                | SrcIL.APPLY(f, args) => assign(DstIL.APPLY(f, renameList(env, args)))                    List.map DstIL.ASSGN (expandOp (env, Env.rename (env, y), rator, args))
285                | SrcIL.CONS(ty, args) => assign (DstIL.CONS(cvtTy ty, renameList(env, args)))                | SrcIL.APPLY(f, args) => assign(DstIL.APPLY(f, Env.renameList(env, args)))
286                  | SrcIL.CONS(ty, args) => assign (DstIL.CONS(cvtTy ty, Env.renameList(env, args)))
287              (* end case *)              (* end case *)
288            end            end
289    
290      (* expand a SrcIL multi-assignment to a DstIL CFG *)
291        fun mexpand (env, (ys, rator, xs)) = let
292              val ys' = Env.renameList(env, ys)
293              val rator' = (case rator
294                     of SrcOp.Eigen2x2 => DstOp.EigenVecs2x2
295                      | SrcOp.Eigen3x3 => DstOp.EigenVecs3x3
296                      | SrcOp.Print tys => DstOp.Print(List.map cvtTy tys)
297                      | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
298                    (* end case *))
299              val xs' = Env.renameList(env, xs)
300              val nd = DstIL.Node.mkMASSIGN(ys', rator', xs')
301              in
302                DstIL.CFG{entry=nd, exit=nd}
303              end
304    
305      structure Trans =  TranslateFn (      structure Trans =  TranslateFn (
306        struct        struct
307          structure SrcIL = SrcIL          open Env
         structure DstIL = DstIL  
   
         type var_env = var_env  
   
         val rename = rename  
         val renameList = renameList  
308          val expand = DstIL.CFG.mkBlock o expand          val expand = DstIL.CFG.mkBlock o expand
309            val mexpand = mexpand
310        end)        end)
311    
312      fun translate prog = let      fun translate prog = let

Legend:
Removed from v.1639  
changed lines
  Added in v.1640

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