__isl_keep isl_pw_multi_aff *pma);
__isl_give isl_space *isl_pw_multi_aff_get_space(
__isl_keep isl_pw_multi_aff *pma);
+ __isl_give isl_space *isl_union_pw_multi_aff_get_space(
+ __isl_keep isl_union_pw_multi_aff *upma);
#include <isl/point.h>
__isl_give isl_space *isl_point_get_space(
__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(
An empty piecewise multiple quasi affine expression (one with no cells),
the zero piecewise multiple quasi affine expression (with value zero
-for each output dimension) or
+for each output dimension),
a piecewise multiple quasi affine expression with a single cell (with
-either a universe or a specified domain) can
-be created using the following functions.
+either a universe or a specified domain) or
+a zero-dimensional piecewise multiple quasi affine expression
+on a given domain
+can be created using the following functions.
#include <isl/aff.h>
__isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty(
__isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc(
__isl_take isl_set *set,
__isl_take isl_multi_aff *maff);
+ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_domain(
+ __isl_take isl_set *set);
+
+ __isl_give isl_union_pw_multi_aff *
+ isl_union_pw_multi_aff_empty(
+ __isl_take isl_space *space);
+ __isl_give isl_union_pw_multi_aff *
+ isl_union_pw_multi_aff_add_pw_multi_aff(
+ __isl_take isl_union_pw_multi_aff *upma,
+ __isl_take isl_pw_multi_aff *pma);
+ __isl_give isl_union_pw_multi_aff *
+ isl_union_pw_multi_aff_from_domain(
+ __isl_take isl_union_set *uset);
A piecewise multiple quasi affine expression can also be initialized
from an C<isl_set> or C<isl_map>, provided the C<isl_set> is a singleton
void *isl_pw_multi_aff_free(
__isl_take isl_pw_multi_aff *pma);
+ __isl_give isl_union_pw_multi_aff *
+ isl_union_pw_multi_aff_copy(
+ __isl_keep isl_union_pw_multi_aff *upma);
+ void *isl_union_pw_multi_aff_free(
+ __isl_take isl_union_pw_multi_aff *upma);
+
The expression can be inspected using
#include <isl/aff.h>
__isl_keep isl_multi_aff *maff);
isl_ctx *isl_pw_multi_aff_get_ctx(
__isl_keep isl_pw_multi_aff *pma);
+ isl_ctx *isl_union_pw_multi_aff_get_ctx(
+ __isl_keep isl_union_pw_multi_aff *upma);
unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff,
enum isl_dim_type type);
unsigned isl_pw_multi_aff_dim(
__isl_take isl_multi_aff *maff,
void *user), void *user);
+ int isl_union_pw_multi_aff_foreach_pw_multi_aff(
+ __isl_keep isl_union_pw_multi_aff *upma,
+ int (*fn)(__isl_take isl_pw_multi_aff *pma,
+ void *user), void *user);
+
It can be modified using
#include <isl/aff.h>
__isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
__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_add(
+ __isl_take isl_union_pw_multi_aff *upma1,
+ __isl_take isl_union_pw_multi_aff *upma2);
__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
__isl_take isl_pw_multi_aff *pma1,
__isl_take isl_pw_multi_aff *pma2);
__isl_take isl_set *set);
__isl_give isl_set *isl_pw_multi_aff_domain(
__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_printer *isl_printer_print_pw_multi_aff(
__isl_take isl_printer *p,
__isl_keep isl_pw_multi_aff *pma);
+ __isl_give isl_printer *isl_printer_print_union_pw_multi_aff(
+ __isl_take isl_printer *p,
+ __isl_keep isl_union_pw_multi_aff *upma);
=head2 Points
dependences are all zero in that direction (for fixed
iterations of outer bands).
+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
#include <isl/band.h>