add isl_point_get_dim
[platform/upstream/isl.git] / doc / user.pod
index 72f93fd..3f0ac7f 100644 (file)
@@ -473,6 +473,8 @@ specification of the original object.
        #include <isl/polynomial.h>
        __isl_give isl_dim *isl_qpolynomial_get_dim(
                __isl_keep isl_qpolynomial *qp);
+       __isl_give isl_dim *isl_qpolynomial_fold_get_dim(
+               __isl_keep isl_qpolynomial_fold *fold);
        __isl_give isl_dim *isl_pw_qpolynomial_get_dim(
                __isl_keep isl_pw_qpolynomial *pwqp);
        __isl_give isl_dim *isl_union_pw_qpolynomial_get_dim(
@@ -484,6 +486,10 @@ specification of the original object.
        __isl_give isl_dim *isl_aff_get_dim(
                __isl_keep isl_aff *aff);
 
+       #include <isl/point.h>
+       __isl_give isl_dim *isl_point_get_dim(
+               __isl_keep isl_point *pnt);
+
 The names of the individual dimensions may be set or read off
 using the following functions.
 
@@ -550,6 +556,8 @@ specifications using the following functions.
        __isl_give isl_dim *isl_dim_reverse(__isl_take isl_dim *dim);
        __isl_give isl_dim *isl_dim_join(__isl_take isl_dim *left,
                __isl_take isl_dim *right);
+       __isl_give isl_dim *isl_dim_align_params(
+               __isl_take isl_dim *dim1, __isl_take isl_dim *dim2)
        __isl_give isl_dim *isl_dim_insert(__isl_take isl_dim *dim,
                enum isl_dim_type type, unsigned pos, unsigned n);
        __isl_give isl_dim *isl_dim_add(__isl_take isl_dim *dim,
@@ -602,6 +610,15 @@ They can be inspected, copied and freed using the following functions.
                __isl_keep isl_local_space *ls);
        void *isl_local_space_free(__isl_take isl_local_space *ls);
 
+Local spaces can be created from other local spaces
+using the following functions.
+
+       __isl_give isl_local_space *isl_local_space_from_domain(
+               __isl_take isl_local_space *ls);
+       __isl_give isl_local_space *isl_local_space_add_dim(
+               __isl_take isl_local_space *ls,
+               enum isl_dim_type type, unsigned n);
+
 =head2 Input and Output
 
 C<isl> supports its own input/output format, which is similar
@@ -722,6 +739,8 @@ The behavior of the printer can be modified in various ways
                __isl_take isl_printer *p, int output_format);
        __isl_give isl_printer *isl_printer_set_indent(
                __isl_take isl_printer *p, int indent);
+       __isl_give isl_printer *isl_printer_indent(
+               __isl_take isl_printer *p, int indent);
        __isl_give isl_printer *isl_printer_set_prefix(
                __isl_take isl_printer *p, const char *prefix);
        __isl_give isl_printer *isl_printer_set_suffix(
@@ -730,12 +749,15 @@ The behavior of the printer can be modified in various ways
 The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
 C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
 and defaults to C<ISL_FORMAT_ISL>.
-Each line in the output is indented by C<indent> spaces
+Each line in the output is indented by C<indent> (set by
+C<isl_printer_set_indent>) spaces
 (default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
 In the C<PolyLib> format output,
 the coefficients of the existentially quantified variables
 appear between those of the set variables and those
 of the parameters.
+The function C<isl_printer_indent> increases the indentation
+by the specified amount (which may be negative).
 
 To actually print something, use
 
@@ -999,6 +1021,19 @@ 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 relation can also be constructed from an affine expression
+or a list of affine expressions (See L<"Quasi Affine Expressions">).
+
+       __isl_give isl_basic_map *isl_basic_map_from_aff(
+               __isl_take isl_aff *aff);
+       __isl_give isl_basic_map *isl_basic_map_from_aff_list(
+               __isl_take isl_dim *domain_dim,
+               __isl_take isl_aff_list *list);
+
+The C<domain_dim> argument describes the domain of the resulting
+basic relation.  It is required because the C<list> may consist
+of zero affine expressions.
+
 =head2 Inspecting Sets and Relations
 
 Usually, the user should not have to care about the actual constraints
@@ -1410,6 +1445,29 @@ that maps (a wrapped version of) the input relation to its domain or range.
 Eliminate the coefficients for the given dimensions from the constraints,
 without removing the dimensions.
 
+=item * Slicing
+
+       __isl_give isl_basic_set *isl_basic_set_fix(
+               __isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned pos,
+               isl_int value);
+       __isl_give isl_basic_set *isl_basic_set_fix_si(
+               __isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
+               enum isl_dim_type type, unsigned pos,
+               isl_int value);
+       __isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
+               enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_basic_map *isl_basic_map_fix_si(
+               __isl_take isl_basic_map *bmap,
+               enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
+               enum isl_dim_type type, unsigned pos, int value);
+
+Intersect the set or relation with the hyperplane where the given
+dimension has the fixed given value.
+
 =item * Identity
 
        __isl_give isl_map *isl_set_identity(
@@ -1651,6 +1709,10 @@ then the name of the space is also removed.
                __isl_take isl_basic_set *bset);
        __isl_give isl_set *isl_set_flatten(
                __isl_take isl_set *set);
+       __isl_give isl_basic_map *isl_basic_map_flatten_range(
+               __isl_take isl_basic_map *bmap);
+       __isl_give isl_map *isl_map_flatten_range(
+               __isl_take isl_map *map);
        __isl_give isl_basic_map *isl_basic_map_flatten(
                __isl_take isl_basic_map *bmap);
        __isl_give isl_map *isl_map_flatten(
@@ -1872,6 +1934,15 @@ instead.
        __isl_give isl_set *isl_set_flat_product(
                __isl_take isl_set *set1,
                __isl_take isl_set *set2);
+       __isl_give isl_basic_map *isl_basic_map_flat_range_product(
+               __isl_take isl_basic_map *bmap1,
+               __isl_take isl_basic_map *bmap2);
+       __isl_give isl_map *isl_map_flat_range_product(
+               __isl_take isl_map *map1,
+               __isl_take isl_map *map2);
+       __isl_give isl_union_map *isl_union_map_flat_range_product(
+               __isl_take isl_union_map *umap1,
+               __isl_take isl_union_map *umap2);
        __isl_give isl_basic_map *isl_basic_map_flat_product(
                __isl_take isl_basic_map *bmap1,
                __isl_take isl_basic_map *bmap2);
@@ -2001,6 +2072,44 @@ In case of union relations, the optimum is computed per space.
        __isl_give isl_union_map *isl_union_map_lexmax(
                __isl_take isl_union_map *umap);
 
+=head2 Lists
+
+Lists are defined over several element types, including
+C<isl_aff>, C<isl_basic_set> and C<isl_set>.
+Here we take lists of C<isl_set>s as an example.
+Lists can be created, copied and freed using the following functions.
+
+       #include <isl/list.h>
+       __isl_give isl_set_list *isl_set_list_alloc(
+               isl_ctx *ctx, int n);
+       __isl_give isl_set_list *isl_set_list_copy(
+               __isl_keep isl_set_list *list);
+       __isl_give isl_set_list *isl_set_list_add(
+               __isl_take isl_set_list *list,
+               __isl_take isl_set *el);
+       void isl_set_list_free(__isl_take isl_set_list *list);
+
+C<isl_set_list_alloc> creates an empty list with a capacity for
+C<n> elements.
+
+Lists can be inspected using the following functions.
+
+       #include <isl/list.h>
+       isl_ctx *isl_set_list_get_ctx(__isl_keep isl_set_list *list);
+       int isl_set_list_n_set(__isl_keep isl_set_list *list);
+       __isl_give struct isl_set *isl_set_list_get_set(
+               __isl_keep isl_set_list *list, int index);
+       int isl_set_list_foreach(__isl_keep isl_set_list *list,
+               int (*fn)(__isl_take struct isl_set *el, void *user),
+               void *user);
+
+Lists can be printed using
+
+       #include <isl/list.h>
+       __isl_give isl_printer *isl_printer_print_set_list(
+               __isl_take isl_printer *p,
+               __isl_keep isl_set_list *list);
+
 =head2 Matrices
 
 Matrices can be created, copied and freed using the following functions.
@@ -2162,6 +2271,10 @@ using
                __isl_take isl_point *pnt,
                enum isl_dim_type type, int pos, unsigned val);
 
+Other properties can be obtained using
+
+       isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
+
 Points can be copied or freed using
 
        __isl_give isl_point *isl_point_copy(
@@ -2866,7 +2979,74 @@ from an C<isl_schedule> using the following function.
        __isl_give isl_union_map *isl_schedule_get_map(
                __isl_keep isl_schedule *sched);
 
-This mapping can also be obtained in pieces using the following functions.
+A representation of the schedule can be printed using
+        
+       __isl_give isl_printer *isl_printer_print_schedule(
+               __isl_take isl_printer *p,
+               __isl_keep isl_schedule *schedule);
+
+A representation of the schedule as a forest of bands can be obtained
+using the following function.
+
+       __isl_give isl_band_list *isl_schedule_get_band_forest(
+               __isl_keep isl_schedule *schedule);
+
+The list can be manipulated as explained in L<"Lists">.
+The bands inside the list can be copied and freed using the following
+functions.
+
+       #include <isl/band.h>
+       __isl_give isl_band *isl_band_copy(
+               __isl_keep isl_band *band);
+       void *isl_band_free(__isl_take isl_band *band);
+
+Each band contains zero or more scheduling dimensions.
+These are referred to as the members of the band.
+The section of the schedule that corresponds to the band is
+referred to as the partial schedule of the band.
+For those nodes that participate in a band, the outer scheduling
+dimensions form the prefix schedule, while the inner scheduling
+dimensions form the suffix schedule.
+That is, if we take a cut of the band forest, then the union of
+the concatenations of the prefix, partial and suffix schedules of
+each band in the cut is equal to the entire schedule (modulo
+some possible padding at the end with zero scheduling dimensions).
+The properties of a band can be inspected using the following functions.
+
+       #include <isl/band.h>
+       isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
+
+       int isl_band_has_children(__isl_keep isl_band *band);
+       __isl_give isl_band_list *isl_band_get_children(
+               __isl_keep isl_band *band);
+
+       __isl_give isl_union_map *isl_band_get_prefix_schedule(
+               __isl_keep isl_band *band);
+       __isl_give isl_union_map *isl_band_get_partial_schedule(
+               __isl_keep isl_band *band);
+       __isl_give isl_union_map *isl_band_get_suffix_schedule(
+               __isl_keep isl_band *band);
+
+       int isl_band_n_member(__isl_keep isl_band *band);
+       int isl_band_member_is_zero_distance(
+               __isl_keep isl_band *band, int pos);
+
+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).
+
+A representation of the band can be printed using
+
+       #include <isl/band.h>
+       __isl_give isl_printer *isl_printer_print_band(
+               __isl_take isl_printer *p,
+               __isl_keep isl_band *band);
+
+Alternatively, the schedule mapping
+can also be obtained in pieces using the following functions.
 
        int isl_schedule_n_band(__isl_keep isl_schedule *sched);
        __isl_give isl_union_map *isl_schedule_get_band(