__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);
__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.
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);
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);
__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(
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(
__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
#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),
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(
__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(
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);
=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);
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
__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);
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(
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(
__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
__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.
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