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

SCM Repository

[diderot] Annotation of /branches/vis12/src/compiler/simplify/simple.sml
ViewVC logotype

Annotation of /branches/vis12/src/compiler/simplify/simple.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3291 - (view) (download)

1 : jhr 171 (* simple.sml
2 :     *
3 : jhr 3291 * 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 171 * All rights reserved.
7 :     *
8 : jhr 511 * A simplified AST representation of a Diderot program. This representation has the property
9 :     * that the arguments to ifs, operators, etc. are variables and that the rhs of assignments
10 :     * consist of a single operation. It is not, however, a single-assignment representation.
11 : jhr 171 *)
12 :    
13 :     structure Simple =
14 :     struct
15 :    
16 : jhr 2481 (* types with the meta variables resolved *)
17 :     type ty = SimpleTypes.ty
18 :    
19 :     (* resolved meta-variable arguments to basis functions *)
20 :     datatype meta_arg = datatype SimpleTypes.meta_arg
21 :    
22 : jhr 171 datatype var_kind = datatype AST.var_kind
23 :    
24 : jhr 2481 datatype var = V of {
25 :     name : string, (* print name of variable *)
26 :     id : Stamp.stamp, (* unique ID *)
27 :     kind : var_kind, (* variable kind *)
28 : jhr 2747 ty : ty (* type *)
29 : jhr 2481 }
30 : jhr 171
31 : jhr 175 datatype program = Program of {
32 : jhr 2723 props : StrandUtil.program_prop list,
33 : jhr 2813 inputDefaults : block, (* initialization of input-defaults *)
34 : jhr 2805 inputs : (var * SimpleTypes.ty Inputs.input) list, (* input globals *)
35 :     globals : var list, (* non-input globals *)
36 : jhr 2255 globalInit : block,
37 :     funcs : func list,
38 :     strands : strand list,
39 :     init : init (* block evaluates any vars used in init *)
40 : jhr 171 }
41 :    
42 : jhr 2135 and func = Func of {
43 : jhr 2255 f : var,
44 :     params : var list,
45 :     body : block
46 : jhr 2135 }
47 :    
48 : jhr 1116 and init = Initially of {
49 : jhr 2255 isArray : bool,
50 :     rangeInit : block,
51 :     iters : {param : var, lo : var, hi : var} list,
52 :     create : create
53 : jhr 1116 }
54 :    
55 :     and create = C_Create of {
56 : jhr 2255 argInit : block,
57 :     name : Atom.atom,
58 :     args : var list
59 : jhr 1116 }
60 :    
61 : jhr 2141 (* do we use this?
62 : jhr 1116 and iter = I_Range of {
63 : jhr 2255 rangeInit : block,
64 :     param : var,
65 :     lo : var,
66 :     hi : var
67 : jhr 1116 }
68 : jhr 2141 *)
69 : jhr 1116
70 : jhr 511 and strand = Strand of {
71 : jhr 2255 name : Atom.atom,
72 :     params : var list,
73 :     state : var list,
74 :     stateInit : block,
75 :     methods : method list
76 : jhr 171 }
77 :    
78 : jhr 1640 and method = Method of StrandUtil.method_name * block
79 : jhr 171
80 : jhr 192 and block = Block of stmt list
81 :    
82 : jhr 171 and stmt
83 : jhr 2255 = S_Var of var (* introduce an uninitialized local variable. *)
84 :     (* These stmts are needed for the results of *)
85 :     (* conditional expressions *)
86 : jhr 1116 | S_Assign of var * exp
87 : jhr 192 | S_IfThenElse of var * block * block
88 : jhr 171 | S_New of Atom.atom * var list
89 : jhr 3191 | S_Continue
90 : jhr 171 | S_Die
91 :     | S_Stabilize
92 : jhr 2135 | S_Return of var
93 : jhr 1640 | S_Print of var list
94 : jhr 171
95 :     and exp
96 :     = E_Var of var
97 :     | E_Lit of Literal.literal
98 :     | E_Tuple of var list
99 : jhr 2723 | E_Apply of var * var list * ty (* user-defined function *)
100 :     | E_Prim of AST.var * meta_arg list * var list * ty (* Diderot builtin *)
101 : jhr 171 | E_Cons of var list
102 : jhr 2723 | E_Seq of var list * ty (* sequence (ty is result type) *)
103 : jhr 2722 | E_Slice of var * var option list * ty (* tensor slicing (ty is result type) *)
104 : jhr 2481 | E_Coerce of {srcTy : ty, dstTy : ty, x : var}
105 :     | E_LoadSeq of ty * string
106 :     | E_LoadImage of ty * string * ImageInfo.info
107 : jhr 171
108 : jhr 2481 fun typeOf (E_Var(V{ty, ...})) = ty
109 : jhr 171 | typeOf (E_Lit lit) = (case lit
110 : jhr 2481 of (Literal.Int _) => SimpleTypes.T_Int
111 :     | (Literal.Float _) => SimpleTypes.T_Tensor[]
112 :     | (Literal.String s) => SimpleTypes.T_String
113 :     | (Literal.Bool _) => SimpleTypes.T_Bool
114 : jhr 2255 (* end case *))
115 : jhr 171 | typeOf (E_Tuple _) = raise Fail "E_Tuple"
116 : jhr 2481 | typeOf (E_Apply(_, _, ty)) = ty
117 :     | typeOf (E_Prim(_, _, _, ty)) = ty
118 : jhr 2016 | typeOf (E_Cons[]) = raise Fail "impossible empty E_Cons"
119 : jhr 2481 | typeOf (E_Cons(V{ty, ...}::xs)) = let
120 : jhr 2255 val d = List.length xs + 1
121 :     in
122 : jhr 2481 case ty
123 :     of SimpleTypes.T_Tensor shape => SimpleTypes.T_Tensor(shape @ [d])
124 : jhr 2255 | _ => raise Fail(concat[
125 : jhr 2481 "element of tensor construction is ", SimpleTypes.toString ty,
126 : jhr 2723 ", expected tensor"
127 : jhr 2219 ])
128 : jhr 2255 (* end case *)
129 :     end
130 : jhr 2722 | typeOf (E_Seq(_, ty)) = ty
131 : jhr 399 | typeOf (E_Slice(_, _, ty)) = ty
132 : jhr 1992 | typeOf (E_Coerce{dstTy, ...}) = dstTy
133 : jhr 2026 | typeOf (E_LoadSeq(ty, _)) = ty
134 :     | typeOf (E_LoadImage(ty, _, _)) = ty
135 : jhr 171
136 :     end

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