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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2637, Wed May 28 05:20:45 2014 UTC revision 2646, Thu May 29 15:52:23 2014 UTC
# Line 5  Line 5 
5      structure Op = TreeOps      structure Op = TreeOps
6      structure Ty = TreeILTypes      structure Ty = TreeILTypes
7      structure IL=TreeIL      structure IL=TreeIL
8      structure setTyfn=TreeFunc      structure ILF=TreeFunc
9        structure TySet=ILF.TySet
10        structure OprSet=ILF.OprSet
11    
12    
13      structure  TySet=setTyfn.TySet      fun vecTy n= SOME(Ty.TensorTy[n])
     structure  OprSet=setTyfn.OprSet  
   
     val realTy=Ty.TensorTy[]  
     fun vecTy n=Ty.TensorTy[n]  
14      val testing=0      val testing=0
15    
16    
17    (* GetTypes TreeIL operator. *)    (* GetTypes TreeIL operator. *)
18      val default=(NONE,NONE)      val default=(NONE,[])
19      fun m(e1,e2)=(SOME e1, SOME e2)  
20      fun TypeofOp rator = (case rator      fun TypeofOp rator = (case rator
21          of  Op.IndexTensor(a,RTy,b,c)=> (SOME RTy,NONE)          of  Op.IndexTensor(a,RTy,b,c)=>(SOME RTy,[])
22          (* Op.IndexTensor(a,RTy,b,c)=> m(RTy,setTyfn.OP(Op.IndexTensor(a,RTy,b,c)))*)          (* Op.IndexTensor(a,RTy,b,c)=> (SOME RTy, [ILF.OP(Op.IndexTensor(a,RTy,b,c)))]*)
23          | Op.addVec d               => m(vecTy d,setTyfn.OP(Op.addVec d))          | Op.addVec d               => (vecTy d,[ILF.OP(Op.addVec d)])
24          | Op.subVec d               => m(vecTy d,setTyfn.OP(Op.subVec d))          | Op.subVec d               => (vecTy d,[ILF.OP(Op.subVec d)])
25          | Op.prodVec d              => m(vecTy d,setTyfn.OP(Op.prodVec d))          | Op.prodVec d              => (vecTy d,[ILF.OP(Op.prodVec d)])
26          | Op.prodScaV d             => m(vecTy d,setTyfn.OP(Op.prodScaV d))          | Op.prodScaV d             => (vecTy d,[ILF.REALTOVEC d,ILF.OP(Op.prodScaV d)])
27          | _ => default          | _ => default
28          (* end case *))          (* end case *))
29    
30    
31    
32      fun peel(IL.E_Lit( offset))=offset      fun peel(IL.E_Lit( offset))=offset
33      fun mkFnC(IL.E_LoadVec(fTy, oTy,_, offset))=setTyfn.LD(fTy,oTy,peel offset)      fun mkFnC(IL.E_LoadVec(fTy, oTy,_, offset))=[ILF.LD(fTy,oTy,peel offset)]
34        | mkFnC(IL.E_mkVec(_,oTy,_,_))= setTyfn.MKVEC oTy        | mkFnC(IL.E_mkVec(_,oTy,_,_))= [ILF.MKVEC oTy]
35        | mkFnC(IL.E_Cons (ty , exps))= setTyfn.CONS ty        | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]
36        | mkFnC(IL.E_FillVec(fTy, oTy,_, offset))= setTyfn.FVEC(fTy,oTy)        | mkFnC(IL.E_FillVec(fTy, oTy,_, offset))= [ILF.FVEC(fTy,oTy)]
37        | mkFnC(IL.E_SliceVec(fTy, oTy,_, offset))=setTyfn.SVEC(fTy)        | mkFnC(IL.E_SliceVec(fTy, oTy,_, offset))=[ILF.SVEC(fTy)]
38    
39    
40      (*Get types of Exp*)      (*Get types of Exp*)
41      fun typeOfExp(t,exp)=let      fun typeOfExp(t,exp)=let
42    
43          fun add((NONE,NONE),rest)=List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest          fun add((NONE,[]),rest)=List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest
44            | add((SOME typ,NONE),rest)= let            | add((SOME typ,[]),rest)= let
45              val (ty1,opr1)=t              val (ty1,opr1)=t
46              val t2=(TySet.add(ty1,typ),opr1)              val t2=(TySet.add(ty1,typ),opr1)
47              in              in
48                  List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest                  List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest
49              end              end
50          | add((SOME typ,SOME cfn),rest)= let          | add((SOME typ,cfn),rest)= let
51              val (ty1,opr1)=t              val (ty1,opr1)=t
52              val t2=(TySet.add(ty1,typ),OprSet.add(opr1, cfn))             (* 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    
57              in              in
58                  List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest                  List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest
# Line 61  Line 62 
62              | IL.E_Var(var)             => t              | IL.E_Var(var)             => t
63              | IL.E_Lit _                => t              | IL.E_Lit _                => t
64              | IL.E_Apply (_, exps)      => add(default,exps)              | IL.E_Apply (_, exps)      => add(default,exps)
65              | IL.E_Cons (ty , exps)     => add(m(ty,mkFnC exp),exps)              | IL.E_Cons (ty , exps)     => add((SOME ty,mkFnC exp),exps)
66              | IL.E_LoadVec(ty,_,exps,_)  => add(m(vecTy ty,mkFnC exp),[exps])              | IL.E_LoadVec(ty,_,exps,_) => add((vecTy ty,mkFnC exp),[exps])
67              | IL.E_mkVec(_,ty,_,exps)   => add(m(vecTy ty,mkFnC exp), exps)              | 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              | IL.E_Op(Op, exps)         => add(TypeofOp Op, exps)              | IL.E_Op(Op, exps)         => add(TypeofOp Op, exps)
             | IL.E_FillVec(ty,_,exps,_)  => add(m(vecTy ty,mkFnC exp),[exps])  
             | IL.E_SliceVec(ty,_,exps,_) => add(m(vecTy ty,mkFnC exp),[exps])  
   
   
71              (*end case*))              (*end case*))
72          end          end
73    
# Line 79  Line 78 
78          val typs=TySet.listItems(t1);          val typs=TySet.listItems(t1);
79          val ops=OprSet.listItems(t2);          val ops=OprSet.listItems(t2);
80          val str1= List.map Ty.toString typs          val str1= List.map Ty.toString typs
81          val str2=List.map setTyfn.toString ops          val str2=List.map ILF.toString ops
82          val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,          val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
83              "\n \t cFn: ",String.concatWith "\n\t" str2]              "\n \t cFn: ",String.concatWith "\n\t" str2]
84    
# Line 87  Line 86 
86    
87      fun prnTyFinal(typs,ops,prefix)=let      fun prnTyFinal(typs,ops,prefix)=let
88          val str1= List.map Ty.toString typs          val str1= List.map Ty.toString typs
89          val str2=List.map setTyfn.toString ops          val str2=List.map ILF.toString ops
90          val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,          val pnstr= String.concat["\n",prefix,"\n \t Types: ",String.concatWith "," str1,
91              "\n \t cFn: ",String.concatWith "\n\t" str2]              "\n \t cFn: ",String.concatWith "\n\t" str2]
92          in pnstr end          in pnstr end

Legend:
Removed from v.2637  
changed lines
  Added in v.2646

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