add isl_schedule_foreach_band
[platform/upstream/isl.git] / doc / user.pod
index e82e294..7869890 100644 (file)
@@ -731,6 +731,8 @@ using the following functions.
        __isl_give isl_space *isl_space_set_tuple_name(
                __isl_take isl_space *space,
                enum isl_dim_type type, const char *s);
+       int isl_space_has_tuple_name(__isl_keep isl_space *space,
+               enum isl_dim_type type);
        const char *isl_space_get_tuple_name(__isl_keep isl_space *space,
                enum isl_dim_type type);
 
@@ -789,6 +791,8 @@ using the following functions.
                __isl_take isl_space *domain,
                __isl_take isl_space *range);
        __isl_give isl_space *isl_space_zip(__isl_take isl_space *space);
+       __isl_give isl_space *isl_space_curry(
+               __isl_take isl_space *space);
 
 Note that if dimensions are added or removed from a space, then
 the name and the internal structure are lost.
@@ -797,9 +801,13 @@ the name and the internal structure are lost.
 
 A local space is essentially a space with
 zero or more existentially quantified variables.
-The local space of a basic set or relation can be obtained
+The local space of a (constraint of a) basic set or relation can be obtained
 using the following functions.
 
+       #include <isl/constraint.h>
+       __isl_give isl_local_space *isl_constraint_get_local_space(
+               __isl_keep isl_constraint *constraint);
+
        #include <isl/set.h>
        __isl_give isl_local_space *isl_basic_set_get_local_space(
                __isl_keep isl_basic_set *bset);
@@ -822,6 +830,9 @@ They can be inspected, modified, copied and freed using the following functions.
        int isl_local_space_is_set(__isl_keep isl_local_space *ls);
        int isl_local_space_dim(__isl_keep isl_local_space *ls,
                enum isl_dim_type type);
+       int isl_local_space_has_dim_name(
+               __isl_keep isl_local_space *ls,
+               enum isl_dim_type type, unsigned pos)
        const char *isl_local_space_get_dim_name(
                __isl_keep isl_local_space *ls,
                enum isl_dim_type type, unsigned pos);
@@ -974,6 +985,13 @@ be created.
        __isl_give char *isl_printer_get_str(
                __isl_keep isl_printer *printer);
 
+The printer can be inspected using the following functions.
+
+       FILE *isl_printer_get_file(
+               __isl_keep isl_printer *printer);
+       int isl_printer_get_output_format(
+               __isl_keep isl_printer *p);
+
 The behavior of the printer can be modified in various ways
 
        __isl_give isl_printer *isl_printer_set_output_format(
@@ -1278,14 +1296,16 @@ C<isl_dim_set> and C<isl_dim_div> for sets and
 of C<isl_dim_cst>, C<isl_dim_param>,
 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
 
-A (basic) set or relation can also be constructed from a (piecewise)
-(multiple) affine expression
+A (basic or union) set or relation can also be constructed from a
+(union) (piecewise) (multiple) affine expression
 or a list of affine expressions
 (See L<"Piecewise Quasi Affine Expressions"> and
 L<"Piecewise Multiple Quasi Affine Expressions">).
 
        __isl_give isl_basic_map *isl_basic_map_from_aff(
                __isl_take isl_aff *aff);
+       __isl_give isl_map *isl_map_from_aff(
+               __isl_take isl_aff *aff);
        __isl_give isl_set *isl_set_from_pw_aff(
                __isl_take isl_pw_aff *pwaff);
        __isl_give isl_map *isl_map_from_pw_aff(
@@ -1301,6 +1321,9 @@ L<"Piecewise Multiple Quasi Affine Expressions">).
                __isl_take isl_pw_multi_aff *pma);
        __isl_give isl_map *isl_map_from_pw_multi_aff(
                __isl_take isl_pw_multi_aff *pma);
+       __isl_give isl_union_map *
+       isl_union_map_from_union_pw_multi_aff(
+               __isl_take isl_union_pw_multi_aff *upma);
 
 The C<domain_dim> argument describes the domain of the resulting
 basic relation.  It is required because the C<list> may consist
@@ -1408,6 +1431,12 @@ To iterate over the constraints of a basic set or map, use
 
        #include <isl/constraint.h>
 
+       int isl_basic_set_n_constraint(
+               __isl_keep isl_basic_set *bset);
+       int isl_basic_set_foreach_constraint(
+               __isl_keep isl_basic_set *bset,
+               int (*fn)(__isl_take isl_constraint *c, void *user),
+               void *user);
        int isl_basic_map_foreach_constraint(
                __isl_keep isl_basic_map *bmap,
                int (*fn)(__isl_take isl_constraint *c, void *user),
@@ -1427,6 +1456,12 @@ represents an equality.  If not, it represents an inequality.
 The coefficients of the constraints can be inspected using
 the following functions.
 
+       int isl_constraint_is_lower_bound(
+               __isl_keep isl_constraint *constraint,
+               enum isl_dim_type type, unsigned pos);
+       int isl_constraint_is_upper_bound(
+               __isl_keep isl_constraint *constraint,
+               enum isl_dim_type type, unsigned pos);
        void isl_constraint_get_constant(
                __isl_keep isl_constraint *constraint, isl_int *v);
        void isl_constraint_get_coefficient(
@@ -1535,6 +1570,7 @@ or relation can be read off or set using the following functions.
                __isl_keep isl_basic_set *bset);
        __isl_give isl_basic_set *isl_basic_set_set_tuple_name(
                __isl_take isl_basic_set *set, const char *s);
+       int isl_set_has_tuple_name(__isl_keep isl_set *set);
        const char *isl_set_get_tuple_name(
                __isl_keep isl_set *set);
        const char *isl_basic_map_get_tuple_name(
@@ -1552,6 +1588,9 @@ an internal data structure.
 The identifiers, positions or names of individual dimensions can be
 read off using the following functions.
 
+       __isl_give isl_id *isl_basic_set_get_dim_id(
+               __isl_keep isl_basic_set *bset,
+               enum isl_dim_type type, unsigned pos);
        __isl_give isl_set *isl_set_set_dim_id(
                __isl_take isl_set *set, enum isl_dim_type type,
                unsigned pos, __isl_take isl_id *id);
@@ -1636,6 +1675,8 @@ is already known to be empty.
 
 =item * Single-valuedness
 
+       int isl_basic_map_is_single_valued(
+               __isl_keep isl_basic_map *bmap);
        int isl_map_plain_is_single_valued(
                __isl_keep isl_map *map);
        int isl_map_is_single_valued(__isl_keep isl_map *map);
@@ -1698,6 +1739,14 @@ Check whether the product of domain and range of the given relation
 can be computed,
 i.e., whether both domain and range are nested relations.
 
+=item * Currying
+
+       int isl_basic_map_can_curry(
+               __isl_keep isl_basic_map *bmap);
+       int isl_map_can_curry(__isl_keep isl_map *map);
+
+Check whether the domain of the (basic) relation is a wrapped relation.
+
 =back
 
 =head3 Binary Properties
@@ -1902,6 +1951,10 @@ dimension has a value bounded by the fixed given value.
        __isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
                enum isl_dim_type type1, int pos1,
                enum isl_dim_type type2, int pos2);
+       __isl_give isl_basic_map *isl_basic_map_equate(
+               __isl_take isl_basic_map *bmap,
+               enum isl_dim_type type1, int pos1,
+               enum isl_dim_type type2, int pos2);
        __isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
                enum isl_dim_type type1, int pos1,
                enum isl_dim_type type2, int pos2);
@@ -1916,6 +1969,13 @@ dimensions are equal to each other.
 Intersect the relation with the hyperplane where the given
 dimensions have opposite values.
 
+       __isl_give isl_map *isl_map_order_gt(__isl_take isl_map *map,
+               enum isl_dim_type type1, int pos1,
+               enum isl_dim_type type2, int pos2);
+
+Intersect the relation with the half-space where the given
+dimensions satisfy the given ordering.
+
 =item * Identity
 
        __isl_give isl_map *isl_set_identity(
@@ -2266,6 +2326,20 @@ can be constructed using the following function.
 Given a relation with nested relations for domain and range,
 interchange the range of the domain with the domain of the range.
 
+=item * Currying
+
+       __isl_give isl_basic_map *isl_basic_map_curry(
+               __isl_take isl_basic_map *bmap);
+       __isl_give isl_map *isl_map_curry(
+               __isl_take isl_map *map);
+       __isl_give isl_union_map *isl_union_map_curry(
+               __isl_take isl_union_map *umap);
+
+Given a relation with a nested relation for domain,
+move the range of the nested relation out of the domain
+and use it as the domain of a nested relation in the range,
+with the original range as range of this nested relation.
+
 =item * Aligning parameters
 
        __isl_give isl_set *isl_set_align_params(
@@ -3394,6 +3468,17 @@ Operations include
                __isl_take isl_pw_multi_aff *pma);
        __isl_give isl_union_set *isl_union_pw_multi_aff_domain(
                __isl_take isl_union_pw_multi_aff *upma);
+       __isl_give isl_multi_aff *isl_multi_aff_flat_range_product(
+               __isl_take isl_multi_aff *ma1,
+               __isl_take isl_multi_aff *ma2);
+       __isl_give isl_pw_multi_aff *
+       isl_pw_multi_aff_flat_range_product(
+               __isl_take isl_pw_multi_aff *pma1,
+               __isl_take isl_pw_multi_aff *pma2);
+       __isl_give isl_union_pw_multi_aff *
+       isl_union_pw_multi_aff_flat_range_product(
+               __isl_take isl_union_pw_multi_aff *upma1,
+               __isl_take isl_union_pw_multi_aff *upma2);
 
 If the C<ls> argument of C<isl_multi_aff_lift> is not C<NULL>,
 then it is assigned the local space that lies at the basis of
@@ -4332,6 +4417,15 @@ using the following function.
        __isl_give isl_band_list *isl_schedule_get_band_forest(
                __isl_keep isl_schedule *schedule);
 
+The individual bands can be visited in depth-first post-order
+using the following function.
+
+       #include <isl/schedule.h>
+       int isl_schedule_foreach_band(
+               __isl_keep isl_schedule *sched,
+               int (*fn)(__isl_keep isl_band *band, void *user),
+               void *user);
+
 The list can be manipulated as explained in L<"Lists">.
 The bands inside the list can be copied and freed using the following
 functions.
@@ -4372,12 +4466,37 @@ The properties of a band can be inspected using the following functions.
        int isl_band_member_is_zero_distance(
                __isl_keep isl_band *band, int pos);
 
+       int isl_band_list_foreach_band(
+               __isl_keep isl_band_list *list,
+               int (*fn)(__isl_keep isl_band *band, void *user),
+               void *user);
+
 Note that a scheduling dimension is considered to be ``zero
 distance'' if it does not carry any proximity dependences
 within its band.
 That is, if the dependence distances of the proximity
 dependences are all zero in that direction (for fixed
 iterations of outer bands).
+Like C<isl_schedule_foreach_band>,
+the function C<isl_band_list_foreach_band> calls C<fn> on the bands
+in depth-first post-order.
+
+A band can be tiled using the following function.
+
+       #include <isl/band.h>
+       int isl_band_tile(__isl_keep isl_band *band,
+               __isl_take isl_vec *sizes);
+
+       int isl_options_set_tile_scale_tile_loops(isl_ctx *ctx,
+               int val);
+       int isl_options_get_tile_scale_tile_loops(isl_ctx *ctx);
+
+The C<isl_band_tile> function tiles the band using the given tile sizes
+inside its schedule.
+A new child band is created to represent the point loops and it is
+inserted between the modified band and its children.
+The C<tile_scale_tile_loops> option specifies whether the tile
+loops iterators should be scaled by the tile sizes.
 
 A representation of the band can be printed using