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 2663 - (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 Op = TreeOps
14 :     structure Ty = TreeILTypes
15 : cchiw 2646 structure ILF=TreeFunc
16 :     structure OprSet=ILF.OprSet
17 :     structure TySet=ILF.TySet
18 : jhr 1115
19 : cchiw 2637
20 : jhr 2632
21 : cchiw 2637
22 :    
23 :    
24 : jhr 1115 datatype program = Program of {
25 : jhr 2356 props : StrandUtil.program_prop list,
26 : cchiw 2637
27 :     types : Ty.ty list,
28 : cchiw 2646 oprations : ILF.oprator list,
29 : cchiw 2637
30 : jhr 2356 globals : var list,
31 :     inputInit : block,
32 :     globalInit : block,
33 :     strands : strand list,
34 :     initially : {
35 :     isArray : bool,
36 :     iterPrefix : block,
37 :     iters : (var * exp * exp) list,
38 :     createPrefix : block,
39 :     strand : Atom.atom,
40 :     args : exp list
41 :     }
42 : jhr 1115 }
43 :    
44 :     and strand = Strand of {
45 : jhr 2356 name : Atom.atom,
46 :     params : var list,
47 :     state : state_var list,
48 :     stateInit : block,
49 :     methods : method list
50 : jhr 1115 }
51 :    
52 : jhr 1640 and state_var = SV of {
53 : jhr 2356 name : string, (* name (should be unique) *)
54 :     id : Stamp.stamp, (* unique ID *)
55 :     ty : Ty.ty, (* type *)
56 :     varying : bool, (* varies over the lifetime of the strand *)
57 :     output : bool (* is the output value of the strand *)
58 : jhr 1115 }
59 :    
60 :     and method = Method of {
61 : jhr 2356 name : StrandUtil.method_name,
62 :     body : block (* method body *)
63 : jhr 1115 }
64 :    
65 : cchiw 2637 and subblock = Pink of {
66 :     locals : var list,
67 :     types: TySet.set,
68 :     opr: OprSet.set,
69 :     body : stm list
70 :     }
71 : jhr 1115 and block = Block of {
72 : jhr 2356 locals : var list,
73 :     body : stm list
74 : cchiw 2637 }
75 : jhr 1115
76 :     and stm
77 :     = S_Comment of string list
78 : jhr 1640 | S_Assign of var list * exp
79 : jhr 1115 | S_IfThen of exp * block
80 :     | S_IfThenElse of exp * block * block
81 :     (* special Diderot forms *)
82 : jhr 2356 | S_LoadImage of var * int * exp (* load image data *)
83 : jhr 1301 | S_Input of var * string * string * exp option (* get input *)
84 : jhr 2356 | S_New of Atom.atom * exp list (* new strand creation *)
85 : jhr 1640 | S_Save of state_var list * exp (* save strand state *)
86 : jhr 1115 | S_Exit of exp list
87 :     (* return functions for methods *)
88 : jhr 1640 | S_Active
89 :     | S_Stabilize
90 : jhr 1115 | S_Die
91 :    
92 :     and exp
93 : jhr 1640 = E_State of state_var
94 :     | E_Var of var
95 : jhr 1115 | E_Lit of Literal.literal
96 : cchiw 2624 | E_Op of Op.rator * exp list
97 : jhr 1923 | E_Apply of MathFuns.name * exp list
98 : jhr 1115 | E_Cons of Ty.ty * exp list
99 : jhr 2632 | E_LoadVec of int * int * exp * exp (*Type:NativeVecTy newVec, originalVec, addr, offset *)
100 : cchiw 2663 | E_LoadVecAligned of int * int * exp * exp (*Type:NativeVecTy newVec, originalVec, addr, offset *)
101 : cchiw 2628 | E_mkVec of int *int *Ty.ty* exp list (*vec length, originalVec,Type:vectorLength(list), list of ops*)
102 : cchiw 2663 | E_mkVecAligned of int *int *Ty.ty* exp list (*vec length, originalVec,Type:vectorLength(list), list of ops*)
103 : cchiw 2646
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 : cchiw 2663 | toString(E_LoadVecAligned(tyNew, tyOrig, arg, offset)) = String.concat["LDVecAligned<",q tyNew ,
185 :     ":",q tyOrig, ">", "(", toString arg, ",", toString offset, ")"]
186 :     | toString(E_mkVecAligned(tyNew, tyOrig,pieces,args)) =let
187 :     val a=String.concatWith "," (List.map toString args)
188 :     in
189 :     String.concat["mkVecAligned:",q tyNew,"|",q tyOrig,"[",
190 :     Ty.toString pieces ,"]\n\t",a]
191 :     end
192 :    
193 : cchiw 2637 | toString (E_Op(rator, args)) = String.concat[Op.toString rator,"(",
194 :     String.concatWith"," (List.map toString args),")"]
195 :     | toString (E_Cons(ty, args)) =String.concat ["Cons:", Ty.toString ty, "(",
196 :     String.concatWith"," (List.map toString args),")"]
197 :     | toString (E_State x) = "State"
198 :     | toString (E_Var x) = Var.name x
199 :     | toString (E_Lit lit) = Literal.toString lit
200 : cchiw 2662 (* | toString(E_FillVec(tyNew, tyOrig, arg, offset))=String.concat["FillVec<",
201 : cchiw 2637 q tyNew ,":",q tyOrig, ">", "(", toString arg, ",", toString offset, ")"]
202 :     | toString(E_SliceVec(tyNew, tyOrig, arg, offset)) = String.concat["SliceVec<",
203 :     q tyNew ,":",q tyOrig, ">", "(", toString arg, ",", toString offset, ")"]
204 : cchiw 2662 *)
205 : jhr 1115 end

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