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 | |