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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2924 - (view) (download)

1 : jhr 2924 (* iter.sml
2 :     *
3 :     * COPYRIGHT (c) 2015 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *)
6 :    
7 : cchiw 2859 structure Iter = struct
8 :     local
9 :     structure H=Helper
10 :    
11 :     in
12 :    
13 :     fun iTos e=H.iTos e
14 :     fun mkCons e=H.assgnCons e
15 :     fun insert e=H.insert e
16 :    
17 : jhr 2924 val empty = H.empty
18 : cchiw 2859
19 :     (*prodIter:int list*int list* function* function args-> Var*LowIL.Assgn
20 :     * Iters over the shape of the EIN operator
21 :     * creates mapp
22 :     * binds each outer index
23 :     *)
24 :     fun prodIter(origIndex,index,nextfn,args)=(let
25 :     val index'=List.map (fn (e)=>(e-1)) index
26 :     fun get(n,m,mapp)=let
27 :     val mapp =insert(n, m) mapp
28 :     in
29 :     nextfn(mapp,args)
30 :     end
31 :     fun Iter(mapp,[],rest,code,shape,_,_)=let
32 :     val (vF,code')=nextfn(mapp,args)
33 :     in (vF, code'@code)
34 :     end
35 :     | Iter(mapp,[0], rest, code,shape,n,str)=let
36 :     val (vF,code')= get(n,0,mapp)
37 :     val(vE,E)=mkCons(str,shape,[vF]@rest)
38 :     in
39 :     (vE, code'@code@E)
40 :     end
41 :     | Iter(mapp,[c],rest,code,shape,n,str)=let
42 :     val (vE,E)=get(n,c,mapp)
43 :     in
44 :     Iter(mapp, [c-1], [vE]@rest,E@code,shape,n,str)
45 :     end
46 :     | Iter(mapp,b::c,rest,ccode,s::shape,n,str0)=let
47 :     val n'=n+1
48 :     fun S(0, rest,code)=let
49 :     val mapp =insert(n, 0) mapp
50 :     val str=str0^("0")
51 :     val (v',code')=Iter(mapp,c,[],[],shape,n',str)
52 :     val(vA,A)=mkCons("",s::shape,[v']@rest)
53 :     in
54 :     (vA, code'@code@A)
55 :     end
56 :     | S(i, rest, code)= let
57 :     val mapp =insert(n, i) mapp
58 :     val str=str0^(iTos i)
59 :     val (v',code')=Iter(mapp,c,[],[],shape,n',str)
60 :     in
61 :     S(i-1,[v']@rest,code'@code)
62 :     end
63 :     val (vA,code')=S(b, [],[])
64 :     in
65 :     (vA,code'@ccode)
66 :     end
67 :     | Iter _=raise Fail"index' is larger than origIndex"
68 :     in
69 :     Iter(empty,index',[],[],origIndex,0,"")
70 :     end)
71 :     end (* local *)
72 :    
73 :     end

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