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