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 4434 - (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 : jhr 4317 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.StrandTy n => DstTy.StrandTy n
34 :     | SrcTy.KernelTy => DstTy.IntTy
35 :     (* end case *))
36 : jhr 3632
37 : jhr 3625 (* instantiate the translation environment *)
38 :     structure Env = TranslateEnvFn (
39 :     struct
40 : jhr 3707 structure SrcIR = SrcIR
41 :     structure DstIR = DstIR
42 : jhr 3632 val cvtTy = cvtTy
43 : jhr 3625 end)
44 :    
45 : jhr 3745 fun expandBuildPos (y, s, [pos]) = let
46 : jhr 4317 (* create positions from 1-s.. to s *)
47 :     val range = 2*s
48 :     fun f (0, xs, stms) = (xs, List.rev stms)
49 :     | f (i, xs, stms) = (case IntInf.fromInt(i - s)
50 :     of 0 => f(i-1, pos::xs, stms)
51 :     | j => let
52 :     val r = DstIR.Var.new ("rlit", DstTy.realTy)
53 :     val x = DstIR.Var.new ("idx", DstTy.realTy)
54 :     val stms = if (j < 0)
55 :     then (r, DstIR.LIT(Literal.Real(RealLit.fromInt(~j)))) ::
56 :     (x, DstIR.OP(DstOp.RAdd, [pos, r])) :: stms
57 :     else (r, DstIR.LIT(Literal.Real(RealLit.fromInt j))) ::
58 :     (x, DstIR.OP(DstOp.RSub, [pos, r])) :: stms
59 :     in
60 :     f(i-1, x::xs, stms)
61 :     end
62 :     (* end case *))
63 :     val (xs, stms) = f(range, [], [])
64 :     in
65 :     List.rev ((y, DstIR.CONS(xs, DstTy.TensorTy[range])) :: stms)
66 :     end
67 : jhr 3745 | expandBuildPos _ = raise Fail "expected one argument for BuildPos"
68 : cchiw 3741
69 : jhr 3625 fun expandOp (env, y, rator, args) = let
70 :     val args' = Env.renameList (env, args)
71 :     fun assign rator' = [(y, DstIR.OP(rator', args'))]
72 :     fun dummy () = [(y, DstIR.LIT(Literal.Int 0))]
73 : jhr 3725 fun copy () = let val [x] = args
74 :     in
75 :     [(y, DstIR.VAR(Env.rename(env, x)))]
76 :     end
77 : jhr 3625 in
78 :     case rator
79 :     of SrcOp.IAdd => assign DstOp.IAdd
80 :     | SrcOp.ISub => assign DstOp.ISub
81 :     | SrcOp.IMul => assign DstOp.IMul
82 :     | SrcOp.IDiv => assign DstOp.IDiv
83 :     | SrcOp.IMod => assign DstOp.IMod
84 :     | SrcOp.INeg => assign DstOp.INeg
85 : jhr 3632 | SrcOp.LT ty => assign (DstOp.LT(cvtTy ty))
86 :     | SrcOp.LTE ty => assign (DstOp.LTE(cvtTy ty))
87 :     | SrcOp.EQ ty => assign (DstOp.EQ(cvtTy ty))
88 :     | SrcOp.NEQ ty => assign (DstOp.NEQ(cvtTy ty))
89 :     | SrcOp.GT ty => assign (DstOp.GT(cvtTy ty))
90 :     | SrcOp.GTE ty => assign (DstOp.GTE(cvtTy ty))
91 : jhr 4434 | SrcOp.BAnd => assign DstOp.BAnd
92 :     | SrcOp.BOr => assign DstOp.BOr
93 :     | SrcOp.BNot => assign DstOp.BNot
94 : jhr 3708 | SrcOp.Abs ty => assign (DstOp.Abs(cvtTy ty))
95 :     | SrcOp.Max ty => assign (DstOp.Max(cvtTy ty))
96 :     | SrcOp.Min ty => assign (DstOp.Min(cvtTy ty))
97 : jhr 3832 | SrcOp.Clamp ty => (case ty
98 : jhr 4317 of SrcTy.TensorTy[] => assign DstOp.RClamp
99 :     | SrcTy.TensorTy[d] => assign (DstOp.VClamp d)
100 :     | SrcTy.TensorTy dd => raise Fail "FIXME: higher-order clamp not yet supported"
101 :     | _ => raise Fail("bogus " ^ SrcOp.toString rator)
102 :     (* end case *))
103 : jhr 3832 | SrcOp.MapClamp ty => (case ty
104 : jhr 4317 of SrcTy.TensorTy[] => assign DstOp.RClamp
105 :     | SrcTy.TensorTy[d] => assign (DstOp.VMapClamp d)
106 :     | SrcTy.TensorTy dd => raise Fail "FIXME: higher-order clamp not yet supported"
107 :     | _ => raise Fail("bogus " ^ SrcOp.toString rator)
108 :     (* end case *))
109 : jhr 3832 | SrcOp.Lerp ty => (case ty
110 : jhr 4317 of SrcTy.TensorTy[] => assign DstOp.RLerp
111 :     | SrcTy.TensorTy[d] => assign (DstOp.VLerp d)
112 :     | SrcTy.TensorTy dd => raise Fail "FIXME: higher-order lerp not yet supported"
113 :     | _ => raise Fail("bogus " ^ SrcOp.toString rator)
114 :     (* end case *))
115 : jhr 3708 | SrcOp.EigenVecs2x2 => assign (DstOp.EigenVecs2x2)
116 :     | SrcOp.EigenVecs3x3 => assign (DstOp.EigenVecs3x3)
117 : jhr 3625 | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)
118 :     | SrcOp.EigenVals3x3 => assign (DstOp.EigenVals3x3)
119 : jhr 3708 | SrcOp.Zero ty => assign (DstOp.Zero(cvtTy ty))
120 : jhr 3832 | SrcOp.TensorIndex(SrcTy.TensorTy[d], [i]) => assign (DstOp.VIndex(d,i))
121 : jhr 3797 | SrcOp.TensorIndex(ty, shp) => assign (DstOp.TensorIndex(cvtTy ty, shp))
122 : jhr 3708 | SrcOp.Select(ty, i) => assign (DstOp.Select(cvtTy ty, i))
123 :     | SrcOp.Subscript ty => assign (DstOp.Subscript(cvtTy ty))
124 :     | SrcOp.MkDynamic(ty, n) => assign (DstOp.MkDynamic(cvtTy ty, n))
125 :     | SrcOp.Append ty => assign (DstOp.Append(cvtTy ty))
126 :     | SrcOp.Prepend ty => assign (DstOp.Prepend(cvtTy ty))
127 :     | SrcOp.Concat ty => assign (DstOp.Concat(cvtTy ty))
128 : jhr 4317 | SrcOp.Range => assign DstOp.Range
129 : jhr 3708 | SrcOp.Length ty => assign (DstOp.Length(cvtTy ty))
130 : jhr 4349 | SrcOp.SphereQuery(dim, ty) => assign (DstOp.SphereQuery(dim, cvtTy ty))
131 : jhr 3632 | SrcOp.Ceiling d => assign (DstOp.Ceiling d)
132 : jhr 3625 | SrcOp.Floor d => assign (DstOp.Floor d)
133 :     | SrcOp.Round d => assign (DstOp.Round d)
134 :     | SrcOp.Trunc d => assign (DstOp.Trunc d)
135 :     | SrcOp.IntToReal => assign (DstOp.IntToReal)
136 :     | SrcOp.RealToInt d => assign (DstOp.RealToInt d)
137 : jhr 4394 | SrcOp.NumStrands set => assign (DstOp.NumStrands set)
138 : jhr 4362 | SrcOp.Strands(ty, set) => assign (DstOp.Strands(cvtTy ty, set))
139 : jhr 4317 | SrcOp.BuildPos s => expandBuildPos (y, s, args')
140 : jhr 3738 | SrcOp.EvalKernel(d, h, k) => EvalKern.expand(y, d, h, k, args')
141 : jhr 3778 | SrcOp.Kernel _ => dummy()
142 : jhr 3708 | SrcOp.Transform img => assign (DstOp.Transform img)
143 :     | SrcOp.Translate img => assign (DstOp.Translate img)
144 : jhr 4317 | SrcOp.LoadVoxels(info, s) => (case args'
145 :     of [img, idx] => LoadVoxels.expand {
146 :     lhs = y, info = info, s = s, img = img, idx = idx
147 :     }
148 :     | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
149 :     (* end case *))
150 :     | SrcOp.LoadVoxelsWithCtl(info, s, ctl) => (case args'
151 :     of [img, idx] => LoadVoxels.expandWithCtl {
152 :     lhs = y, info = info, s = s, ctl = ctl, img = img, idx = idx
153 :     }
154 :     | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
155 :     (* end case *))
156 : jhr 3778 | SrcOp.Inside arg => assign (DstOp.Inside arg)
157 : jhr 4185 | SrcOp.IndexInside arg => assign (DstOp.IndexInside arg)
158 : jhr 3778 | SrcOp.ImageDim arg => assign (DstOp.ImageDim arg)
159 :     (* QUESTION: will we still have BorderCtl* operators at this point? *)
160 :     | SrcOp.BorderCtlDefault info => (case args'
161 : jhr 4317 of [x] => [(y, DstIR.VAR x)]
162 :     | _ => raise Fail("bogus operator " ^ SrcOp.toString rator)
163 :     (* end case *))
164 : jhr 3725 | SrcOp.BorderCtlClamp info => copy()
165 :     | SrcOp.BorderCtlMirror info => copy()
166 :     | SrcOp.BorderCtlWrap info => copy()
167 : jhr 3708 | SrcOp.LoadSeq(ty, nrrd) => assign (DstOp.LoadSeq(cvtTy ty, nrrd))
168 :     | SrcOp.LoadImage(ty, nrrd) => assign (DstOp.LoadImage(cvtTy ty, nrrd))
169 : jhr 4317 | SrcOp.MathFn f => assign (DstOp.MathFn f)
170 : jhr 3625 | rator => raise Fail("bogus operator " ^ SrcOp.toString rator)
171 :     (* end case *)
172 :     end
173 :    
174 :     (* expand a SrcIR assignment to a DstIR CFG *)
175 :     fun expand (env, (y, rhs)) = let
176 :     val y' = Env.rename (env, y)
177 :     fun assign rhs = [DstIR.ASSGN(y', rhs)]
178 : jhr 3627 in
179 : jhr 3625 case rhs
180 :     of SrcIR.GLOBAL x => assign (DstIR.GLOBAL(Env.renameGV(env, x)))
181 : jhr 3846 | SrcIR.STATE(NONE, fld) => assign (DstIR.STATE(NONE, Env.renameSV(env, fld)))
182 :     | SrcIR.STATE(SOME x, fld) =>
183 : jhr 4317 assign (DstIR.STATE(SOME(Env.rename(env, x)), Env.renameSV(env, fld)))
184 : jhr 3625 | SrcIR.VAR x => assign (DstIR.VAR(Env.rename(env, x)))
185 :     | SrcIR.LIT lit => assign (DstIR.LIT lit)
186 :     | SrcIR.OP(rator, args) => List.map DstIR.ASSGN (expandOp (env, y', rator, args))
187 : jhr 3632 | SrcIR.CONS(args, ty) => assign (DstIR.CONS(Env.renameList(env, args), cvtTy ty))
188 :     | SrcIR.SEQ(args, ty) => assign (DstIR.SEQ(Env.renameList(env, args), cvtTy ty))
189 : jhr 3745 | SrcIR.EINAPP(rator, args) => (
190 : jhr 4317 EinToLow.expand (y', rator, Env.renameList(env, args))
191 :     handle ex => (
192 :     print (concat [
193 :     "MidToLow.expand: error converting ", EinPP.toString rator, "(",
194 :     String.concatWithMap "," SrcIR.Var.name args, ")\n"
195 :     ]);
196 :     raise ex))
197 :     | SrcIR.APPLY(f, args) =>
198 :     assign (DstIR.APPLY(Env.renameFV(env, f), Env.renameList(env, args)))
199 : jhr 4378 | _ => raise Fail("bogus rhs for ASSIGN: " ^ SrcIR.RHS.toString rhs)
200 : jhr 3625 (* end case *)
201 :     end
202 :    
203 :     (* expand a SrcIR multi-assignment to a DstIR CFG *)
204 : jhr 4362 fun mexpand (env, (ys, rhs)) = let
205 : jhr 4378 fun massign rhs = let
206 :     val nd = DstIR.Node.mkMASSIGN(Env.renameList(env, ys), rhs)
207 :     in
208 :     DstIR.CFG{entry=nd, exit=nd}
209 :     end
210 :     fun mkOP (rator, xs) = massign(DstIR.OP(rator, Env.renameList(env, xs)))
211 :     in
212 :     case rhs
213 :     of SrcIR.OP(SrcOp.EigenVecs2x2, xs) => mkOP (DstOp.EigenVecs2x2, xs)
214 :     | SrcIR.OP(SrcOp.EigenVecs3x3, xs) => mkOP (DstOp.EigenVecs3x3, xs)
215 :     | SrcIR.OP(SrcOp.Print tys, xs) => mkOP (DstOp.Print(List.map cvtTy tys), xs)
216 :     | SrcIR.MAPREDUCE mrs => let
217 :     val mrs = List.map
218 :     (fn (r, f, xs) => (r, Env.renameFV(env, f), Env.renameList(env, xs)))
219 :     mrs
220 :     in
221 :     massign (DstIR.MAPREDUCE mrs)
222 :     end
223 :     | _ => raise Fail("bogus rhs for MASSIGN: " ^ SrcIR.RHS.toString rhs)
224 :     (* end case *)
225 :     end
226 : jhr 3625
227 :     structure Trans = TranslateFn (
228 :     struct
229 :     open Env
230 :     val expand = DstIR.CFG.mkBlock o expand
231 :     val mexpand = mexpand
232 :     end)
233 :    
234 :     fun translate prog = let
235 :     val prog = Trans.translate prog
236 :     in
237 : jhr 3708 LowCensus.init prog;
238 : jhr 3625 prog
239 :     end
240 :    
241 :     end

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