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