1 #ifndef ISL_AST_PRIVATE_H 2 #define ISL_AST_PRIVATE_H 3 4 #include <isl/aff.h> 5 #include <isl/ast.h> 6 #include <isl/set.h> 7 #include <isl/map.h> 8 #include <isl/vec.h> 9 #include <isl/list.h> 10 #include <isl/stream.h> 11 12 #undef EL 13 #define EL isl_ast_expr 14 15 #include <isl_list_templ.h> 16 17 /* An expression is either an integer, an identifier or an operation 18 * with zero or more arguments. 19 */ 20 struct isl_ast_expr { 21 int ref; 22 23 isl_ctx *ctx; 24 25 enum isl_ast_expr_type type; 26 27 union { 28 isl_val *v; 29 isl_id *id; 30 struct { 31 enum isl_ast_expr_op_type op; 32 isl_ast_expr_list *args; 33 } op; 34 } u; 35 }; 36 37 __isl_give isl_ast_expr *isl_ast_expr_alloc_int_si(isl_ctx *ctx, int i); 38 __isl_give isl_ast_expr *isl_ast_expr_alloc_op(isl_ctx *ctx, 39 enum isl_ast_expr_op_type op, int n_arg); 40 __isl_give isl_ast_expr *isl_ast_expr_op_add_arg(__isl_take isl_ast_expr *expr, 41 __isl_take isl_ast_expr *arg); 42 __isl_give isl_ast_expr *isl_ast_expr_alloc_binary( 43 enum isl_ast_expr_op_type type, 44 __isl_take isl_ast_expr *expr1, __isl_take isl_ast_expr *expr2); 45 46 __isl_give isl_ast_expr *isl_stream_read_ast_expr(__isl_keep isl_stream *s); 47 48 #undef EL 49 #define EL isl_ast_node 50 51 #include <isl_list_templ.h> 52 53 /* A node is either a block, an if, a for, a user node or a mark node. 54 * "else_node" is NULL if the if node does not have an else branch. 55 * "cond" and "inc" are NULL for degenerate for nodes. 56 * In case of a mark node, "mark" is the mark and "node" is the marked node. 57 */ 58 struct isl_ast_node { 59 int ref; 60 61 isl_ctx *ctx; 62 enum isl_ast_node_type type; 63 64 union { 65 struct { 66 isl_ast_node_list *children; 67 } b; 68 struct { 69 isl_ast_expr *guard; 70 isl_ast_node *then; 71 isl_ast_node *else_node; 72 } i; 73 struct { 74 unsigned degenerate : 1; 75 isl_ast_expr *iterator; 76 isl_ast_expr *init; 77 isl_ast_expr *cond; 78 isl_ast_expr *inc; 79 isl_ast_node *body; 80 } f; 81 struct { 82 isl_ast_expr *expr; 83 } e; 84 struct { 85 isl_id *mark; 86 isl_ast_node *node; 87 } m; 88 } u; 89 90 isl_id *annotation; 91 }; 92 93 __isl_give isl_ast_node *isl_ast_node_alloc_for(__isl_take isl_id *id); 94 __isl_give isl_ast_node *isl_ast_node_for_mark_degenerate( 95 __isl_take isl_ast_node *node); 96 __isl_give isl_ast_node *isl_ast_node_alloc_if(__isl_take isl_ast_expr *guard); 97 __isl_give isl_ast_node *isl_ast_node_alloc_block( 98 __isl_take isl_ast_node_list *list); 99 __isl_give isl_ast_node *isl_ast_node_alloc_mark(__isl_take isl_id *id, 100 __isl_take isl_ast_node *node); 101 __isl_give isl_ast_node *isl_ast_node_from_ast_node_list( 102 __isl_take isl_ast_node_list *list); 103 __isl_give isl_ast_node *isl_ast_node_for_set_init( 104 __isl_take isl_ast_node *node, __isl_take isl_ast_expr *init); 105 __isl_give isl_ast_node *isl_ast_node_for_set_cond( 106 __isl_take isl_ast_node *node, __isl_take isl_ast_expr *init); 107 __isl_give isl_ast_node *isl_ast_node_for_set_inc( 108 __isl_take isl_ast_node *node, __isl_take isl_ast_expr *init); 109 __isl_give isl_ast_node *isl_ast_node_for_set_body( 110 __isl_take isl_ast_node *node, __isl_take isl_ast_node *body); 111 __isl_give isl_ast_node *isl_ast_node_if_set_then( 112 __isl_take isl_ast_node *node, __isl_take isl_ast_node *child); 113 114 __isl_give isl_ast_node *isl_stream_read_ast_node(__isl_keep isl_stream *s); 115 116 struct isl_ast_print_options { 117 int ref; 118 isl_ctx *ctx; 119 120 __isl_give isl_printer *(*print_for)(__isl_take isl_printer *p, 121 __isl_take isl_ast_print_options *options, 122 __isl_keep isl_ast_node *node, void *user); 123 void *print_for_user; 124 __isl_give isl_printer *(*print_user)(__isl_take isl_printer *p, 125 __isl_take isl_ast_print_options *options, 126 __isl_keep isl_ast_node *node, void *user); 127 void *print_user_user; 128 }; 129 130 __isl_give isl_printer *isl_ast_node_list_print( 131 __isl_keep isl_ast_node_list *list, __isl_take isl_printer *p, 132 __isl_keep isl_ast_print_options *options); 133 134 #endif 135