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 2671 - (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 2646 structure ILF=TreeFunc
9 :     structure TySet=ILF.TySet
10 :     structure OprSet=ILF.OprSet
11 : cchiw 2628
12 :    
13 : cchiw 2665 fun vecTy n= Ty.TensorTy[n]
14 : cchiw 2637 val testing=0
15 :    
16 : cchiw 2628
17 :     (* GetTypes TreeIL operator. *)
18 : cchiw 2665 val default=([],[])
19 :    
20 :     (*rator-> (types, cfns )*)
21 : cchiw 2628 fun TypeofOp rator = (case rator
22 : cchiw 2665 of Op.IndexTensor(a,RTy,b,c)=>([RTy],[])
23 :     (* Op.IndexTensor(a,RTy,b,c)=> ([RTy], [ILF.OP(Op.IndexTensor(a,RTy,b,c)))]*)
24 :     | Op.addVec d => ([vecTy d],[ILF.OP(Op.addVec d)])
25 :     | Op.subVec d => ([vecTy d],[ILF.OP(Op.subVec d)])
26 :     | Op.prodVec d => ([vecTy d],[ILF.OP(Op.prodVec d)])
27 : cchiw 2668 | Op.prodScaV d => ([vecTy d],[ILF.CONSV d,ILF.OP(Op.prodScaV d)]) (*need different cons here*)
28 : cchiw 2665 | Op.sumVec d => ([Ty.unionTy d], [ILF.OP(Op.sumVec d)])
29 : cchiw 2637 | _ => default
30 :     (* end case *))
31 : cchiw 2628
32 :    
33 :    
34 : cchiw 2663 (*fun peel(IL.E_Lit( offset))=offset*)
35 :    
36 : cchiw 2668 fun mkFnC(IL.E_LoadVec(A,fTy, oTy,_, offset))=[ILF.LD(A,fTy,oTy)]
37 :     | mkFnC(IL.E_mkVec(A,rTy,oTy,_,_,_))= [ILF.MKVEC(A,rTy,oTy)]
38 : cchiw 2671 | mkFnC(IL.E_mkVec2(A,rTy,oTy,_,Ty.vectorLength pieces,_))=
39 :     List.map (fn p => ILF.MKVEC(A,p,oTy)) pieces
40 : cchiw 2646 | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]
41 : cchiw 2668 | mkFnC e= []
42 : cchiw 2628
43 :    
44 : cchiw 2668
45 : cchiw 2637 (*Get types of Exp*)
46 :     fun typeOfExp(t,exp)=let
47 : cchiw 2663 val (ty1,opr1)=t
48 : cchiw 2665 fun add(([],[]),rest)= List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest
49 :     | add((typ,cfn),rest)= let
50 :    
51 : cchiw 2664 val opr2=List.foldr (fn(e1,e2) =>OprSet.add(e2,e1)) opr1 cfn
52 : cchiw 2665 val ty2=List.foldr (fn(e1,e2) =>TySet.add(e2,e1)) ty1 typ
53 : cchiw 2646 val t2=(ty2,opr2)
54 : cchiw 2637
55 :     in
56 :     List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest
57 :     end
58 :     in (case exp
59 :     of (IL.E_State(state_var))=>t
60 :     | IL.E_Var(var) => t
61 :     | IL.E_Lit _ => t
62 :     | IL.E_Apply (_, exps) => add(default,exps)
63 : cchiw 2665 | IL.E_Cons (ty , exps) => add(([ty],mkFnC exp),exps)
64 : cchiw 2668 | IL.E_LoadVec(_,ty,_,exps,_) => add(([vecTy ty],mkFnC exp),[exps])
65 : cchiw 2671 | IL.E_mkVec(_,_,ty,_,_,exps) => add(([vecTy ty,Ty.unionTy ty],mkFnC exp), [exps])
66 :     | IL.E_mkVec2(_,_,ty,_,_,exps) => add(([vecTy ty,Ty.unionTy ty],mkFnC exp), exps)
67 : cchiw 2637 | IL.E_Op(Op, exps) => add(TypeofOp Op, exps)
68 :     (*end case*))
69 :     end
70 : cchiw 2628
71 :    
72 : cchiw 2637 (*print Types*)
73 :     fun prnTy((t1,t2),prefix)=let
74 :    
75 :     val typs=TySet.listItems(t1);
76 :     val ops=OprSet.listItems(t2);
77 :     val str1= List.map Ty.toString typs
78 : cchiw 2646 val str2=List.map ILF.toString ops
79 : cchiw 2637 val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
80 :     "\n \t cFn: ",String.concatWith "\n\t" str2]
81 :    
82 :     in pnstr end
83 : cchiw 2628
84 : cchiw 2637 fun prnTyFinal(typs,ops,prefix)=let
85 :     val str1= List.map Ty.toString typs
86 : cchiw 2646 val str2=List.map ILF.toString ops
87 : cchiw 2637 val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
88 :     "\n \t cFn: ",String.concatWith "\n\t" str2]
89 :     in pnstr end
90 : cchiw 2628
91 :    
92 :    
93 : cchiw 2637 fun getTypesFiltered(t,IL.S_Assign (_,exp))= let
94 :     val t2=typeOfExp(t,exp)
95 :     val _=(case testing
96 :     of 1=> (print(String.concat["\n ---",IL.toString exp,prnTy(t2,"Current")]);1)
97 :     | _=>1
98 :     (*end case*))
99 : cchiw 2628
100 : cchiw 2637 in t2
101 :     end
102 : cchiw 2666
103 :    
104 : cchiw 2637 | getTypesFiltered(t, _)= t
105 : cchiw 2628
106 :    
107 :    
108 :     end

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