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

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/tree-il/getTypes.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/tree-il/getTypes.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2631 - (view) (download)

1 : cchiw 2628 (* Get Types of Expressions *)
2 :    
3 :     structure getTypes= struct
4 :    
5 :     structure Op = TreeOps
6 :     structure Ty = TreeILTypes
7 :     structure IL=TreeIL
8 : cchiw 2631 structure TS=tString
9 : cchiw 2628
10 :    
11 :     (* utility function for synthesizing eigenvector/eigenvalue signature *)
12 :     fun eigenSig dim = let
13 :     val tplTy = Ty.TupleTy[
14 :     Ty.SeqTy(Ty.realTy, dim),
15 :     Ty.SeqTy(Ty.vecTy dim, dim)]
16 :     in
17 :     tplTy
18 :     end
19 :    
20 :    
21 :     val intTy=Ty.intTy
22 :     val realTy=Ty.TensorTy[]
23 :     val boolTy=Ty.BoolTy
24 :     fun vecTy n=Ty.TensorTy[n]
25 :    
26 :    
27 :     (* GetTypes TreeIL operator. *)
28 :     fun TypeofOp rator = (case rator
29 :     of Op.IAdd => intTy
30 :     | Op.ISub => intTy
31 :     | Op.IMul => intTy
32 :     | Op.IDiv => intTy
33 :     | Op.INeg =>intTy
34 : cchiw 2631 | Op.IndexTensor(_,resultTy,_,argTy)=> resultTy
35 : cchiw 2628 | Op.addSca => realTy
36 :     | Op.subSca => realTy
37 :     | Op.prodSca => realTy
38 :     | Op.divSca => realTy
39 :     | Op.addVec d=> vecTy d
40 :     | Op.subVec d => vecTy d
41 :     | Op.prodVec d => vecTy d
42 :     | Op.prodScaV d =>vecTy d
43 :     | Op.sumVec _=> realTy
44 :     | Op.Abs ty => ty
45 :     | Op.LT _ => boolTy
46 :     | Op.LTE _ => boolTy
47 :     | Op.EQ _ => boolTy
48 :     | Op.NEQ _ => boolTy
49 :     | Op.GT _ => boolTy
50 :     | Op.GTE _ => boolTy
51 :     | Op.Not => boolTy
52 :     | Op.Max => realTy
53 :     | Op.Min => realTy
54 :     | Op.Clamp ty => ty
55 :     | Op.Lerp ty => ty
56 :     | Op.Norm(ty as Ty.TensorTy _) =>realTy
57 :     | Op.Normalize d => vecTy d
58 :     | Op.EigenVecs2x2 => eigenSig 2
59 :     | Op.EigenVecs3x3 => eigenSig 3
60 :     | Op.EigenVals2x2 => Ty.SeqTy(Ty.realTy, 2)
61 :     | Op.EigenVals3x3 => Ty.SeqTy(Ty.realTy, 3)
62 :     | Op.Zero ty => ty
63 :     | Op.Select(ty as Ty.TupleTy tys, i) => List.nth(tys, i-1)
64 :     | Op.Index(ty as Ty.TensorTy[d], _) => realTy
65 :     | Op.Index(ty as Ty.SeqTy(elemTy, _), _) => elemTy
66 :     | Op.Subscript(ty as Ty.TensorTy dd) => realTy
67 :     | Op.Subscript(ty as Ty.SeqTy(elemTy, d)) => elemTy
68 :     | Op.Ceiling d => vecTy d
69 :     | Op.Floor d => vecTy d
70 :     | Op.Round d => vecTy d
71 :     | Op.Trunc d => vecTy d
72 :     | Op.IntToReal => realTy
73 :     | Op.RealToInt 1 => intTy
74 :     | Op.RealToInt d => Ty.SeqTy(Ty.IntTy, d)
75 :     | Op.Transform info => let
76 :     val dim = ImageInfo.dim info
77 :     in Ty.TensorTy[dim,dim]
78 :     end
79 :     | Op.Translate info => let
80 :     val dim = ImageInfo.dim info
81 :     in Ty.TensorTy[dim,dim]
82 :     end
83 :     | Op.Kernel _ => Ty.KernelTy
84 :     | Op.ImageAddress info => Ty.AddrTy info
85 :     | Op.LoadVoxels(_, n) => vecTy n
86 :     | Op.LoadImage info => Ty.ImageTy info
87 :     | Op.Inside _ => boolTy
88 :     | Op.Print _ => Ty.TupleTy[]
89 :     | Op.imgAddr _=> intTy
90 :     | Op.imgLoad (_,_,j) => vecTy j
91 :     | _ => raise Fail("getTypes: In tree-IL Does not have: invalid operator " ^ Op.toString rator)
92 :     (* end case *))
93 :    
94 :    
95 :     fun flat [] = []
96 :     | flat (l::ls) = l @ flat ls;
97 :    
98 :     fun typeOfExp exp=(case exp
99 :     of (IL.E_State(state_var))=>[]
100 :     | IL.E_Var(var)=> []
101 :     | IL.E_Lit _ =>[]
102 :     | IL.E_Op(Op, exp) => [TypeofOp Op]@ (flat(List.map typeOfExp exp))
103 :     | IL.E_Apply (_, exp)=> flat(List.map typeOfExp exp)
104 :     | IL.E_Cons (ty , exp)=> [ty]@(flat(List.map typeOfExp exp))
105 :     | IL.E_LoadVec(fullTy, _,_,exp)=>[vecTy fullTy]@(typeOfExp exp)
106 :     | IL.E_mkVec(_,ty,_,exp)=> [vecTy ty]@(flat(List.map typeOfExp exp))
107 :     (*end case*))
108 :    
109 :    
110 :     (*Filter Types, Just one of each *)
111 :     fun m([],rest)=rest
112 :     | m (e1::es, rest)=(case (List.find(fn x=> Ty.same(x,e1)) rest)
113 :     of NONE=> m (es, rest@[e1])
114 :     | _ => m (es, rest)
115 :     (*end case*))
116 :    
117 :    
118 :     fun getTypesFilteredPnt(IL.S_Assign (_,exp))= let
119 :    
120 :     val types=typeOfExp exp
121 :     val types2=m (types,[])
122 :     val str2= List.map Ty.toString types2
123 : cchiw 2631 val pnstr2= print(String.concat["\n ---",TS.toStringEx exp ,"\n \t Types: ",String.concatWith "," str2])
124 : cchiw 2628 in types2
125 :     end
126 :     | getTypesFilteredPnt _= []
127 :    
128 :    
129 :     fun getTypesFiltered(IL.S_Assign (_,exp))= let
130 :    
131 :     val types=typeOfExp exp
132 :     in m (types,[])
133 :     end
134 :     | getTypesFiltered _= []
135 :    
136 :    
137 :    
138 :    
139 :     fun gotFiltered []= (print(String.concat["\n \t No Types"]);1)
140 : cchiw 2631 |gotFiltered types= let
141 : cchiw 2628 val types2=m (types,[])
142 :     val str2= List.map Ty.toString types2
143 :     val pnstr2= print(String.concat["\n \t Final Types: ",String.concatWith "," str2,"\n\n "])
144 :     in 1
145 :     end
146 :    
147 :    
148 :    
149 :    
150 :    
151 :     end

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