Source file Kirc_Ast.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
type kernel
and kvect = IntVect of int | Floatvect of int
type intrinsics = string * string
type elttype = EInt32 | EInt64 | EFloat32 | EFloat64
type memspace = LocalSpace | Global | Shared
type k_ext =
| Kern of k_ext * k_ext
| Block of k_ext
| Params of k_ext
| Plus of k_ext * k_ext
| Plusf of k_ext * k_ext
| Min of k_ext * k_ext
| Minf of k_ext * k_ext
| Mul of k_ext * k_ext
| Mulf of k_ext * k_ext
| Div of k_ext * k_ext
| Divf of k_ext * k_ext
| Mod of k_ext * k_ext
| Id of string
| IdName of string
| GlobalFun of k_ext * string * string
| IntVar of int * string
| FloatVar of int * string
| UnitVar of int * string
| CastDoubleVar of int * string
| DoubleVar of int * string
| BoolVar of int * string
| Arr of string * k_ext * elttype * memspace
| VecVar of k_ext * int * string
| Concat of k_ext * k_ext
| Constr of string * string * k_ext list
| Record of string * k_ext list
| RecGet of k_ext * string
| RecSet of k_ext * k_ext
| Empty
| Seq of k_ext * k_ext
| Return of k_ext
| Set of k_ext * k_ext
| Decl of k_ext
| SetV of k_ext * k_ext
| SetLocalVar of k_ext * k_ext * k_ext
| Intrinsics of intrinsics
| IntId of string * int
| Int of int
| Float of float
| Double of float
| Custom of string * int * string
| CustomVar of string * string * string
| IntVecAcc of k_ext * k_ext
| Local of k_ext * k_ext
| Acc of k_ext * k_ext
| Ife of k_ext * k_ext * k_ext
| If of k_ext * k_ext
| Match of string * k_ext * case array
| Or of k_ext * k_ext
| And of k_ext * k_ext
| Not of k_ext
| EqCustom of string * k_ext * k_ext
| EqBool of k_ext * k_ext
| LtBool of k_ext * k_ext
| GtBool of k_ext * k_ext
| LtEBool of k_ext * k_ext
| GtEBool of k_ext * k_ext
| DoLoop of k_ext * k_ext * k_ext * k_ext
| While of k_ext * k_ext
| App of k_ext * k_ext array
| GInt of (unit -> int32)
| GFloat of (unit -> float)
| GFloat64 of (unit -> float)
| Native of (Spoc.Devices.device -> string)
| Pragma of string list * k_ext
| Map of (k_ext * k_ext * k_ext)
| Unit
and case = int * (string * string * int * string) option * k_ext
type kfun = KernFun of k_ext * k_ext
let string_of_ast a =
let open Printf in
let rec soa i s =
if i = 0 then sprintf "%s\n" s else soa (i - 1) (sprintf " %s" s)
in
let rec aux i = function
| Kern (a, b) ->
sprintf "%s%s%s" (soa i "Kern") (aux (i + 1) a) (aux (i + 1) b)
| Block b -> sprintf "%s%s" (soa i "Kern") (aux (i + 1) b)
| Params p -> sprintf "%s%s" (soa i "Params") (aux (i + 1) p)
| Plus (a, b) ->
sprintf "%s%s%s" (soa i "Plus") (aux (i + 1) a) (aux (i + 1) b)
| Plusf (a, b) ->
sprintf "%s%s%s" (soa i "Plusf") (aux (i + 1) a) (aux (i + 1) b)
| Min (a, b) ->
sprintf "%s%s%s" (soa i "Min") (aux (i + 1) a) (aux (i + 1) b)
| Minf (a, b) ->
sprintf "%s%s%s" (soa i "Minf") (aux (i + 1) a) (aux (i + 1) b)
| Mul (a, b) ->
sprintf "%s%s%s" (soa i "Mul") (aux (i + 1) a) (aux (i + 1) b)
| Mulf (a, b) ->
sprintf "%s%s%s" (soa i "Mulf") (aux (i + 1) a) (aux (i + 1) b)
| Div (a, b) ->
sprintf "%s%s%s" (soa i "Div") (aux (i + 1) a) (aux (i + 1) b)
| Divf (a, b) ->
sprintf "%s%s%s" (soa i "Divf") (aux (i + 1) a) (aux (i + 1) b)
| Mod (a, b) ->
sprintf "%s%s%s" (soa i "Mod") (aux (i + 1) a) (aux (i + 1) b)
| Id s -> soa i ("Id " ^ s)
| IdName s -> soa i ("IdName " ^ s)
| IntVar (ii, s) -> soa i ("IntVar " ^ string_of_int ii ^ " -> " ^ s)
| FloatVar (ii, s) -> soa i ("FloatVar " ^ string_of_int ii ^ " -> " ^ s)
| CastDoubleVar (ii, s) ->
soa i ("CastDoubleVar " ^ string_of_int ii ^ " ->" ^ s)
| DoubleVar (ii, s) -> soa i ("DoubleVar " ^ string_of_int ii ^ " ->" ^ s)
| BoolVar (ii, s) -> soa i ("BoolVar " ^ string_of_int ii ^ " ->" ^ s)
| UnitVar (ii, s) -> soa i ("UnitVar " ^ string_of_int ii ^ " ->" ^ s)
| VecVar (_t, ii, s) -> soa i ("VecVar " ^ string_of_int ii ^ " ->" ^ s)
| Concat (a, b) ->
sprintf "%s%s%s" (soa i "Concat") (aux (i + 1) a) (aux (i + 1) b)
| Empty -> soa i "Empty"
| Seq (a, b) ->
sprintf "%s%s%s" (soa i "Seq") (aux (i + 1) a) (aux (i + 1) b)
| Return a -> sprintf "%s%s" (soa i "Return") (aux (i + 1) a)
| Set (a, b) ->
sprintf "%s%s%s" (soa i "Set") (aux (i + 1) a) (aux (i + 1) b)
| Decl a -> sprintf "%s%s" (soa i "Decl") (aux (i + 1) a)
| Acc (a, b) ->
sprintf "%s%s%s" (soa i "Acc") (aux (i + 1) a) (aux (i + 1) b)
| SetV (a, b) ->
sprintf "%s%s%s" (soa i "SetV") (aux (i + 1) a) (aux (i + 1) b)
| SetLocalVar (a, b, c) ->
sprintf "%s%s%s%s" (soa i "SetLocalVar")
(aux (i + 1) a)
(aux (i + 1) b)
(aux (i + 1) c)
| Intrinsics _ -> soa i "Intrinsics"
| IntId (s, ii) -> soa i ("IntId " ^ s ^ " " ^ string_of_int ii)
| Int ii -> soa i ("Int " ^ string_of_int ii)
| Float f | Double f -> soa i ("Float " ^ string_of_float f)
| IntVecAcc (a, b) ->
sprintf "%s%s%s" (soa i "IntVecAcc") (aux (i + 1) a) (aux (i + 1) b)
| Local (a, b) ->
sprintf "%s%s%s" (soa i "Local") (aux (i + 1) a) (aux (i + 1) b)
| Ife (a, b, c) ->
sprintf "%s%s%s%s" (soa i "Ife")
(aux (i + 1) a)
(aux (i + 1) b)
(aux (i + 1) c)
| If (a, b) ->
sprintf "%s%s%s" (soa i "If") (aux (i + 1) a) (aux (i + 1) b)
| EqBool (a, b) ->
sprintf "%s%s%s" (soa i "EqBool") (aux (i + 1) a) (aux (i + 1) b)
| EqCustom (_n, a, b) ->
sprintf "%s%s%s" (soa i "EqSum") (aux (i + 1) a) (aux (i + 1) b)
| Or (a, b) ->
sprintf "%s%s%s" (soa i "Or") (aux (i + 1) a) (aux (i + 1) b)
| And (a, b) ->
sprintf "%s%s%s" (soa i "And") (aux (i + 1) a) (aux (i + 1) b)
| Not a -> sprintf "%s%s" (soa i "Or") (aux (i + 1) a)
| LtBool (a, b) ->
sprintf "%s%s%s" (soa i "LtBool") (aux (i + 1) a) (aux (i + 1) b)
| GtBool (a, b) ->
sprintf "%s%s%s" (soa i "GtBool") (aux (i + 1) a) (aux (i + 1) b)
| LtEBool (a, b) ->
sprintf "%s%s%s" (soa i "LtEBool") (aux (i + 1) a) (aux (i + 1) b)
| GtEBool (a, b) ->
sprintf "%s%s%s" (soa i "GtEBool") (aux (i + 1) a) (aux (i + 1) b)
| DoLoop (a, b, c, d) ->
sprintf "%s%s%s%s%s" (soa i "DoLoop")
(aux (i + 1) a)
(aux (i + 1) b)
(aux (i + 1) c)
(aux (i + 1) d)
| While (a, b) ->
sprintf "%s%s%s" (soa i "While") (aux (i + 1) a) (aux (i + 1) b)
| Arr (s, _l, t, m) ->
let memspace =
match m with
| LocalSpace -> "__private"
| Shared -> "__local"
| Global -> "__global"
and elttype =
match t with
| EInt32 -> "int"
| EInt64 -> "long"
| EFloat32 -> "float"
| EFloat64 -> "double"
in
soa i ("Arr" ^ s ^ " " ^ memspace ^ " " ^ elttype)
| App (a, b) ->
sprintf "%s%s%s" (soa i "App")
(aux (i + 1) a)
(Array.fold_left (fun a b -> a ^ aux (i + 1) b) "" b)
| GInt _a -> soa i "GInt"
| GFloat _a -> soa i "GFloat"
| Unit -> soa i "Unit"
| GlobalFun (e, s, n) ->
sprintf "%s%s" (soa i ("Global Fun " ^ s ^ " " ^ n)) (aux (i + 1) e)
| Constr (s1, s2, l) ->
sprintf "%s%s"
(soa i ("Constr " ^ s1 ^ " " ^ s2))
(List.fold_left (fun a b -> a ^ aux (i + 1) b) "" l)
| Record (s, l) ->
sprintf "%s%s"
(soa i ("Record " ^ s))
(List.fold_left (fun a b -> a ^ aux (i + 1) b) "" l)
| RecGet (r, _s) -> sprintf "%s%s" (soa i "RecGet") (aux (i + 1) r)
| RecSet (r, v) ->
sprintf "%s%s%s" (soa i "RecGet") (aux (i + 1) r) (aux (i + 1) v)
| Custom (s, _, _ss) -> soa i ("Custom " ^ s)
| Native _f -> soa i "Native "
| Match (s, e1, l) ->
sprintf "%s%s%s"
(soa i ("Match " ^ s))
(aux (i + 1) e1)
(Array.fold_left (fun _a (_, _, b) -> aux (i + 1) b) "" l)
| CustomVar _ -> soa i "CustomVar"
| GFloat64 _ -> soa i "GFloat64"
| Pragma _ -> soa i "Pragma"
| Map _ -> soa i "Map"
in
aux 0 a
let print_ast a = Printf.printf "%s\n" (string_of_ast a)