xref: /netbsd-src/external/mit/isl/dist/isl_schedule_tree.h (revision 5971e316fdea024efff6be8f03536623db06833e)
1*5971e316Smrg #ifndef ISL_SCHEDLUE_TREE_H
2*5971e316Smrg #define ISL_SCHEDLUE_TREE_H
3*5971e316Smrg 
4*5971e316Smrg #include <isl_schedule_band.h>
5*5971e316Smrg #include <isl/schedule.h>
6*5971e316Smrg #include <isl/set.h>
7*5971e316Smrg #include <isl/union_set.h>
8*5971e316Smrg 
9*5971e316Smrg struct isl_schedule_tree;
10*5971e316Smrg typedef struct isl_schedule_tree isl_schedule_tree;
11*5971e316Smrg 
12*5971e316Smrg ISL_DECLARE_LIST(schedule_tree)
13*5971e316Smrg 
14*5971e316Smrg /* A schedule (sub)tree.
15*5971e316Smrg  *
16*5971e316Smrg  * The leaves of a tree are not explicitly represented inside
17*5971e316Smrg  * the isl_schedule_tree, except when the tree consists of only a leaf.
18*5971e316Smrg  *
19*5971e316Smrg  * The "band" field is valid when type is isl_schedule_node_band.
20*5971e316Smrg  * The "context" field is valid when type is isl_schedule_node_context
21*5971e316Smrg  * and represents constraints on the flat product of the outer band nodes,
22*5971e316Smrg  * possibly introducing additional parameters.
23*5971e316Smrg  * The "domain" field is valid when type is isl_schedule_node_domain
24*5971e316Smrg  * and introduces the statement instances scheduled by the tree.
25*5971e316Smrg  *
26*5971e316Smrg  * The "contraction" and "expansion" fields are valid when type
27*5971e316Smrg  * is isl_schedule_node_expansion.
28*5971e316Smrg  * "expansion" expands the reaching domain elements to one or more
29*5971e316Smrg  * domain elements for the subtree.
30*5971e316Smrg  * "contraction" maps these elements back to the corresponding
31*5971e316Smrg  * reaching domain element.  It does not involve any domain constraints.
32*5971e316Smrg  *
33*5971e316Smrg  * The "extension" field is valid when the is isl_schedule_node_extension
34*5971e316Smrg  * maps outer schedule dimensions (the flat product of the outer band nodes)
35*5971e316Smrg  * to additional iteration domains.
36*5971e316Smrg  *
37*5971e316Smrg  * The "filter" field is valid when type is isl_schedule_node_filter
38*5971e316Smrg  * and represents the statement instances selected by the node.
39*5971e316Smrg  *
40*5971e316Smrg  * The "guard" field is valid when type is isl_schedule_node_guard
41*5971e316Smrg  * and represents constraints on the flat product of the outer band nodes
42*5971e316Smrg  * that need to be enforced by the outer nodes in the generated AST.
43*5971e316Smrg  *
44*5971e316Smrg  * The "mark" field is valid when type is isl_schedule_node_mark and
45*5971e316Smrg  * identifies the mark.
46*5971e316Smrg  *
47*5971e316Smrg  * The "children" field is valid for all types except
48*5971e316Smrg  * isl_schedule_node_leaf.  This field is NULL if there are
49*5971e316Smrg  * no children (except for the implicit leaves).
50*5971e316Smrg  *
51*5971e316Smrg  * anchored is set if the node or any of its descendants depends
52*5971e316Smrg  * on its position in the schedule tree.
53*5971e316Smrg  */
54*5971e316Smrg struct isl_schedule_tree {
55*5971e316Smrg 	int ref;
56*5971e316Smrg 	isl_ctx *ctx;
57*5971e316Smrg 	int anchored;
58*5971e316Smrg 	enum isl_schedule_node_type type;
59*5971e316Smrg 	union {
60*5971e316Smrg 		isl_schedule_band *band;
61*5971e316Smrg 		isl_set *context;
62*5971e316Smrg 		isl_union_set *domain;
63*5971e316Smrg 		struct {
64*5971e316Smrg 			isl_union_pw_multi_aff *contraction;
65*5971e316Smrg 			isl_union_map *expansion;
66*5971e316Smrg 		};
67*5971e316Smrg 		isl_union_map *extension;
68*5971e316Smrg 		isl_union_set *filter;
69*5971e316Smrg 		isl_set *guard;
70*5971e316Smrg 		isl_id *mark;
71*5971e316Smrg 	};
72*5971e316Smrg 	isl_schedule_tree_list *children;
73*5971e316Smrg };
74*5971e316Smrg 
75*5971e316Smrg isl_ctx *isl_schedule_tree_get_ctx(__isl_keep isl_schedule_tree *tree);
76*5971e316Smrg enum isl_schedule_node_type isl_schedule_tree_get_type(
77*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
78*5971e316Smrg 
79*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_leaf(isl_ctx *ctx);
80*5971e316Smrg int isl_schedule_tree_is_leaf(__isl_keep isl_schedule_tree *tree);
81*5971e316Smrg 
82*5971e316Smrg isl_bool isl_schedule_tree_plain_is_equal(__isl_keep isl_schedule_tree *tree1,
83*5971e316Smrg 	__isl_keep isl_schedule_tree *tree2);
84*5971e316Smrg 
85*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_copy(
86*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
87*5971e316Smrg __isl_null isl_schedule_tree *isl_schedule_tree_free(
88*5971e316Smrg 	__isl_take isl_schedule_tree *tree);
89*5971e316Smrg 
90*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_band(
91*5971e316Smrg 	__isl_take isl_schedule_band *band);
92*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_context(
93*5971e316Smrg 	__isl_take isl_set *context);
94*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_domain(
95*5971e316Smrg 	__isl_take isl_union_set *domain);
96*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_expansion(
97*5971e316Smrg 	__isl_take isl_union_pw_multi_aff *contraction,
98*5971e316Smrg 	__isl_take isl_union_map *expansion);
99*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_extension(
100*5971e316Smrg 	__isl_take isl_union_map *extension);
101*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_filter(
102*5971e316Smrg 	__isl_take isl_union_set *filter);
103*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_guard(
104*5971e316Smrg 	__isl_take isl_set *guard);
105*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_children(
106*5971e316Smrg 	enum isl_schedule_node_type type,
107*5971e316Smrg 	__isl_take isl_schedule_tree_list *list);
108*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_pair(
109*5971e316Smrg 	enum isl_schedule_node_type type, __isl_take isl_schedule_tree *tree1,
110*5971e316Smrg 	__isl_take isl_schedule_tree *tree2);
111*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_sequence_pair(
112*5971e316Smrg 	__isl_take isl_schedule_tree *tree1,
113*5971e316Smrg 	__isl_take isl_schedule_tree *tree2);
114*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_set_pair(
115*5971e316Smrg 	__isl_take isl_schedule_tree *tree1,
116*5971e316Smrg 	__isl_take isl_schedule_tree *tree2);
117*5971e316Smrg 
118*5971e316Smrg isl_bool isl_schedule_tree_is_subtree_anchored(
119*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
120*5971e316Smrg 
121*5971e316Smrg __isl_give isl_space *isl_schedule_tree_band_get_space(
122*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
123*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_intersect_domain(
124*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *domain);
125*5971e316Smrg __isl_give isl_multi_union_pw_aff *isl_schedule_tree_band_get_partial_schedule(
126*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
127*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_set_partial_schedule(
128*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
129*5971e316Smrg 	__isl_take isl_multi_union_pw_aff *schedule);
130*5971e316Smrg enum isl_ast_loop_type isl_schedule_tree_band_member_get_ast_loop_type(
131*5971e316Smrg 	__isl_keep isl_schedule_tree *tree, int pos);
132*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_member_set_ast_loop_type(
133*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos,
134*5971e316Smrg 	enum isl_ast_loop_type type);
135*5971e316Smrg enum isl_ast_loop_type isl_schedule_tree_band_member_get_isolate_ast_loop_type(
136*5971e316Smrg 	__isl_keep isl_schedule_tree *tree, int pos);
137*5971e316Smrg __isl_give isl_schedule_tree *
138*5971e316Smrg isl_schedule_tree_band_member_set_isolate_ast_loop_type(
139*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos,
140*5971e316Smrg 	enum isl_ast_loop_type type);
141*5971e316Smrg __isl_give isl_union_set *isl_schedule_tree_band_get_ast_build_options(
142*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
143*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_set_ast_build_options(
144*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *options);
145*5971e316Smrg __isl_give isl_set *isl_schedule_tree_band_get_ast_isolate_option(
146*5971e316Smrg 	__isl_keep isl_schedule_tree *tree, int depth);
147*5971e316Smrg __isl_give isl_set *isl_schedule_tree_context_get_context(
148*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
149*5971e316Smrg __isl_give isl_union_set *isl_schedule_tree_domain_get_domain(
150*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
151*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_domain_set_domain(
152*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *domain);
153*5971e316Smrg __isl_give isl_union_pw_multi_aff *isl_schedule_tree_expansion_get_contraction(
154*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
155*5971e316Smrg __isl_give isl_union_map *isl_schedule_tree_expansion_get_expansion(
156*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
157*5971e316Smrg __isl_give isl_schedule_tree *
158*5971e316Smrg isl_schedule_tree_expansion_set_contraction_and_expansion(
159*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
160*5971e316Smrg 	__isl_take isl_union_pw_multi_aff *contraction,
161*5971e316Smrg 	__isl_take isl_union_map *expansion);
162*5971e316Smrg __isl_give isl_union_map *isl_schedule_tree_extension_get_extension(
163*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
164*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_extension_set_extension(
165*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
166*5971e316Smrg 	__isl_take isl_union_map *extension);
167*5971e316Smrg __isl_give isl_union_set *isl_schedule_tree_filter_get_filter(
168*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
169*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_filter_set_filter(
170*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *filter);
171*5971e316Smrg __isl_give isl_set *isl_schedule_tree_guard_get_guard(
172*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
173*5971e316Smrg __isl_give isl_id *isl_schedule_tree_mark_get_id(
174*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
175*5971e316Smrg 
176*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_first_schedule_descendant(
177*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_keep isl_schedule_tree *leaf);
178*5971e316Smrg __isl_give isl_union_map *isl_schedule_tree_get_subtree_schedule_union_map(
179*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
180*5971e316Smrg 
181*5971e316Smrg isl_size isl_schedule_tree_band_n_member(__isl_keep isl_schedule_tree *tree);
182*5971e316Smrg 
183*5971e316Smrg isl_bool isl_schedule_tree_band_member_get_coincident(
184*5971e316Smrg 	__isl_keep isl_schedule_tree *tree, int pos);
185*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_member_set_coincident(
186*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos, int coincident);
187*5971e316Smrg isl_bool isl_schedule_tree_band_get_permutable(
188*5971e316Smrg 	__isl_keep isl_schedule_tree *tree);
189*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_set_permutable(
190*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int permutable);
191*5971e316Smrg 
192*5971e316Smrg int isl_schedule_tree_has_children(__isl_keep isl_schedule_tree *tree);
193*5971e316Smrg isl_size isl_schedule_tree_n_children(__isl_keep isl_schedule_tree *tree);
194*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_get_child(
195*5971e316Smrg 	__isl_keep isl_schedule_tree *tree, int pos);
196*5971e316Smrg 
197*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_band(
198*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_schedule_band *band);
199*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_context(
200*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_set *context);
201*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_domain(
202*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *domain);
203*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_expansion(
204*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
205*5971e316Smrg 	__isl_take isl_union_pw_multi_aff *contraction,
206*5971e316Smrg 	__isl_take isl_union_map *expansion);
207*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_extension(
208*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
209*5971e316Smrg 	__isl_take isl_union_map *extension);
210*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_filter(
211*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *filter);
212*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_children_insert_filter(
213*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *filter);
214*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_guard(
215*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_set *guard);
216*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_mark(
217*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_id *mark);
218*5971e316Smrg 
219*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_append_to_leaves(
220*5971e316Smrg 	__isl_take isl_schedule_tree *tree1,
221*5971e316Smrg 	__isl_take isl_schedule_tree *tree2);
222*5971e316Smrg 
223*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_scale(
224*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv);
225*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_scale_down(
226*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv);
227*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_mod(
228*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv);
229*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_tile(
230*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *sizes);
231*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_shift(
232*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
233*5971e316Smrg 	__isl_take isl_multi_union_pw_aff *shift);
234*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_split(
235*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos, int depth);
236*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_gist(
237*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_union_set *context);
238*5971e316Smrg 
239*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_child(
240*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos);
241*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_reset_children(
242*5971e316Smrg 	__isl_take isl_schedule_tree *tree);
243*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_drop_child(
244*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos);
245*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_replace_child(
246*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos,
247*5971e316Smrg 	__isl_take isl_schedule_tree *new_child);
248*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_sequence_splice(
249*5971e316Smrg 	__isl_take isl_schedule_tree *tree, int pos,
250*5971e316Smrg 	__isl_take isl_schedule_tree *child);
251*5971e316Smrg 
252*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_reset_user(
253*5971e316Smrg 	__isl_take isl_schedule_tree *tree);
254*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_align_params(
255*5971e316Smrg 	__isl_take isl_schedule_tree *tree, __isl_take isl_space *space);
256*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_pullback_union_pw_multi_aff(
257*5971e316Smrg 	__isl_take isl_schedule_tree *tree,
258*5971e316Smrg 	__isl_take isl_union_pw_multi_aff *upma);
259*5971e316Smrg 
260*5971e316Smrg __isl_give isl_printer *isl_printer_print_schedule_tree(
261*5971e316Smrg 	__isl_take isl_printer *p, __isl_keep isl_schedule_tree *tree);
262*5971e316Smrg __isl_give isl_printer *isl_printer_print_schedule_tree_mark(
263*5971e316Smrg 	__isl_take isl_printer *p, __isl_keep isl_schedule_tree *tree,
264*5971e316Smrg 	int n_ancestor, int *child_pos);
265*5971e316Smrg 
266*5971e316Smrg #endif
267