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) 10 extern "C" { 11 #endif 12 13 struct isl_ast_expr; 14 typedef struct isl_ast_expr isl_ast_expr; 15 16 struct isl_ast_node; 17 typedef struct isl_ast_node isl_ast_node; 18 19 enum 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 45 enum 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 52 enum 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 60 struct isl_ast_print_options; 61 typedef struct isl_ast_print_options isl_ast_print_options; 62 63 ISL_DECLARE_LIST(ast_expr) 64 ISL_DECLARE_LIST(ast_node) 65 66 int isl_options_set_ast_iterator_type(isl_ctx *ctx, const char *val); 67 const 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); 85 void *isl_ast_expr_free(__isl_take isl_ast_expr *expr); 86 87 isl_ctx *isl_ast_expr_get_ctx(__isl_keep isl_ast_expr *expr); 88 enum isl_ast_expr_type isl_ast_expr_get_type(__isl_keep isl_ast_expr *expr); 89 int 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 92 enum isl_ast_op_type isl_ast_expr_get_op_type(__isl_keep isl_ast_expr *expr); 93 int 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); 99 void 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); 104 void *isl_ast_node_free(__isl_take isl_ast_node *node); 105 106 isl_ctx *isl_ast_node_get_ctx(__isl_keep isl_ast_node *node); 107 enum 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); 123 int 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); 129 int 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); 141 void 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); 146 void *isl_ast_print_options_free(__isl_take isl_ast_print_options *options); 147 isl_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 163 int 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