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

SCM Repository

[diderot] Annotation of /trunk/src/compiler/simplify/simple-pp.sml
ViewVC logotype

Annotation of /trunk/src/compiler/simplify/simple-pp.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3349 - (view) (download)

1 : jhr 172 (* simple-pp.sml
2 :     *
3 : jhr 3349 * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 : jhr 172 * All rights reserved.
7 :     *
8 :     * Pretty printing for the Simple-AST representation.
9 :     *)
10 :    
11 :     structure SimplePP : sig
12 :    
13 : jhr 2356 val output : TextIO.outstream * string * Simple.program -> unit
14 : jhr 172
15 : jhr 2597 val outputFunc : TextIO.outstream * string * Simple.func -> unit
16 :    
17 : jhr 172 end = struct
18 :    
19 :     structure PP = TextIOPP
20 : jhr 2491 structure Ty = SimpleTypes
21 : jhr 172 structure S = Simple
22 :    
23 :     val indent = PP.Abs 2
24 :    
25 :     fun ppList ppFn (left, sep, right) (ppStrm, list) = let
26 : jhr 2356 fun sp () = PP.space ppStrm 1
27 :     val string = PP.string ppStrm
28 :     fun pp [] = string right
29 :     | pp [x] = (ppFn(ppStrm, x); string right)
30 :     | pp (x::xs) = (ppFn(ppStrm, x); string sep; sp(); pp xs)
31 :     in
32 :     string left; pp list
33 :     end
34 : jhr 172
35 :     (* print type arguments; we use "#" to denote differentiation arguments, "$" to denote
36 :     * shape arguments, and "%" to denote dimension arguments.
37 :     *)
38 :     fun ppTyArgs (ppStrm, mvs) = let
39 : jhr 2356 val string = PP.string ppStrm
40 :     fun ppTyArg (_, mv) = (case mv
41 : jhr 2491 of Ty.TY ty => string(Ty.toString ty)
42 :     | Ty.DIFF k => string("#"^Int.toString k)
43 :     | Ty.SHAPE shp => string(concat[
44 :     "$[", String.concatWith "," (List.map Int.toString shp), "]"
45 :     ])
46 :     | Ty.DIM d => string("%"^Int.toString d)
47 : jhr 2356 (* end case *))
48 :     in
49 :     ppList ppTyArg ("<", ";", ">") (ppStrm, mvs)
50 :     end
51 : jhr 172
52 : jhr 2491 fun ppVar (ppStrm, x) = PP.string ppStrm (SimpleVar.uniqueNameOf x)
53 : jhr 172
54 :     fun ppVarDecl ppStrm = let
55 : jhr 2356 fun sp () = PP.space ppStrm 1
56 :     val string = PP.string ppStrm
57 :     in
58 :     fn x => (
59 :     PP.openHBox ppStrm;
60 : jhr 2491 case SimpleVar.kindOf x
61 : jhr 2356 of S.InputVar => (string "input"; sp())
62 :     | S.StrandOutputVar => (string "output"; sp())
63 :     | _ => ()
64 :     (* end case *);
65 : jhr 2491 string(Ty.toString(SimpleVar.typeOf x)); sp(); string(SimpleVar.uniqueNameOf x); string ";";
66 : jhr 2356 PP.closeBox ppStrm)
67 :     end
68 : jhr 172
69 :     fun ppExp (ppStrm, e) = let
70 : jhr 2356 fun sp () = PP.space ppStrm 1
71 :     val string = PP.string ppStrm
72 :     fun var x = ppVar (ppStrm, x)
73 :     fun ppIndex (ppStrm, NONE) = PP.string ppStrm ":"
74 :     | ppIndex (ppStrm, SOME i) = var i
75 :     fun pp e = (case e
76 :     of S.E_Var x => var x
77 :     | S.E_Lit lit => string (Literal.toString lit)
78 :     | S.E_Tuple es => ppArgs (ppStrm, es)
79 : jhr 2491 | S.E_Apply(f, args, _) => (var f; sp(); ppArgs (ppStrm, args))
80 :     | S.E_Prim(f, [], args, _) => (string(Var.nameOf f); sp(); ppArgs (ppStrm, args))
81 :     | S.E_Prim(f, mvs, args, _) => (
82 :     string(Var.nameOf f); ppTyArgs (ppStrm, mvs); sp(); ppArgs (ppStrm, args))
83 : jhr 2356 | S.E_Cons es => (
84 :     ppList ppVar ("[", ",", "]") (ppStrm, es))
85 : jhr 2636 | S.E_Seq es => (
86 :     ppList ppVar ("{", ",", "}") (ppStrm, es))
87 : jhr 2356 | S.E_Slice(x, indices, _) => (
88 :     var x;
89 :     ppList ppIndex ("[", ",", "]") (ppStrm, indices))
90 :     | S.E_Coerce{srcTy, dstTy, x} => (
91 : jhr 2491 string "("; string(Ty.toString dstTy); string ")"; var x)
92 : jhr 2636 | S.E_LoadImage(ty, nrrd, _) => (
93 :     string "loadImage<"; string(Ty.toString ty); string ">(\"";
94 :     string(String.toString nrrd); string "\")")
95 : jhr 2356 (* end case *))
96 :     in
97 :     pp e
98 :     end
99 : jhr 172
100 :     and ppArgs (ppStrm, args) = ppList ppVar ("(", ",", ")") (ppStrm, args)
101 :    
102 : jhr 1116 fun ppBlock (ppStrm, [], S.Block[]) = PP.string ppStrm "{ }"
103 :     | ppBlock (ppStrm, vars, S.Block stms) = let
104 : jhr 2356 fun sp () = PP.space ppStrm 1
105 :     fun nl () = PP.newline ppStrm
106 :     val string = PP.string ppStrm
107 :     fun var x = ppVar (ppStrm, x)
108 :     fun ppStmt stmt = (
109 :     nl();
110 :     case stmt
111 :     of S.S_Var x => (
112 :     PP.openHBox ppStrm;
113 : jhr 2491 string(Ty.toString(SimpleVar.typeOf x)); sp(); var x; string ";";
114 : jhr 2356 PP.closeBox ppStrm)
115 :     | S.S_Assign(x, e) => (
116 :     PP.openHBox ppStrm;
117 :     var x; sp(); string "="; sp(); ppExp(ppStrm, e); string ";";
118 :     PP.closeBox ppStrm)
119 :     | S.S_IfThenElse(x, S.Block[s1], S.Block[]) => (
120 :     PP.openVBox ppStrm indent;
121 :     PP.openHBox ppStrm;
122 :     string "if"; sp(); ppVar(ppStrm, x);
123 :     PP.closeBox ppStrm;
124 :     ppStmt s1;
125 :     PP.closeBox ppStrm)
126 :     | S.S_IfThenElse(x, blk, S.Block[]) => (
127 :     PP.openHBox ppStrm;
128 :     string "if"; sp(); ppVar(ppStrm, x);
129 :     sp(); ppBlock (ppStrm, [], blk);
130 :     PP.closeBox ppStrm)
131 :     | S.S_IfThenElse(x, S.Block[s1], S.Block[s2]) => (
132 :     PP.openVBox ppStrm indent;
133 :     PP.openHBox ppStrm;
134 :     string "if"; sp(); ppVar(ppStrm, x);
135 :     PP.closeBox ppStrm;
136 :     ppStmt s1;
137 :     PP.closeBox ppStrm;
138 :     nl();
139 :     PP.openVBox ppStrm indent;
140 :     string "else";
141 :     ppStmt s2;
142 :     PP.closeBox ppStrm)
143 :     | S.S_IfThenElse(x, blk1, blk2) => (
144 :     PP.openHBox ppStrm;
145 :     string "if"; sp(); ppVar(ppStrm, x);
146 :     sp(); ppBlock (ppStrm, [], blk1);
147 :     PP.closeBox ppStrm;
148 :     PP.openHBox ppStrm;
149 :     sp(); string "else"; sp(); ppBlock (ppStrm, [], blk2);
150 :     PP.closeBox ppStrm)
151 :     | S.S_New(strand, args) => (
152 :     PP.openHBox ppStrm;
153 :     string "new"; sp(); string(Atom.toString strand); sp();
154 :     ppArgs (ppStrm, args); string ";";
155 :     PP.closeBox ppStrm)
156 :     | S.S_Die => string "die;"
157 :     | S.S_Stabilize => string "stabilize;"
158 :     | S.S_Return x => (
159 :     PP.openHBox ppStrm;
160 :     string "return"; sp(); ppVar(ppStrm, x); string ";";
161 :     PP.closeBox ppStrm)
162 : jhr 1640 | S.S_Print args => (
163 :     PP.openHBox ppStrm;
164 :     string "print"; sp(); ppArgs (ppStrm, args); string ";";
165 : jhr 2356 PP.closeBox ppStrm)
166 :     (* end case *))
167 :     in
168 :     PP.openVBox ppStrm (PP.Abs 0);
169 :     string "{";
170 :     PP.openVBox ppStrm indent;
171 :     List.app (fn vdcl => (nl(); ppVarDecl ppStrm vdcl)) vars;
172 :     List.app ppStmt stms;
173 :     PP.closeBox ppStrm;
174 :     nl(); string "}";
175 :     PP.closeBox ppStrm
176 :     end
177 : jhr 172
178 : jhr 2356 fun ppParams (ppStrm, params) = let
179 :     fun sp () = PP.space ppStrm 1
180 :     val string = PP.string ppStrm
181 :     in
182 :     ppList
183 : jhr 2491 (fn (_, x) => (string(Ty.toString(SimpleVar.typeOf x)); sp(); ppVar (ppStrm, x)))
184 : jhr 2356 ("(", ",", ")")
185 :     (ppStrm, params)
186 :     end
187 :    
188 :     fun ppFunc ppStrm (S.Func{f, params, body}) = let
189 :     fun sp () = PP.space ppStrm 1
190 :     fun nl () = PP.newline ppStrm
191 :     val string = PP.string ppStrm
192 :     fun var x = ppVar (ppStrm, x)
193 :     in
194 :     PP.openHBox ppStrm;
195 :     string "function"; sp();
196 : jhr 2491 string(Ty.toString(Ty.rngOf(SimpleVar.typeOf f)));
197 : jhr 2356 sp(); var f; sp(); ppParams (ppStrm, params);
198 :     PP.closeBox ppStrm;
199 :     nl();
200 :     ppBlock (ppStrm, [], body);
201 :     nl()
202 :     end
203 :    
204 : jhr 1116 fun ppInit (ppStrm, S.Initially{isArray, rangeInit, iters, create}) = let
205 : jhr 2356 fun sp () = PP.space ppStrm 1
206 :     fun nl () = PP.newline ppStrm
207 :     val string = PP.string ppStrm
208 :     fun var x = ppVar (ppStrm, x)
209 :     val label = if isArray then "Array" else "Collection"
210 :     fun ppIters [] = let
211 :     val S.C_Create{argInit, name, args} = create
212 :     in
213 :     ppBlock (ppStrm, [], argInit); nl();
214 :     PP.openHBox ppStrm;
215 :     string "new"; sp(); string(Atom.toString name);
216 :     ppArgs (ppStrm, args); string ";";
217 :     PP.closeBox ppStrm
218 :     end
219 :     | ppIters ({param, lo, hi} :: iters) = (
220 :     PP.openVBox ppStrm indent;
221 :     PP.openHBox ppStrm;
222 :     string "for"; sp();
223 : jhr 2491 string(Ty.toString(SimpleVar.typeOf param)); sp(); var param;
224 : jhr 2356 sp(); string "="; sp(); var lo; sp(); string ".."; sp(); var hi;
225 :     PP.closeBox ppStrm;
226 :     nl();
227 :     ppIters iters;
228 :     PP.closeBox ppStrm)
229 :     in
230 :     PP.openVBox ppStrm indent;
231 :     string label; nl();
232 :     ppBlock (ppStrm, [], rangeInit); nl();
233 :     ppIters iters;
234 :     PP.closeBox ppStrm;
235 :     nl()
236 :     end
237 : jhr 1116
238 : jhr 511 fun ppStrand ppStrm (S.Strand{name, params, state, stateInit, methods}) = let
239 : jhr 2356 fun sp () = PP.space ppStrm 1
240 :     fun nl () = PP.newline ppStrm
241 :     val string = PP.string ppStrm
242 :     fun var x = ppVar (ppStrm, x)
243 :     fun ppMethod (S.Method(name, body)) = (
244 :     nl(); string(StrandUtil.nameToString name); nl(); ppBlock (ppStrm, [], body))
245 :     in
246 :     PP.openHBox ppStrm;
247 :     string "strand"; sp(); string(Atom.toString name); sp();
248 :     ppParams (ppStrm, params);
249 :     PP.closeBox ppStrm;
250 :     nl();
251 :     PP.openVBox ppStrm indent;
252 :     string "{";
253 :     ppBlock (ppStrm, state, stateInit);
254 :     List.app ppMethod methods;
255 :     PP.closeBox ppStrm;
256 :     nl();
257 :     string "}"; nl()
258 :     end
259 : jhr 172
260 : jhr 2636 fun ppInput ppStrm = let
261 :     fun sp () = PP.space ppStrm 1
262 :     fun nl () = PP.newline ppStrm
263 :     val string = PP.string ppStrm
264 :     fun var x = ppVar (ppStrm, x)
265 :     fun pp (x, Inputs.INP{name, desc, init, ...}) = (
266 :     PP.openHBox ppStrm;
267 :     string "input"; sp();
268 :     string(Ty.toString(SimpleVar.typeOf x)); sp();
269 :     ppVar (ppStrm, x); string ": ";
270 :     string name;
271 :     case desc
272 :     of SOME desc => string(concat["(\"", desc, "\")"])
273 :     | NONE => ()
274 :     (* end case *);
275 :     case init
276 :     of SOME init => (
277 :     sp(); string "="; sp();
278 :     string(Inputs.initToString init); string ";")
279 :     | NONE => string ";"
280 :     (* end case *);
281 :     nl();
282 :     PP.closeBox ppStrm)
283 :     in
284 :     pp
285 :     end
286 :    
287 :     fun output (outS, msg, prog) = let
288 :     val S.Program{props, inputs, globals, globalInit, funcs, strands, init} = prog
289 : jhr 2356 val ppStrm = PP.openOut {dst = outS, wid = 120}
290 :     fun nl () = PP.newline ppStrm
291 :     in
292 :     PP.openVBox ppStrm (PP.Abs 0);
293 :     PP.string ppStrm (concat[
294 :     "/* Simplified Program (after ", msg, ") start */"
295 :     ]); nl();
296 : jhr 2636 PP.openHBox ppStrm;
297 :     PP.string ppStrm "properties:";
298 :     PP.space ppStrm 1;
299 :     PP.string ppStrm (StrandUtil.propsToString props);
300 :     PP.newline ppStrm;
301 :     PP.closeBox ppStrm;
302 :     List.app (ppInput ppStrm) inputs;
303 : jhr 2356 List.app (ppFunc ppStrm) funcs;
304 :     ppBlock (ppStrm, globals, globalInit);
305 :     nl();
306 :     ppInit (ppStrm, init);
307 :     List.app (ppStrand ppStrm) strands;
308 :     PP.string ppStrm "/* Program end */"; PP.newline ppStrm;
309 :     PP.closeBox ppStrm;
310 :     PP.closeStream ppStrm
311 :     end
312 : jhr 172
313 : jhr 2597 fun outputFunc (outS, msg, func) = let
314 :     val ppStrm = PP.openOut {dst = outS, wid = 120}
315 : jhr 2636 in
316 : jhr 2597 PP.openVBox ppStrm (PP.Abs 0);
317 :     PP.string ppStrm (concat[
318 :     "/* ", msg, " */"
319 :     ]); PP.newline ppStrm;
320 : jhr 2636 ppFunc ppStrm func;
321 : jhr 2597 PP.closeBox ppStrm;
322 :     PP.closeStream ppStrm
323 : jhr 2636 end
324 : jhr 2597
325 : jhr 172 end

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