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/tree-il.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/tree-il/tree-il.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2637 - (view) (download)

1 : jhr 1115 (* tree-il.sml
2 :     *
3 :     * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *
6 :     * This representation restores the block structure and nested expression syntax
7 :     * of the source language.
8 :     *)
9 :    
10 :     structure TreeIL =
11 :     struct
12 :    
13 : cchiw 2615 structure OpOld = LowOps(* TreeOps*)
14 :     structure Op = TreeOps
15 :     structure Ty = TreeILTypes
16 : cchiw 2637 structure setTyfn=TreeFunc
17 :     structure OprSet=setTyfn.OprSet
18 :     structure TySet=setTyfn.TySet
19 : jhr 1115
20 : cchiw 2637
21 : jhr 2632
22 : cchiw 2637
23 :    
24 :    
25 : jhr 1115 datatype program = Program of {
26 : jhr 2356 props : StrandUtil.program_prop list,
27 : cchiw 2637
28 :     types : Ty.ty list,
29 :     oprations : setTyfn.oprator list,
30 :    
31 : jhr 2356 globals : var list,
32 :     inputInit : block,
33 :     globalInit : block,
34 :     strands : strand list,
35 :     initially : {
36 :     isArray : bool,
37 :     iterPrefix : block,
38 :     iters : (var * exp * exp) list,
39 :     createPrefix : block,
40 :     strand : Atom.atom,
41 :     args : exp list
42 :     }
43 : jhr 1115 }
44 :    
45 :     and strand = Strand of {
46 : jhr 2356 name : Atom.atom,
47 :     params : var list,
48 :     state : state_var list,
49 :     stateInit : block,
50 :     methods : method list
51 : jhr 1115 }
52 :    
53 : jhr 1640 and state_var = SV of {
54 : jhr 2356 name : string, (* name (should be unique) *)
55 :     id : Stamp.stamp, (* unique ID *)
56 :     ty : Ty.ty, (* type *)
57 :     varying : bool, (* varies over the lifetime of the strand *)
58 :     output : bool (* is the output value of the strand *)
59 : jhr 1115 }
60 :    
61 :     and method = Method of {
62 : jhr 2356 name : StrandUtil.method_name,
63 :     body : block (* method body *)
64 : jhr 1115 }
65 :    
66 : cchiw 2637 and subblock = Pink of {
67 :     locals : var list,
68 :     types: TySet.set,
69 :     opr: OprSet.set,
70 :     body : stm list
71 :     }
72 : jhr 1115 and block = Block of {
73 : jhr 2356 locals : var list,
74 :     body : stm list
75 : cchiw 2637 }
76 : jhr 1115
77 :     and stm
78 :     = S_Comment of string list
79 : jhr 1640 | S_Assign of var list * exp
80 : jhr 1115 | S_IfThen of exp * block
81 :     | S_IfThenElse of exp * block * block
82 :     (* special Diderot forms *)
83 : jhr 2356 | S_LoadImage of var * int * exp (* load image data *)
84 : jhr 1301 | S_Input of var * string * string * exp option (* get input *)
85 : jhr 2356 | S_New of Atom.atom * exp list (* new strand creation *)
86 : jhr 1640 | S_Save of state_var list * exp (* save strand state *)
87 : jhr 1115 | S_Exit of exp list
88 :     (* return functions for methods *)
89 : jhr 1640 | S_Active
90 :     | S_Stabilize
91 : jhr 1115 | S_Die
92 :    
93 :     and exp
94 : jhr 1640 = E_State of state_var
95 :     | E_Var of var
96 : jhr 1115 | E_Lit of Literal.literal
97 : cchiw 2624 | E_Op of Op.rator * exp list
98 : jhr 1923 | E_Apply of MathFuns.name * exp list
99 : jhr 1115 | E_Cons of Ty.ty * exp list
100 : jhr 2632 | E_LoadVec of int * int * exp * exp (*Type:NativeVecTy newVec, originalVec, addr, offset *)
101 : cchiw 2637 | E_FillVec of int * int * exp * exp (*Type:NativeVecTy newVec, originalVec, addr, offset *)
102 :     | E_SliceVec of int * int * exp * exp (*Type:NativeVecTy newVec, originalVec, addr, offset *)
103 : cchiw 2628 | E_mkVec of int *int *Ty.ty* exp list (*vec length, originalVec,Type:vectorLength(list), list of ops*)
104 : cchiw 2637
105 : cchiw 2627
106 : jhr 1115 and var = V of {
107 : jhr 2356 name : string, (* name (should be unique) *)
108 :     id : Stamp.stamp, (* unique ID *)
109 :     kind : var_kind,
110 :     ty : Ty.ty (* type *)
111 : jhr 1115 }
112 :    
113 :     and var_kind
114 : jhr 2356 = VK_Global (* global variable *)
115 :     | VK_Local (* includes strand parameters *)
116 : jhr 1115
117 : cchiw 2637
118 :    
119 :    
120 : jhr 1115 structure Var : sig
121 :    
122 : jhr 2356 val new : string * var_kind * Ty.ty -> var
123 :     val kind : var -> var_kind
124 :     val name : var -> string
125 :     val toString : var -> string
126 :     val ty : var -> Ty.ty
127 : jhr 1115
128 : jhr 2356 structure Map : ORD_MAP where type Key.ord_key = var
129 : jhr 1115
130 :     end = struct
131 : jhr 2356 fun new (name, kind, ty) = V{
132 :     name = name,
133 :     id = Stamp.new(),
134 :     kind = kind,
135 :     ty = ty
136 :     }
137 :     fun kind (V{kind, ...}) = kind
138 :     fun name (V{name, ...}) = name
139 :     fun toString (V{name, id, ...}) = concat[name, "$", Stamp.toString id]
140 :     fun ty (V{ty, ...}) = ty
141 :     local
142 :     structure VarOrd =
143 :     struct
144 :     type ord_key = var
145 :     fun compare (V{id=a, ...}, V{id=b, ...}) = Stamp.compare(a, b)
146 :     end
147 :     in
148 :     structure Map = RedBlackMapFn (VarOrd)
149 :     end (* local *)
150 : jhr 1115 end
151 :    
152 : jhr 1640 structure StateVar : sig
153 :     val name : state_var -> string
154 :     val ty : state_var -> Ty.ty
155 :     val isOutput : state_var -> bool
156 :     val isVarying : state_var -> bool
157 :     val toString : state_var -> string
158 :     end = struct
159 : jhr 2356 fun name (SV{name, ...}) = name
160 :     fun ty (SV{ty, ...}) = ty
161 :     fun isOutput (SV{output, ...}) = output
162 :     fun isVarying (SV{varying, ...}) = varying
163 :     fun toString (SV{name, ...}) = "self." ^ name
164 : jhr 1640 end
165 : jhr 1131
166 :     fun kindToString k = (case k
167 : jhr 2356 of VK_Global => "Global"
168 :     | VK_Local => "Local"
169 :     (* end case *))
170 : jhr 1131
171 : jhr 1640 fun stateVarToString (SV{name, ...}) = "self." ^ name
172 :    
173 : cchiw 2637
174 :     fun q m=Int.toString(m)
175 :    
176 :     fun toString(E_LoadVec(tyNew, tyOrig, arg, offset)) = String.concat["LDVec<",q tyNew ,
177 :     ":",q tyOrig, ">", "(", toString arg, ",", toString offset, ")"]
178 :     | toString(E_mkVec(tyNew, tyOrig,pieces,args)) =let
179 :     val a=String.concatWith "," (List.map toString args)
180 :     in
181 :     String.concat["mkVec:",q tyNew,"|",q tyOrig,"[",
182 :     Ty.toString pieces ,"]\n\t",a]
183 :     end
184 :     | toString (E_Op(rator, args)) = String.concat[Op.toString rator,"(",
185 :     String.concatWith"," (List.map toString args),")"]
186 :     | toString (E_Cons(ty, args)) =String.concat ["Cons:", Ty.toString ty, "(",
187 :     String.concatWith"," (List.map toString args),")"]
188 :     | toString (E_State x) = "State"
189 :     | toString (E_Var x) = Var.name x
190 :     | toString (E_Lit lit) = Literal.toString lit
191 :     | toString(E_FillVec(tyNew, tyOrig, arg, offset))=String.concat["FillVec<",
192 :     q tyNew ,":",q tyOrig, ">", "(", toString arg, ",", toString offset, ")"]
193 :     | toString(E_SliceVec(tyNew, tyOrig, arg, offset)) = String.concat["SliceVec<",
194 :     q tyNew ,":",q tyOrig, ">", "(", toString arg, ",", toString offset, ")"]
195 :    
196 : jhr 1115 end

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