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

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