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

SCM Repository

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

Diff of /branches/pure-cfg/src/compiler/translate/translate-basis.sml

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

revision 1555, Sun Oct 23 15:43:11 2011 UTC revision 1556, Sun Oct 23 15:43:41 2011 UTC
# Line 13  Line 13 
13     * reverse order.     * reverse order.
14     *)     *)
15      val translate : (HighIL.var * Var.var * Types.meta_var list * HighIL.var list)      val translate : (HighIL.var * Var.var * Types.meta_var list * HighIL.var list)
16            -> HighIL.assign list            -> HighIL.assignment list
17    
18    end = struct    end = struct
19    
# Line 49  Line 49 
49            end            end
50      fun shapeVarToTensor sv = pruneShape sv      fun shapeVarToTensor sv = pruneShape sv
51    
52      fun assign (y, rator, xs) = [(y, IL.OP(rator, xs))]      fun assign (y, rator, xs) = [IL.ASSGN(y, IL.OP(rator, xs))]
53    
54      fun basisFn name (y, [], xs) = [(y, IL.APPLY(name, xs))]      fun basisFn name (y, [], xs) = [IL.ASSGN(y, IL.APPLY(name, xs))]
55    
56      fun simpleOp rator (y, [], xs) = assign (y, rator, xs)      fun simpleOp rator (y, [], xs) = assign (y, rator, xs)
57    
# Line 61  Line 61 
61    
62      fun kernel h (y, [], []) = assign(y, Op.Kernel(h, 0), [])      fun kernel h (y, [], []) = assign(y, Op.Kernel(h, 0), [])
63    
64    (* utility function for synthesizing eigenvector/eigenvalue code *)    (* utility functions for synthesizing eigenvector/eigenvalue code *)
65      fun eigen (rator, dim, i) = let      fun eigenVec (rator, dim) = let
66            val tplTy = DstTy.TupleTy[            val ty = DstTy.SeqTy(DstTy.realTy, dim)
                   DstTy.SeqTy(DstTy.realTy, dim),  
                   DstTy.SeqTy(DstTy.vecTy dim, dim)  
                 ]  
67            in            in
68              fn (y, _, [m]) => let              fn (y, _, [m]) => let
69                  val tpl = IL.Var.new("tpl", tplTy)                  val v = IL.Var.new("evals", ty)
70                  in [                  in
71                    (tpl, IL.OP(rator, [m])),                    [IL.MASSGN([v, y], rator, [m])]
72                    (y, IL.OP(Op.Select(tplTy, i), [tpl]))                  end
73                  ] end            end
74        fun eigenVal (rator, dim) = let
75              val ty = DstTy.SeqTy(DstTy.vecTy dim, dim)
76              in
77                fn (y, _, [m]) => let
78                    val v = IL.Var.new("evecs", ty)
79                    in
80                      [IL.MASSGN([y, v], rator, [m])]
81                    end
82            end            end
83    
84    (* build a table that maps Basis variables to their translation functions *)    (* build a table that maps Basis variables to their translation functions *)
85      val tbl : ((IL.var * Ty.meta_var list * IL.var list) -> IL.assign list) VTbl.hash_table = let      val tbl : ((IL.var * Ty.meta_var list * IL.var list) -> IL.assignment list) VTbl.hash_table = let
86            val tbl = VTbl.mkTable (128, Fail "Translate table")            val tbl = VTbl.mkTable (128, Fail "Translate table")
87            in            in
88              List.app (VTbl.insert tbl) [              List.app (VTbl.insert tbl) [
# Line 115  Line 120 
120                                            val one = IL.Var.new("one", DstTy.realTy)                                            val one = IL.Var.new("one", DstTy.realTy)
121                                            val s' = IL.Var.new("sInv", DstTy.realTy)                                            val s' = IL.Var.new("sInv", DstTy.realTy)
122                                            in [                                            in [
123                                              (one, IL.LIT(Literal.Float(FloatLit.one))),                                              IL.ASSGN(one, IL.LIT(Literal.Float(FloatLit.one))),
124                                              (s', IL.OP(Op.Div DstTy.realTy, [one, s])),                                              IL.ASSGN(s', IL.OP(Op.Div DstTy.realTy, [one, s])),
125                                              (y, IL.OP(Op.Scale(shapeVarToTensor sv), [s', x]))                                              IL.ASSGN(y, IL.OP(Op.Scale(shapeVarToTensor sv), [s', x]))
126                                            ] end),                                            ] end),
127                  (BV.div_fr,             fn (y, _, [f, s]) => let                  (BV.div_fr,             fn (y, _, [f, s]) => let
128                                            val one = IL.Var.new("one", DstTy.realTy)                                            val one = IL.Var.new("one", DstTy.realTy)
129                                            val s' = IL.Var.new("sInv", DstTy.realTy)                                            val s' = IL.Var.new("sInv", DstTy.realTy)
130                                            in [                                            in [
131                                              (one, IL.LIT(Literal.Float(FloatLit.one))),                                              IL.ASSGN(one, IL.LIT(Literal.Float(FloatLit.one))),
132                                              (s', IL.OP(Op.Div DstTy.realTy, [one, s])),                                              IL.ASSGN(s', IL.OP(Op.Div DstTy.realTy, [one, s])),
133                                              (y, IL.OP(Op.ScaleField, [s', f]))                                              IL.ASSGN(y, IL.OP(Op.ScaleField, [s', f]))
134                                            ] end),                                            ] end),
135                  (BV.exp_ri,             simpleOp(Op.Power)),                  (BV.exp_ri,             simpleOp(Op.Power)),
136                  (BV.exp_rr,             basisFn ILBasis.pow),                  (BV.exp_rr,             basisFn ILBasis.pow),
# Line 187  Line 192 
192                                            val t2 = IL.Var.new("t2", DstTy.realTy)                                            val t2 = IL.Var.new("t2", DstTy.realTy)
193                                            val t3 = IL.Var.new("t3", DstTy.realTy)                                            val t3 = IL.Var.new("t3", DstTy.realTy)
194                                            in [                                            in [
195                                              (t1, IL.OP(Op.Sub DstTy.realTy, [x, x0])),                                              IL.ASSGN(t1, IL.OP(Op.Sub DstTy.realTy, [x, x0])),
196                                              (t2, IL.OP(Op.Sub DstTy.realTy, [x1, x0])),                                              IL.ASSGN(t2, IL.OP(Op.Sub DstTy.realTy, [x1, x0])),
197                                              (t3, IL.OP(Op.Div DstTy.realTy, [t1, t2])),                                              IL.ASSGN(t3, IL.OP(Op.Div DstTy.realTy, [t1, t2])),
198                                              (y,  IL.OP(Op.Lerp(shapeVarToTensor sv), [a, b, t3]))                                              IL.ASSGN(y,  IL.OP(Op.Lerp(shapeVarToTensor sv), [a, b, t3]))
199                                            ] end),                                            ] end),
200                  (BV.evals2x2,           eigen (Op.Eigen2x2, 2, 1)),                  (BV.evals2x2,           eigenVal (Op.Eigen2x2, 2)),
201                  (BV.evals3x3,           eigen (Op.Eigen3x3, 3, 1)),                  (BV.evals3x3,           eigenVal (Op.Eigen3x3, 3)),
202                  (BV.evecs2x2,           eigen (Op.Eigen2x2, 2, 2)),                  (BV.evecs2x2,           eigenVec (Op.Eigen2x2, 2)),
203                  (BV.evecs3x3,           eigen (Op.Eigen3x3, 3, 2)),                  (BV.evecs3x3,           eigenVec (Op.Eigen3x3, 3)),
204                  (BV.fn_max,             simpleOp Op.Max),                  (BV.fn_max,             simpleOp Op.Max),
205                  (BV.fn_min,             simpleOp Op.Min),                  (BV.fn_min,             simpleOp Op.Min),
206                  (BV.fn_modulate,        vectorOp Op.Mul),                  (BV.fn_modulate,        vectorOp Op.Mul),

Legend:
Removed from v.1555  
changed lines
  Added in v.1556

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