1#ifndef ISL_AST_H
2#define ISL_AST_H
3
4#include <isl/ctx.h>
5#include <isl/id.h>
6#include <isl/list.h>
7#include <isl/printer.h>
8
9#if defined(__cplusplus)
10extern "C" {
11#endif
12
13struct isl_ast_expr;
14typedef struct isl_ast_expr isl_ast_expr;
15
16struct isl_ast_node;
17typedef struct isl_ast_node isl_ast_node;
18
19enum isl_ast_op_type {
20	isl_ast_op_error = -1,
21	isl_ast_op_and,
22	isl_ast_op_and_then,
23	isl_ast_op_or,
24	isl_ast_op_or_else,
25	isl_ast_op_max,
26	isl_ast_op_min,
27	isl_ast_op_minus,
28	isl_ast_op_add,
29	isl_ast_op_sub,
30	isl_ast_op_mul,
31	isl_ast_op_div,
32	isl_ast_op_fdiv_q,	/* Round towards -infty */
33	isl_ast_op_pdiv_q,	/* Dividend is non-negative */
34	isl_ast_op_pdiv_r,	/* Dividend is non-negative */
35	isl_ast_op_cond,
36	isl_ast_op_select,
37	isl_ast_op_eq,
38	isl_ast_op_le,
39	isl_ast_op_lt,
40	isl_ast_op_ge,
41	isl_ast_op_gt,
42	isl_ast_op_call
43};
44
45enum isl_ast_expr_type {
46	isl_ast_expr_error = -1,
47	isl_ast_expr_op,
48	isl_ast_expr_id,
49	isl_ast_expr_int
50};
51
52enum isl_ast_node_type {
53	isl_ast_node_error = -1,
54	isl_ast_node_for = 1,
55	isl_ast_node_if,
56	isl_ast_node_block,
57	isl_ast_node_user
58};
59
60struct isl_ast_print_options;
61typedef struct isl_ast_print_options isl_ast_print_options;
62
63ISL_DECLARE_LIST(ast_expr)
64ISL_DECLARE_LIST(ast_node)
65
66int isl_options_set_ast_iterator_type(isl_ctx *ctx, const char *val);
67const char *isl_options_get_ast_iterator_type(isl_ctx *ctx);
68
69__isl_give isl_ast_expr *isl_ast_expr_from_id(__isl_take isl_id *id);
70__isl_give isl_ast_expr *isl_ast_expr_neg(__isl_take isl_ast_expr *expr);
71__isl_give isl_ast_expr *isl_ast_expr_add(__isl_take isl_ast_expr *expr1,
72	__isl_take isl_ast_expr *expr2);
73__isl_give isl_ast_expr *isl_ast_expr_sub(__isl_take isl_ast_expr *expr1,
74	__isl_take isl_ast_expr *expr2);
75__isl_give isl_ast_expr *isl_ast_expr_mul(__isl_take isl_ast_expr *expr1,
76	__isl_take isl_ast_expr *expr2);
77__isl_give isl_ast_expr *isl_ast_expr_div(__isl_take isl_ast_expr *expr1,
78	__isl_take isl_ast_expr *expr2);
79__isl_give isl_ast_expr *isl_ast_expr_and(__isl_take isl_ast_expr *expr1,
80	__isl_take isl_ast_expr *expr2);
81__isl_give isl_ast_expr *isl_ast_expr_or(__isl_take isl_ast_expr *expr1,
82	__isl_take isl_ast_expr *expr2);
83
84__isl_give isl_ast_expr *isl_ast_expr_copy(__isl_keep isl_ast_expr *expr);
85void *isl_ast_expr_free(__isl_take isl_ast_expr *expr);
86
87isl_ctx *isl_ast_expr_get_ctx(__isl_keep isl_ast_expr *expr);
88enum isl_ast_expr_type isl_ast_expr_get_type(__isl_keep isl_ast_expr *expr);
89int isl_ast_expr_get_int(__isl_keep isl_ast_expr *expr, isl_int *v);
90__isl_give isl_id *isl_ast_expr_get_id(__isl_keep isl_ast_expr *expr);
91
92enum isl_ast_op_type isl_ast_expr_get_op_type(__isl_keep isl_ast_expr *expr);
93int isl_ast_expr_get_op_n_arg(__isl_keep isl_ast_expr *expr);
94__isl_give isl_ast_expr *isl_ast_expr_get_op_arg(__isl_keep isl_ast_expr *expr,
95	int pos);
96
97__isl_give isl_printer *isl_printer_print_ast_expr(__isl_take isl_printer *p,
98	__isl_keep isl_ast_expr *expr);
99void isl_ast_expr_dump(__isl_keep isl_ast_expr *expr);
100__isl_give char *isl_ast_expr_to_str(__isl_keep isl_ast_expr *expr);
101
102__isl_give isl_ast_node *isl_ast_node_alloc_user(__isl_take isl_ast_expr *expr);
103__isl_give isl_ast_node *isl_ast_node_copy(__isl_keep isl_ast_node *node);
104void *isl_ast_node_free(__isl_take isl_ast_node *node);
105
106isl_ctx *isl_ast_node_get_ctx(__isl_keep isl_ast_node *node);
107enum isl_ast_node_type isl_ast_node_get_type(__isl_keep isl_ast_node *node);
108
109__isl_give isl_ast_node *isl_ast_node_set_annotation(
110	__isl_take isl_ast_node *node, __isl_take isl_id *annotation);
111__isl_give isl_id *isl_ast_node_get_annotation(__isl_keep isl_ast_node *node);
112
113__isl_give isl_ast_expr *isl_ast_node_for_get_iterator(
114	__isl_keep isl_ast_node *node);
115__isl_give isl_ast_expr *isl_ast_node_for_get_init(
116	__isl_keep isl_ast_node *node);
117__isl_give isl_ast_expr *isl_ast_node_for_get_cond(
118	__isl_keep isl_ast_node *node);
119__isl_give isl_ast_expr *isl_ast_node_for_get_inc(
120	__isl_keep isl_ast_node *node);
121__isl_give isl_ast_node *isl_ast_node_for_get_body(
122	__isl_keep isl_ast_node *node);
123int isl_ast_node_for_is_degenerate(__isl_keep isl_ast_node *node);
124
125__isl_give isl_ast_expr *isl_ast_node_if_get_cond(
126	__isl_keep isl_ast_node *node);
127__isl_give isl_ast_node *isl_ast_node_if_get_then(
128	__isl_keep isl_ast_node *node);
129int isl_ast_node_if_has_else(__isl_keep isl_ast_node *node);
130__isl_give isl_ast_node *isl_ast_node_if_get_else(
131	__isl_keep isl_ast_node *node);
132
133__isl_give isl_ast_node_list *isl_ast_node_block_get_children(
134	__isl_keep isl_ast_node *node);
135
136__isl_give isl_ast_expr *isl_ast_node_user_get_expr(
137	__isl_keep isl_ast_node *node);
138
139__isl_give isl_printer *isl_printer_print_ast_node(__isl_take isl_printer *p,
140	__isl_keep isl_ast_node *node);
141void isl_ast_node_dump(__isl_keep isl_ast_node *node);
142
143__isl_give isl_ast_print_options *isl_ast_print_options_alloc(isl_ctx *ctx);
144__isl_give isl_ast_print_options *isl_ast_print_options_copy(
145	__isl_keep isl_ast_print_options *options);
146void *isl_ast_print_options_free(__isl_take isl_ast_print_options *options);
147isl_ctx *isl_ast_print_options_get_ctx(
148	__isl_keep isl_ast_print_options *options);
149
150__isl_give isl_ast_print_options *isl_ast_print_options_set_print_user(
151	__isl_take isl_ast_print_options *options,
152	__isl_give isl_printer *(*print_user)(__isl_take isl_printer *p,
153		__isl_take isl_ast_print_options *options,
154		__isl_keep isl_ast_node *node, void *user),
155	void *user);
156__isl_give isl_ast_print_options *isl_ast_print_options_set_print_for(
157	__isl_take isl_ast_print_options *options,
158	__isl_give isl_printer *(*print_for)(__isl_take isl_printer *p,
159		__isl_take isl_ast_print_options *options,
160		__isl_keep isl_ast_node *node, void *user),
161	void *user);
162
163int isl_ast_node_foreach_ast_op_type(__isl_keep isl_ast_node *node,
164	int (*fn)(enum isl_ast_op_type type, void *user), void *user);
165__isl_give isl_printer *isl_ast_op_type_print_macro(
166	enum isl_ast_op_type type, __isl_take isl_printer *p);
167__isl_give isl_printer *isl_ast_node_print_macros(
168	__isl_keep isl_ast_node *node, __isl_take isl_printer *p);
169__isl_give isl_printer *isl_ast_node_print(__isl_keep isl_ast_node *node,
170	__isl_take isl_printer *p,
171	__isl_take isl_ast_print_options *options);
172__isl_give isl_printer *isl_ast_node_for_print(__isl_keep isl_ast_node *node,
173	__isl_take isl_printer *p,
174	__isl_take isl_ast_print_options *options);
175__isl_give isl_printer *isl_ast_node_if_print(__isl_keep isl_ast_node *node,
176	__isl_take isl_printer *p,
177	__isl_take isl_ast_print_options *options);
178
179#if defined(__cplusplus)
180}
181#endif
182
183#endif
184