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 2665 - (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 :     | Op.prodScaV d => ([vecTy d],[ILF.CONS(Ty.TensorTy[d]),ILF.OP(Op.prodScaV d)])
28 :     | 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 2662 fun mkFnC(IL.E_LoadVec(fTy, oTy,_, offset))=[ILF.LD(fTy,oTy)]
37 :     | mkFnC(IL.E_mkVec(_,oTy,pieces,_))= [ILF.MKVEC(oTy,pieces)]
38 : cchiw 2646 | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]
39 : cchiw 2663 | mkFnC(IL.E_LoadVecAligned (fTy, oTy,_, offset))=[ILF.LDAligned (fTy,oTy)]
40 :     | mkFnC(IL.E_mkVecAligned (_,oTy,pieces,_))= [ILF.MKVECAligned (oTy,pieces)]
41 : cchiw 2628
42 :    
43 : cchiw 2637 (*Get types of Exp*)
44 :     fun typeOfExp(t,exp)=let
45 : cchiw 2663 val (ty1,opr1)=t
46 : cchiw 2665 fun add(([],[]),rest)= List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest
47 :     | add((typ,cfn),rest)= let
48 :    
49 : cchiw 2664 val opr2=List.foldr (fn(e1,e2) =>OprSet.add(e2,e1)) opr1 cfn
50 : cchiw 2665 val ty2=List.foldr (fn(e1,e2) =>TySet.add(e2,e1)) ty1 typ
51 : cchiw 2646 val t2=(ty2,opr2)
52 : cchiw 2637
53 :     in
54 :     List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest
55 :     end
56 :     in (case exp
57 :     of (IL.E_State(state_var))=>t
58 :     | IL.E_Var(var) => t
59 :     | IL.E_Lit _ => t
60 :     | IL.E_Apply (_, exps) => add(default,exps)
61 : cchiw 2665 | IL.E_Cons (ty , exps) => add(([ty],mkFnC exp),exps)
62 :     | IL.E_LoadVec(ty,_,exps,_) => add(([vecTy ty],mkFnC exp),[exps])
63 :     | IL.E_mkVec(_,ty,_,exps) => add(([vecTy ty,Ty.unionTy ty],mkFnC exp), exps)
64 : cchiw 2663
65 : cchiw 2637 | IL.E_Op(Op, exps) => add(TypeofOp Op, exps)
66 :     (*end case*))
67 :     end
68 : cchiw 2628
69 :    
70 : cchiw 2637 (*print Types*)
71 :     fun prnTy((t1,t2),prefix)=let
72 :    
73 :     val typs=TySet.listItems(t1);
74 :     val ops=OprSet.listItems(t2);
75 :     val str1= List.map Ty.toString typs
76 : cchiw 2646 val str2=List.map ILF.toString ops
77 : cchiw 2637 val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
78 :     "\n \t cFn: ",String.concatWith "\n\t" str2]
79 :    
80 :     in pnstr end
81 : cchiw 2628
82 : cchiw 2637 fun prnTyFinal(typs,ops,prefix)=let
83 :     val str1= List.map Ty.toString typs
84 : cchiw 2646 val str2=List.map ILF.toString ops
85 : cchiw 2637 val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
86 :     "\n \t cFn: ",String.concatWith "\n\t" str2]
87 :     in pnstr end
88 : cchiw 2628
89 :    
90 :    
91 : cchiw 2637 fun getTypesFiltered(t,IL.S_Assign (_,exp))= let
92 :     val t2=typeOfExp(t,exp)
93 :     val _=(case testing
94 :     of 1=> (print(String.concat["\n ---",IL.toString exp,prnTy(t2,"Current")]);1)
95 :     | _=>1
96 :     (*end case*))
97 : cchiw 2628
98 : cchiw 2637 in t2
99 :     end
100 :     | getTypesFiltered(t, _)= t
101 : cchiw 2628
102 :    
103 :    
104 :     end

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