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

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/mid-to-low/mid-to-low.sml
ViewVC logotype

Annotation of /branches/vis15/src/compiler/mid-to-low/mid-to-low.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3779 - (view) (download)

1 : jhr 3625 (* mid-to-low.sml
2 :     *
3 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *
6 :     * Translation from MidIR to LowIR representations.
7 :     *)
8 :    
9 :     structure MidToLow : sig
10 :    
11 :     val translate : MidIR.program -> LowIR.program
12 :    
13 :     end = struct
14 :    
15 :     structure SrcIR = MidIR
16 :     structure SrcOp = MidOps
17 : jhr 3707 structure SrcGV = SrcIR.GlobalVar
18 : jhr 3625 structure SrcSV = SrcIR.StateVar
19 :     structure SrcTy = MidTypes
20 :     structure VTbl = SrcIR.Var.Tbl
21 :     structure DstIR = LowIR
22 :     structure DstTy = LowTypes
23 :     structure DstOp = LowOps
24 :    
25 : jhr 3779 fun cvtTy ty = (case ty
26 :     of SrcTy.BoolTy => DstTy.BoolTy
27 :     | SrcTy.StringTy => DstTy.StringTy
28 :     | SrcTy.IntTy => DstTy.IntTy
29 :     | SrcTy.TensorTy sh => DstTy.TensorTy sh
30 :     | SrcTy.TupleTy tys => DstTy.TupleTy(List.map cvtTy tys)
31 :     | SrcTy.SeqTy(ty, d) => DstTy.SeqTy(cvtTy ty, d)
32 :     | SrcTy.ImageTy info => DstTy.ImageTy info
33 :     | SrcTy.KernelTy => DstTy.IntTy
34 :     (* end case *))
35 : jhr 3632
36 : jhr 3625 (* instantiate the translation environment *)
37 :     structure Env = TranslateEnvFn (
38 :     struct
39 : jhr 3707 structure SrcIR = SrcIR
40 :     structure DstIR = DstIR
41 : jhr 3632 val cvtTy = cvtTy
42 : jhr 3625 end)
43 :    
44 : jhr 3745 fun expandBuildPos (y, s, [pos]) = let
45 :     (* create positions from 1-s.. to s *)
46 :     val range = 2*s
47 : jhr 3754 fun f (0, xs, stms) = (xs, List.rev stms)
48 :     | f (i, xs, stms) = let
49 :     val e1 = IntInf.fromInt(i-s)
50 :     val r = DstIR.Var.new ("rlit", DstTy.realTy)
51 :     val x = DstIR.Var.new ("sub", DstTy.realTy)
52 :     val stm1 = (r, DstIR.LIT(Literal.Real(RealLit.fromInt e1)))
53 :     val stm2 = (x, DstIR.OP(DstOp.RSub, [pos, r]))
54 : jhr 3745 in
55 : jhr 3754 f(i-1, x::xs, stm1::stm2::stms)
56 : jhr 3745 end
57 : jhr 3754 val (xs, stms) = f(range, [], [])
58 : jhr 3745 in
59 : jhr 3754 List.rev ((y, DstIR.CONS(xs, DstTy.TensorTy[range])) :: stms)
60 : jhr 3745 end
61 :     | expandBuildPos _ = raise Fail "expected one argument for BuildPos"
62 : cchiw 3741
63 : jhr 3625 fun expandOp (env, y, rator, args) = let
64 :     val args' = Env.renameList (env, args)
65 :     fun assign rator' = [(y, DstIR.OP(rator', args'))]
66 :     fun dummy () = [(y, DstIR.LIT(Literal.Int 0))]
67 : jhr 3725 fun copy () = let val [x] = args
68 :     in
69 :     [(y, DstIR.VAR(Env.rename(env, x)))]
70 :     end
71 : jhr 3625 in
72 :     case rator
73 :     of SrcOp.IAdd => assign DstOp.IAdd
74 :     | SrcOp.ISub => assign DstOp.ISub
75 :     | SrcOp.IMul => assign DstOp.IMul
76 :     | SrcOp.IDiv => assign DstOp.IDiv
77 :     | SrcOp.IMod => assign DstOp.IMod
78 :     | SrcOp.INeg => assign DstOp.INeg
79 : jhr 3632 | SrcOp.LT ty => assign (DstOp.LT(cvtTy ty))
80 :     | SrcOp.LTE ty => assign (DstOp.LTE(cvtTy ty))
81 :     | SrcOp.EQ ty => assign (DstOp.EQ(cvtTy ty))
82 :     | SrcOp.NEQ ty => assign (DstOp.NEQ(cvtTy ty))
83 :     | SrcOp.GT ty => assign (DstOp.GT(cvtTy ty))
84 :     | SrcOp.GTE ty => assign (DstOp.GTE(cvtTy ty))
85 : jhr 3625 | SrcOp.Not => assign DstOp.Not
86 : jhr 3708 | SrcOp.Abs ty => assign (DstOp.Abs(cvtTy ty))
87 :     | SrcOp.Max ty => assign (DstOp.Max(cvtTy ty))
88 :     | SrcOp.Min ty => assign (DstOp.Min(cvtTy ty))
89 : jhr 3632 | SrcOp.Clamp ty => assign (DstOp.Clamp(cvtTy ty))
90 :     | SrcOp.Lerp ty => assign (DstOp.Lerp(cvtTy ty))
91 : jhr 3708 | SrcOp.EigenVecs2x2 => assign (DstOp.EigenVecs2x2)
92 :     | SrcOp.EigenVecs3x3 => assign (DstOp.EigenVecs3x3)
93 : jhr 3625 | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)
94 :     | SrcOp.EigenVals3x3 => assign (DstOp.EigenVals3x3)
95 : jhr 3708 | SrcOp.Zero ty => assign (DstOp.Zero(cvtTy ty))
96 :     | SrcOp.Select(ty, i) => assign (DstOp.Select(cvtTy ty, i))
97 : jhr 3632 | SrcOp.Index(ty, i) => assign (DstOp.Index(cvtTy ty, i))
98 : jhr 3708 | SrcOp.Subscript ty => assign (DstOp.Subscript(cvtTy ty))
99 :     | SrcOp.MkDynamic(ty, n) => assign (DstOp.MkDynamic(cvtTy ty, n))
100 :     | SrcOp.Append ty => assign (DstOp.Append(cvtTy ty))
101 :     | SrcOp.Prepend ty => assign (DstOp.Prepend(cvtTy ty))
102 :     | SrcOp.Concat ty => assign (DstOp.Concat(cvtTy ty))
103 :     | SrcOp.Range => assign DstOp.Range
104 :     | SrcOp.Length ty => assign (DstOp.Length(cvtTy ty))
105 :     | SrcOp.SphereQuery(ty1, ty2) => assign (DstOp.SphereQuery(cvtTy ty1, cvtTy ty2))
106 : jhr 3632 | SrcOp.Ceiling d => assign (DstOp.Ceiling d)
107 : jhr 3625 | SrcOp.Floor d => assign (DstOp.Floor d)
108 :     | SrcOp.Round d => assign (DstOp.Round d)
109 :     | SrcOp.Trunc d => assign (DstOp.Trunc d)
110 :     | SrcOp.IntToReal => assign (DstOp.IntToReal)
111 :     | SrcOp.RealToInt d => assign (DstOp.RealToInt d)
112 : jhr 3738 (*
113 :     R_All
114 :     R_Exists
115 :     R_Max
116 :     R_Min
117 :     R_Sum
118 :     R_Product
119 :     R_Mean
120 :     R_Variance
121 :     *)
122 : jhr 3745 | SrcOp.BuildPos s => expandBuildPos (y, s, args')
123 : jhr 3738 | SrcOp.EvalKernel(d, h, k) => EvalKern.expand(y, d, h, k, args')
124 : jhr 3778 | SrcOp.Kernel _ => dummy()
125 : jhr 3708 | SrcOp.Transform img => assign (DstOp.Transform img)
126 :     | SrcOp.Translate img => assign (DstOp.Translate img)
127 : jhr 3778 | SrcOp.LoadVoxels(info, s) => (case args'
128 :     of [img, idx] => LoadVoxels.expand {
129 :     lhs = y, info = info, s = s, img = img, idx = idx
130 :     }
131 :     | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
132 : jhr 3745 (* end case *))
133 : jhr 3778 | SrcOp.LoadVoxelsWithCtl(info, s, ctl) => (case args'
134 :     of [img, idx] => LoadVoxels.expandWithCtl {
135 :     lhs = y, info = info, s = s, ctl = ctl, img = img, idx = idx
136 :     }
137 :     | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
138 :     (* end case *))
139 :     | SrcOp.Inside arg => assign (DstOp.Inside arg)
140 :     | SrcOp.ImageDim arg => assign (DstOp.ImageDim arg)
141 :     (* QUESTION: will we still have BorderCtl* operators at this point? *)
142 :     | SrcOp.BorderCtlDefault info => (case args'
143 :     of [x] => [(y, DstIR.VAR x)]
144 :     | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
145 :     (* end case *))
146 : jhr 3725 | SrcOp.BorderCtlClamp info => copy()
147 :     | SrcOp.BorderCtlMirror info => copy()
148 :     | SrcOp.BorderCtlWrap info => copy()
149 : jhr 3708 | SrcOp.LoadSeq(ty, nrrd) => assign (DstOp.LoadSeq(cvtTy ty, nrrd))
150 :     | SrcOp.LoadImage(ty, nrrd) => assign (DstOp.LoadImage(cvtTy ty, nrrd))
151 :     | SrcOp.MathFn f => assign (DstOp.MathFn f)
152 : jhr 3625 | rator => raise Fail("bogus operator " ^ SrcOp.toString rator)
153 :     (* end case *)
154 :     end
155 :    
156 :     (* expand a SrcIR assignment to a DstIR CFG *)
157 :     fun expand (env, (y, rhs)) = let
158 :     val y' = Env.rename (env, y)
159 :     fun assign rhs = [DstIR.ASSGN(y', rhs)]
160 : jhr 3627 in
161 : jhr 3625 case rhs
162 :     of SrcIR.GLOBAL x => assign (DstIR.GLOBAL(Env.renameGV(env, x)))
163 :     | SrcIR.STATE x => assign (DstIR.STATE(Env.renameSV(env, x)))
164 :     | SrcIR.VAR x => assign (DstIR.VAR(Env.rename(env, x)))
165 :     | SrcIR.LIT lit => assign (DstIR.LIT lit)
166 :     | SrcIR.OP(rator, args) => List.map DstIR.ASSGN (expandOp (env, y', rator, args))
167 : jhr 3632 | SrcIR.CONS(args, ty) => assign (DstIR.CONS(Env.renameList(env, args), cvtTy ty))
168 :     | SrcIR.SEQ(args, ty) => assign (DstIR.SEQ(Env.renameList(env, args), cvtTy ty))
169 : jhr 3745 | SrcIR.EINAPP(rator, args) => (
170 :     EinToLow.expand (y', rator, Env.renameList(env, args))
171 :     handle ex => (
172 :     print (concat [
173 :     "error converting\n ", EinPP.toString rator,
174 :     String.concatWithMap "," SrcIR.Var.name args
175 :     ]);
176 :     raise ex))
177 : jhr 3625 (* end case *)
178 :     end
179 :    
180 :     (* expand a SrcIR multi-assignment to a DstIR CFG *)
181 :     fun mexpand (env, (ys, rator, xs)) = let
182 :     val ys' = Env.renameList(env, ys)
183 :     val rator' = (case rator
184 :     of SrcOp.EigenVecs2x2 => DstOp.EigenVecs2x2
185 :     | SrcOp.EigenVecs3x3 => DstOp.EigenVecs3x3
186 : jhr 3778 | SrcOp.Print tys => DstOp.Print (List.map cvtTy tys)
187 : jhr 3625 | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
188 :     (* end case *))
189 :     val xs' = Env.renameList(env, xs)
190 :     val nd = DstIR.Node.mkMASSIGN(ys', rator', xs')
191 :     in
192 :     DstIR.CFG{entry=nd, exit=nd}
193 :     end
194 :    
195 :     structure Trans = TranslateFn (
196 :     struct
197 :     open Env
198 :     val expand = DstIR.CFG.mkBlock o expand
199 :     val mexpand = mexpand
200 :     end)
201 :    
202 :     fun translate prog = let
203 :     val prog = Trans.translate prog
204 :     in
205 : jhr 3708 LowCensus.init prog;
206 : jhr 3625 prog
207 :     end
208 :    
209 :     end

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