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 2666 - (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 2666 | IL.E_LoadVecAligned(ty,_,exps,_) => add(([vecTy ty],mkFnC exp),[exps])
65 :     | IL.E_mkVecAligned(_,ty,_,exps) => add(([vecTy ty,Ty.unionTy ty],mkFnC exp), exps)
66 : cchiw 2637 | IL.E_Op(Op, exps) => add(TypeofOp Op, exps)
67 :     (*end case*))
68 :     end
69 : cchiw 2628
70 :    
71 : cchiw 2637 (*print Types*)
72 :     fun prnTy((t1,t2),prefix)=let
73 :    
74 :     val typs=TySet.listItems(t1);
75 :     val ops=OprSet.listItems(t2);
76 :     val str1= List.map Ty.toString typs
77 : cchiw 2646 val str2=List.map ILF.toString ops
78 : cchiw 2637 val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
79 :     "\n \t cFn: ",String.concatWith "\n\t" str2]
80 :    
81 :     in pnstr end
82 : cchiw 2628
83 : cchiw 2637 fun prnTyFinal(typs,ops,prefix)=let
84 :     val str1= List.map Ty.toString typs
85 : cchiw 2646 val str2=List.map ILF.toString ops
86 : cchiw 2637 val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
87 :     "\n \t cFn: ",String.concatWith "\n\t" str2]
88 :     in pnstr end
89 : cchiw 2628
90 :    
91 :    
92 : cchiw 2637 fun getTypesFiltered(t,IL.S_Assign (_,exp))= let
93 :     val t2=typeOfExp(t,exp)
94 :     val _=(case testing
95 :     of 1=> (print(String.concat["\n ---",IL.toString exp,prnTy(t2,"Current")]);1)
96 :     | _=>1
97 :     (*end case*))
98 : cchiw 2628
99 : cchiw 2637 in t2
100 :     end
101 : cchiw 2666 | getTypesFiltered(t,IL.S_Mk (_,exp))= let
102 :     val t2=typeOfExp(t,exp)
103 :     val _=(case testing
104 :     of 1=> (print(String.concat["\n ---",IL.toString exp,prnTy(t2,"Current")]);1)
105 :     | _=>1
106 :     (*end case*))
107 :    
108 :     in t2
109 :     end
110 :    
111 : cchiw 2637 | getTypesFiltered(t, _)= t
112 : cchiw 2628
113 :    
114 :    
115 :     end

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