add isl_pw_aff_scale_down_val
[platform/upstream/isl.git] / doc / user.pod
index 5ce9fad..dbbfc8d 100644 (file)
@@ -343,7 +343,184 @@ before the C<isl_ctx> itself is freed.
        isl_ctx *isl_ctx_alloc();
        void isl_ctx_free(isl_ctx *ctx);
 
        isl_ctx *isl_ctx_alloc();
        void isl_ctx_free(isl_ctx *ctx);
 
-=head2 Integers
+=head2 Values
+
+An C<isl_val> represents an integer value, a rational value
+or one of three special values, infinity, negative infinity and NaN.
+Some predefined values can be created using the following functions.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_zero(isl_ctx *ctx);
+       __isl_give isl_val *isl_val_one(isl_ctx *ctx);
+       __isl_give isl_val *isl_val_nan(isl_ctx *ctx);
+       __isl_give isl_val *isl_val_infty(isl_ctx *ctx);
+       __isl_give isl_val *isl_val_neginfty(isl_ctx *ctx);
+
+Specific integer values can be created using the following functions.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_int_from_si(isl_ctx *ctx,
+               long i);
+       __isl_give isl_val *isl_val_int_from_ui(isl_ctx *ctx,
+               unsigned long u);
+
+They can be copied and freed using the following functions.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_copy(__isl_keep isl_val *v);
+       void *isl_val_free(__isl_take isl_val *v);
+
+They can be inspected using the following functions.
+
+       #include <isl/val.h>
+       isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val);
+       long isl_val_get_num_si(__isl_keep isl_val *v);
+       long isl_val_get_den_si(__isl_keep isl_val *v);
+       double isl_val_get_d(__isl_keep isl_val *v);
+
+Note that C<isl_val_get_num_si>, C<isl_val_get_den_si> and
+C<isl_val_get_d> can only be applied to rational values.
+
+An C<isl_val> can be modified using the following function.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_set_si(__isl_take isl_val *v,
+               long i);
+
+The following unary properties are defined on C<isl_val>s.
+
+       #include <isl/val.h>
+       int isl_val_sgn(__isl_keep isl_val *v);
+       int isl_val_is_zero(__isl_keep isl_val *v);
+       int isl_val_is_one(__isl_keep isl_val *v);
+       int isl_val_is_negone(__isl_keep isl_val *v);
+       int isl_val_is_nonneg(__isl_keep isl_val *v);
+       int isl_val_is_nonpos(__isl_keep isl_val *v);
+       int isl_val_is_pos(__isl_keep isl_val *v);
+       int isl_val_is_neg(__isl_keep isl_val *v);
+       int isl_val_is_int(__isl_keep isl_val *v);
+       int isl_val_is_rat(__isl_keep isl_val *v);
+       int isl_val_is_nan(__isl_keep isl_val *v);
+       int isl_val_is_infty(__isl_keep isl_val *v);
+       int isl_val_is_neginfty(__isl_keep isl_val *v);
+
+Note that the sign of NaN is undefined.
+
+The following binary properties are defined on pairs of C<isl_val>s.
+
+       #include <isl/val.h>
+       int isl_val_lt(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+       int isl_val_le(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+       int isl_val_gt(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+       int isl_val_ge(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+       int isl_val_eq(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+       int isl_val_ne(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+
+For integer C<isl_val>s we additionally have the following binary property.
+
+       #include <isl/val.h>
+       int isl_val_is_divisible_by(__isl_keep isl_val *v1,
+               __isl_keep isl_val *v2);
+
+An C<isl_val> can also be compared to an integer using the following
+function.  The result is undefined for NaN.
+
+       #include <isl/val.h>
+       int isl_val_cmp_si(__isl_keep isl_val *v, long i);
+
+The following unary operations are available on C<isl_val>s.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_abs(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_neg(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_floor(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v);
+
+The following binary operations are available on C<isl_val>s.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_abs(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_neg(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_floor(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_min(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_max(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_add(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_add_ui(__isl_take isl_val *v1,
+               unsigned long v2);
+       __isl_give isl_val *isl_val_sub(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_sub_ui(__isl_take isl_val *v1,
+               unsigned long v2);
+       __isl_give isl_val *isl_val_mul(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_mul_ui(__isl_take isl_val *v1,
+               unsigned long v2);
+       __isl_give isl_val *isl_val_div(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+
+On integer values, we additionally have the following operations.
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v);
+       __isl_give isl_val *isl_val_mod(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_gcd(__isl_take isl_val *v1,
+               __isl_take isl_val *v2);
+       __isl_give isl_val *isl_val_gcdext(__isl_take isl_val *v1,
+               __isl_take isl_val *v2, __isl_give isl_val **x,
+               __isl_give isl_val **y);
+
+The function C<isl_val_gcdext> returns the greatest common divisor g
+of C<v1> and C<v2> as well as two integers C<*x> and C<*y> such
+that C<*x> * C<v1> + C<*y> * C<v2> = g.
+
+A value can be read from input using
+
+       #include <isl/val.h>
+       __isl_give isl_val *isl_val_read_from_str(isl_ctx *ctx,
+               const char *str);
+
+A value can be printed using
+
+       #include <isl/val.h>
+       __isl_give isl_printer *isl_printer_print_val(
+               __isl_take isl_printer *p, __isl_keep isl_val *v);
+
+=head3 GMP specific functions
+
+These functions are only available if C<isl> has been compiled with C<GMP>
+support.
+
+Specific integer and rational values can be created from C<GMP> values using
+the following functions.
+
+       #include <isl/val_gmp.h>
+       __isl_give isl_val *isl_val_int_from_gmp(isl_ctx *ctx,
+               mpz_t z);
+       __isl_give isl_val *isl_val_from_gmp(isl_ctx *ctx,
+               const mpz_t n, const mpz_t d);
+
+The numerator and denominator of a rational value can be extracted as
+C<GMP> values using the following functions.
+
+       #include <isl/val_gmp.h>
+       int isl_val_get_num_gmp(__isl_keep isl_val *v, mpz_t z);
+       int isl_val_get_den_gmp(__isl_keep isl_val *v, mpz_t z);
+
+=head2 Integers (obsolescent)
 
 All operations on integers, mainly the coefficients
 of the constraints describing the sets and relations,
 
 All operations on integers, mainly the coefficients
 of the constraints describing the sets and relations,
@@ -734,6 +911,10 @@ of the original object.
        __isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
                __isl_keep isl_union_pw_qpolynomial_fold *upwf);
 
        __isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
                __isl_keep isl_union_pw_qpolynomial_fold *upwf);
 
+       #include <isl/val.h>
+       __isl_give isl_space *isl_multi_val_get_space(
+               __isl_keep isl_multi_val *mv);
+
        #include <isl/aff.h>
        __isl_give isl_space *isl_aff_get_domain_space(
                __isl_keep isl_aff *aff);
        #include <isl/aff.h>
        __isl_give isl_space *isl_aff_get_domain_space(
                __isl_keep isl_aff *aff);
@@ -1328,12 +1509,19 @@ using the following functions.
                __isl_take isl_constraint *constraint, isl_int v);
        __isl_give isl_constraint *isl_constraint_set_constant_si(
                __isl_take isl_constraint *constraint, int v);
                __isl_take isl_constraint *constraint, isl_int v);
        __isl_give isl_constraint *isl_constraint_set_constant_si(
                __isl_take isl_constraint *constraint, int v);
+       __isl_give isl_constraint *isl_constraint_set_constant_val(
+               __isl_take isl_constraint *constraint,
+               __isl_take isl_val *v);
        __isl_give isl_constraint *isl_constraint_set_coefficient(
                __isl_take isl_constraint *constraint,
                enum isl_dim_type type, int pos, isl_int v);
        __isl_give isl_constraint *isl_constraint_set_coefficient_si(
                __isl_take isl_constraint *constraint,
                enum isl_dim_type type, int pos, int v);
        __isl_give isl_constraint *isl_constraint_set_coefficient(
                __isl_take isl_constraint *constraint,
                enum isl_dim_type type, int pos, isl_int v);
        __isl_give isl_constraint *isl_constraint_set_coefficient_si(
                __isl_take isl_constraint *constraint,
                enum isl_dim_type type, int pos, int v);
+       __isl_give isl_constraint *
+       isl_constraint_set_coefficient_val(
+               __isl_take isl_constraint *constraint,
+               enum isl_dim_type type, int pos, isl_val *v);
        __isl_give isl_basic_map *isl_basic_map_add_constraint(
                __isl_take isl_basic_map *bmap,
                __isl_take isl_constraint *constraint);
        __isl_give isl_basic_map *isl_basic_map_add_constraint(
                __isl_take isl_basic_map *bmap,
                __isl_take isl_constraint *constraint);
@@ -1605,9 +1793,14 @@ the following functions.
                enum isl_dim_type type, unsigned pos);
        void isl_constraint_get_constant(
                __isl_keep isl_constraint *constraint, isl_int *v);
                enum isl_dim_type type, unsigned pos);
        void isl_constraint_get_constant(
                __isl_keep isl_constraint *constraint, isl_int *v);
+       __isl_give isl_val *isl_constraint_get_constant_val(
+               __isl_keep isl_constraint *constraint);
        void isl_constraint_get_coefficient(
                __isl_keep isl_constraint *constraint,
                enum isl_dim_type type, int pos, isl_int *v);
        void isl_constraint_get_coefficient(
                __isl_keep isl_constraint *constraint,
                enum isl_dim_type type, int pos, isl_int *v);
+       __isl_give isl_val *isl_constraint_get_coefficient_val(
+               __isl_keep isl_constraint *constraint,
+               enum isl_dim_type type, int pos);
        int isl_constraint_involves_dims(
                __isl_keep isl_constraint *constraint,
                enum isl_dim_type type, unsigned first, unsigned n);
        int isl_constraint_involves_dims(
                __isl_keep isl_constraint *constraint,
                enum isl_dim_type type, unsigned first, unsigned n);
@@ -2165,6 +2358,10 @@ dimensions have opposite values.
        __isl_give isl_map *isl_map_order_lt(__isl_take isl_map *map,
                enum isl_dim_type type1, int pos1,
                enum isl_dim_type type2, int pos2);
        __isl_give isl_map *isl_map_order_lt(__isl_take isl_map *map,
                enum isl_dim_type type1, int pos1,
                enum isl_dim_type type2, int pos2);
+       __isl_give isl_basic_map *isl_basic_map_order_gt(
+               __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_order_gt(__isl_take isl_map *map,
                enum isl_dim_type type1, int pos1,
                enum isl_dim_type type2, int pos2);
        __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);
@@ -2817,10 +3014,17 @@ a parametric set as well.
        __isl_give isl_set *isl_set_preimage_pw_multi_aff(
                __isl_take isl_set *set,
                __isl_take isl_pw_multi_aff *pma);
        __isl_give isl_set *isl_set_preimage_pw_multi_aff(
                __isl_take isl_set *set,
                __isl_take isl_pw_multi_aff *pma);
+       __isl_give isl_map *isl_map_preimage_domain_multi_aff(
+               __isl_take isl_map *map,
+               __isl_take isl_multi_aff *ma);
+       __isl_give isl_union_map *
+       isl_union_map_preimage_domain_multi_aff(
+               __isl_take isl_union_map *umap,
+               __isl_take isl_multi_aff *ma);
 
 
-These functions compute the preimage of the given set under
+These functions compute the preimage of the given set or map domain under
 the given function.  In other words, the expression is plugged
 the given function.  In other words, the expression is plugged
-into the set description.
+into the set description or into the domain of the map.
 Objects of types C<isl_multi_aff> and C<isl_pw_multi_aff> are described in
 L</"Piecewise Multiple Quasi Affine Expressions">.
 
 Objects of types C<isl_multi_aff> and C<isl_pw_multi_aff> are described in
 L</"Piecewise Multiple Quasi Affine Expressions">.
 
@@ -3078,7 +3282,7 @@ returning a basic set or relation.
 =head2 Lists
 
 Lists are defined over several element types, including
 =head2 Lists
 
 Lists are defined over several element types, including
-C<isl_id>, C<isl_aff>, C<isl_pw_aff>, C<isl_constraint>,
+C<isl_val>, C<isl_id>, C<isl_aff>, C<isl_pw_aff>, C<isl_constraint>,
 C<isl_basic_set>, C<isl_set>, C<isl_ast_expr> and C<isl_ast_node>.
 Here we take lists of C<isl_set>s as an example.
 Lists can be created, copied, modified and freed using the following functions.
 C<isl_basic_set>, C<isl_set>, C<isl_ast_expr> and C<isl_ast_node>.
 Here we take lists of C<isl_set>s as an example.
 Lists can be created, copied, modified and freed using the following functions.
@@ -3126,6 +3330,18 @@ Lists can be inspected using the following functions.
        int isl_set_list_foreach(__isl_keep isl_set_list *list,
                int (*fn)(__isl_take isl_set *el, void *user),
                void *user);
        int isl_set_list_foreach(__isl_keep isl_set_list *list,
                int (*fn)(__isl_take isl_set *el, void *user),
                void *user);
+       int isl_set_list_foreach_scc(__isl_keep isl_set_list *list,
+               int (*follows)(__isl_keep isl_set *a,
+                       __isl_keep isl_set *b, void *user),
+               void *follows_user
+               int (*fn)(__isl_take isl_set *el, void *user),
+               void *fn_user);
+
+The function C<isl_set_list_foreach_scc> calls C<fn> on each of the
+strongly connected components of the graph with as vertices the elements
+of C<list> and a directed edge from vertex C<b> to vertex C<a>
+iff C<follows(a, b)> returns C<1>.  The callbacks C<follows> and C<fn>
+should return C<-1> on error.
 
 Lists can be printed using
 
 
 Lists can be printed using
 
@@ -3134,6 +3350,97 @@ Lists can be printed using
                __isl_take isl_printer *p,
                __isl_keep isl_set_list *list);
 
                __isl_take isl_printer *p,
                __isl_keep isl_set_list *list);
 
+=head2 Multiple Values
+
+An C<isl_multi_val> object represents a sequence of zero or more values,
+living in a set space.
+
+An C<isl_multi_val> can be constructed from an C<isl_val_list>
+using the following function
+
+       #include <isl/val.h>
+       __isl_give isl_multi_val *isl_multi_val_from_val_list(
+               __isl_take isl_space *space,
+               __isl_take isl_val_list *list);
+
+The zero multiple value (with value zero for each set dimension)
+can be created using the following function.
+
+       #include <isl/val.h>
+       __isl_give isl_multi_val *isl_multi_val_zero(
+               __isl_take isl_space *space);
+
+Multiple values can be copied and freed using
+
+       #include <isl/val.h>
+       __isl_give isl_multi_val *isl_multi_val_copy(
+               __isl_keep isl_multi_val *mv);
+       void *isl_multi_val_free(__isl_take isl_multi_val *mv);
+
+They can be inspected using
+
+       #include <isl/val.h>
+       isl_ctx *isl_multi_val_get_ctx(
+               __isl_keep isl_multi_val *mv);
+       unsigned isl_multi_val_dim(__isl_keep isl_multi_val *mv,
+               enum isl_dim_type type);
+       __isl_give isl_val *isl_multi_val_get_val(
+               __isl_keep isl_multi_val *mv, int pos);
+       const char *isl_multi_val_get_tuple_name(
+               __isl_keep isl_multi_val *mv,
+               enum isl_dim_type type);
+
+They can be modified using
+
+       #include <isl/val.h>
+       __isl_give isl_multi_val *isl_multi_val_set_val(
+               __isl_take isl_multi_val *mv, int pos,
+               __isl_take isl_val *val);
+       __isl_give isl_multi_val *isl_multi_val_set_dim_name(
+               __isl_take isl_multi_val *mv,
+               enum isl_dim_type type, unsigned pos, const char *s);
+       __isl_give isl_multi_val *isl_multi_val_set_tuple_name(
+               __isl_take isl_multi_val *mv,
+               enum isl_dim_type type, const char *s);
+       __isl_give isl_multi_val *isl_multi_val_set_tuple_id(
+               __isl_take isl_multi_val *mv,
+               enum isl_dim_type type, __isl_take isl_id *id);
+
+       __isl_give isl_multi_val *isl_multi_val_insert_dims(
+               __isl_take isl_multi_val *mv,
+               enum isl_dim_type type, unsigned first, unsigned n);
+       __isl_give isl_multi_val *isl_multi_val_add_dims(
+               __isl_take isl_multi_val *mv,
+               enum isl_dim_type type, unsigned n);
+       __isl_give isl_multi_val *isl_multi_val_drop_dims(
+               __isl_take isl_multi_val *mv,
+               enum isl_dim_type type, unsigned first, unsigned n);
+
+Operations include
+
+       #include <isl/val.h>
+       __isl_give isl_multi_val *isl_multi_val_align_params(
+               __isl_take isl_multi_val *mv,
+               __isl_take isl_space *model);
+       __isl_give isl_multi_val *isl_multi_val_range_splice(
+               __isl_take isl_multi_val *mv1, unsigned pos,
+               __isl_take isl_multi_val *mv2);
+       __isl_give isl_multi_val *isl_multi_val_range_product(
+               __isl_take isl_multi_val *mv1,
+               __isl_take isl_multi_val *mv2);
+       __isl_give isl_multi_val *isl_multi_val_flat_range_product(
+               __isl_take isl_multi_val *mv1,
+               __isl_take isl_multi_aff *mv2);
+       __isl_give isl_multi_val *isl_multi_val_add_val(
+               __isl_take isl_multi_val *mv,
+               __isl_take isl_val *v);
+       __isl_give isl_multi_val *isl_multi_val_mod_val(
+               __isl_take isl_multi_val *mv,
+               __isl_take isl_val *v);
+       __isl_give isl_multi_val *isl_multi_val_scale_val(
+               __isl_take isl_multi_val *mv,
+               __isl_take isl_val *v);
+
 =head2 Vectors
 
 Vectors can be created, copied and freed using the following functions.
 =head2 Vectors
 
 Vectors can be created, copied and freed using the following functions.
@@ -3151,14 +3458,21 @@ The elements can be changed and inspected using the following functions.
        int isl_vec_size(__isl_keep isl_vec *vec);
        int isl_vec_get_element(__isl_keep isl_vec *vec,
                int pos, isl_int *v);
        int isl_vec_size(__isl_keep isl_vec *vec);
        int isl_vec_get_element(__isl_keep isl_vec *vec,
                int pos, isl_int *v);
+       __isl_give isl_val *isl_vec_get_element_val(
+               __isl_keep isl_vec *vec, int pos);
        __isl_give isl_vec *isl_vec_set_element(
                __isl_take isl_vec *vec, int pos, isl_int v);
        __isl_give isl_vec *isl_vec_set_element_si(
                __isl_take isl_vec *vec, int pos, int v);
        __isl_give isl_vec *isl_vec_set_element(
                __isl_take isl_vec *vec, int pos, isl_int v);
        __isl_give isl_vec *isl_vec_set_element_si(
                __isl_take isl_vec *vec, int pos, int v);
+       __isl_give isl_vec *isl_vec_set_element_val(
+               __isl_take isl_vec *vec, int pos,
+               __isl_take isl_val *v);
        __isl_give isl_vec *isl_vec_set(__isl_take isl_vec *vec,
                isl_int v);
        __isl_give isl_vec *isl_vec_set_si(__isl_take isl_vec *vec,
                int v);
        __isl_give isl_vec *isl_vec_set(__isl_take isl_vec *vec,
                isl_int v);
        __isl_give isl_vec *isl_vec_set_si(__isl_take isl_vec *vec,
                int v);
+       __isl_give isl_vec *isl_vec_set_val(
+               __isl_take isl_vec *vec, __isl_take isl_val *v);
        __isl_give isl_vec *isl_vec_fdiv_r(__isl_take isl_vec *vec,
                isl_int m);
 
        __isl_give isl_vec *isl_vec_fdiv_r(__isl_take isl_vec *vec,
                isl_int m);
 
@@ -3188,10 +3502,15 @@ The elements can be changed and inspected using the following functions.
        int isl_mat_cols(__isl_keep isl_mat *mat);
        int isl_mat_get_element(__isl_keep isl_mat *mat,
                int row, int col, isl_int *v);
        int isl_mat_cols(__isl_keep isl_mat *mat);
        int isl_mat_get_element(__isl_keep isl_mat *mat,
                int row, int col, isl_int *v);
+       __isl_give isl_val *isl_mat_get_element_val(
+               __isl_keep isl_mat *mat, int row, int col);
        __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
                int row, int col, isl_int v);
        __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
                int row, int col, int v);
        __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
                int row, int col, isl_int v);
        __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
                int row, int col, int v);
+       __isl_give isl_mat *isl_mat_set_element_val(
+               __isl_take isl_mat *mat, int row, int col,
+               __isl_take isl_val *v);
 
 C<isl_mat_get_element> will return a negative value if anything went wrong.
 In that case, the value of C<*v> is undefined.
 
 C<isl_mat_get_element> will return a negative value if anything went wrong.
 In that case, the value of C<*v> is undefined.
@@ -3307,10 +3626,17 @@ The expression can be inspected using
                enum isl_dim_type type);
        int isl_aff_get_constant(__isl_keep isl_aff *aff,
                isl_int *v);
                enum isl_dim_type type);
        int isl_aff_get_constant(__isl_keep isl_aff *aff,
                isl_int *v);
+       __isl_give isl_val *isl_aff_get_constant_val(
+               __isl_keep isl_aff *aff);
        int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
                enum isl_dim_type type, int pos, isl_int *v);
        int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
                enum isl_dim_type type, int pos, isl_int *v);
+       __isl_give isl_val *isl_aff_get_coefficient_val(
+               __isl_keep isl_aff *aff,
+               enum isl_dim_type type, int pos);
        int isl_aff_get_denominator(__isl_keep isl_aff *aff,
                isl_int *v);
        int isl_aff_get_denominator(__isl_keep isl_aff *aff,
                isl_int *v);
+       __isl_give isl_val *isl_aff_get_denominator_val(
+               __isl_keep isl_aff *aff);
        __isl_give isl_aff *isl_aff_get_div(
                __isl_keep isl_aff *aff, int pos);
 
        __isl_give isl_aff *isl_aff_get_div(
                __isl_keep isl_aff *aff, int pos);
 
@@ -3353,12 +3679,18 @@ It can be modified using
                __isl_take isl_aff *aff, isl_int v);
        __isl_give isl_aff *isl_aff_set_constant_si(
                __isl_take isl_aff *aff, int v);
                __isl_take isl_aff *aff, isl_int v);
        __isl_give isl_aff *isl_aff_set_constant_si(
                __isl_take isl_aff *aff, int v);
+       __isl_give isl_aff *isl_aff_set_constant_val(
+               __isl_take isl_aff *aff, __isl_take isl_val *v);
        __isl_give isl_aff *isl_aff_set_coefficient(
                __isl_take isl_aff *aff,
                enum isl_dim_type type, int pos, isl_int v);
        __isl_give isl_aff *isl_aff_set_coefficient_si(
                __isl_take isl_aff *aff,
                enum isl_dim_type type, int pos, int v);
        __isl_give isl_aff *isl_aff_set_coefficient(
                __isl_take isl_aff *aff,
                enum isl_dim_type type, int pos, isl_int v);
        __isl_give isl_aff *isl_aff_set_coefficient_si(
                __isl_take isl_aff *aff,
                enum isl_dim_type type, int pos, int v);
+       __isl_give isl_aff *isl_aff_set_coefficient_val(
+               __isl_take isl_aff *aff,
+               enum isl_dim_type type, int pos,
+               __isl_take isl_val *v);
        __isl_give isl_aff *isl_aff_set_denominator(
                __isl_take isl_aff *aff, isl_int v);
 
        __isl_give isl_aff *isl_aff_set_denominator(
                __isl_take isl_aff *aff, isl_int v);
 
@@ -3366,6 +3698,8 @@ It can be modified using
                __isl_take isl_aff *aff, isl_int v);
        __isl_give isl_aff *isl_aff_add_constant_si(
                __isl_take isl_aff *aff, int v);
                __isl_take isl_aff *aff, isl_int v);
        __isl_give isl_aff *isl_aff_add_constant_si(
                __isl_take isl_aff *aff, int v);
+       __isl_give isl_aff *isl_aff_add_constant_val(
+               __isl_take isl_aff *aff, __isl_take isl_val *v);
        __isl_give isl_aff *isl_aff_add_constant_num(
                __isl_take isl_aff *aff, isl_int v);
        __isl_give isl_aff *isl_aff_add_constant_num_si(
        __isl_give isl_aff *isl_aff_add_constant_num(
                __isl_take isl_aff *aff, isl_int v);
        __isl_give isl_aff *isl_aff_add_constant_num_si(
@@ -3376,6 +3710,10 @@ It can be modified using
        __isl_give isl_aff *isl_aff_add_coefficient_si(
                __isl_take isl_aff *aff,
                enum isl_dim_type type, int pos, int v);
        __isl_give isl_aff *isl_aff_add_coefficient_si(
                __isl_take isl_aff *aff,
                enum isl_dim_type type, int pos, int v);
+       __isl_give isl_aff *isl_aff_add_coefficient_val(
+               __isl_take isl_aff *aff,
+               enum isl_dim_type type, int pos,
+               __isl_take isl_val *v);
 
        __isl_give isl_aff *isl_aff_insert_dims(
                __isl_take isl_aff *aff,
 
        __isl_give isl_aff *isl_aff_insert_dims(
                __isl_take isl_aff *aff,
@@ -3396,9 +3734,13 @@ It can be modified using
                __isl_take isl_pw_aff *pwaff,
                enum isl_dim_type type, unsigned first, unsigned n);
 
                __isl_take isl_pw_aff *pwaff,
                enum isl_dim_type type, unsigned first, unsigned n);
 
-Note that the C<set_constant> and C<set_coefficient> functions
+Note that C<isl_aff_set_constant>, C<isl_aff_set_constant_si>,
+C<isl_aff_set_coefficient> and C<isl_aff_set_coefficient_si>
 set the I<numerator> of the constant or coefficient, while
 set the I<numerator> of the constant or coefficient, while
-C<add_constant> and C<add_coefficient> add an integer value to
+C<isl_aff_set_constant_val> and C<isl_aff_set_coefficient_val> set
+the constant or coefficient as a whole.
+The C<add_constant> and C<add_coefficient> functions add an integer
+or rational value to
 the possibly rational constant or coefficient.
 The C<add_constant_num> functions add an integer value to
 the numerator.
 the possibly rational constant or coefficient.
 The C<add_constant_num> functions add an integer value to
 the numerator.
@@ -3444,18 +3786,29 @@ Operations include
                __isl_take isl_pw_aff *pwaff);
        __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff,
                isl_int mod);
                __isl_take isl_pw_aff *pwaff);
        __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff,
                isl_int mod);
+       __isl_give isl_aff *isl_aff_mod_val(__isl_take isl_aff *aff,
+               __isl_take isl_val *mod);
        __isl_give isl_pw_aff *isl_pw_aff_mod(
                __isl_take isl_pw_aff *pwaff, isl_int mod);
        __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
                isl_int f);
        __isl_give isl_pw_aff *isl_pw_aff_mod(
                __isl_take isl_pw_aff *pwaff, isl_int mod);
        __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
                isl_int f);
+       __isl_give isl_aff *isl_aff_scale_val(__isl_take isl_aff *aff,
+               __isl_take isl_val *v);
        __isl_give isl_pw_aff *isl_pw_aff_scale(
                __isl_take isl_pw_aff *pwaff, isl_int f);
        __isl_give isl_pw_aff *isl_pw_aff_scale(
                __isl_take isl_pw_aff *pwaff, isl_int f);
+       __isl_give isl_pw_aff *isl_pw_aff_scale_val(
+               __isl_take isl_pw_aff *pa, __isl_take isl_val *v);
        __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
                isl_int f);
        __isl_give isl_aff *isl_aff_scale_down_ui(
                __isl_take isl_aff *aff, unsigned f);
        __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
                isl_int f);
        __isl_give isl_aff *isl_aff_scale_down_ui(
                __isl_take isl_aff *aff, unsigned f);
+       __isl_give isl_aff *isl_aff_scale_down_val(
+               __isl_take isl_aff *aff, __isl_take isl_val *v);
        __isl_give isl_pw_aff *isl_pw_aff_scale_down(
                __isl_take isl_pw_aff *pwaff, isl_int f);
        __isl_give isl_pw_aff *isl_pw_aff_scale_down(
                __isl_take isl_pw_aff *pwaff, isl_int f);
+       __isl_give isl_pw_aff *isl_pw_aff_scale_down_val(
+               __isl_take isl_pw_aff *pa,
+               __isl_take isl_val *f);
 
        __isl_give isl_pw_aff *isl_pw_aff_list_min(
                __isl_take isl_pw_aff_list *list);
 
        __isl_give isl_pw_aff *isl_pw_aff_list_min(
                __isl_take isl_pw_aff_list *list);
@@ -3913,6 +4266,15 @@ C<isl_multi_aff_sub> subtracts the second argument from the first.
        __isl_give isl_multi_aff *isl_multi_aff_scale(
                __isl_take isl_multi_aff *maff,
                isl_int f);
        __isl_give isl_multi_aff *isl_multi_aff_scale(
                __isl_take isl_multi_aff *maff,
                isl_int f);
+       __isl_give isl_multi_aff *isl_multi_aff_scale_val(
+               __isl_take isl_multi_aff *ma,
+               __isl_take isl_val *v);
+       __isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_val(
+               __isl_take isl_pw_multi_aff *pma,
+               __isl_take isl_val *v);
+       __isl_give isl_multi_pw_aff *isl_multi_pw_aff_scale_val(
+               __isl_take isl_multi_pw_aff *mpa,
+               __isl_take isl_val *v);
        __isl_give isl_multi_aff *isl_multi_aff_scale_vec(
                __isl_take isl_multi_aff *ma,
                __isl_take isl_vec *v);
        __isl_give isl_multi_aff *isl_multi_aff_scale_vec(
                __isl_take isl_multi_aff *ma,
                __isl_take isl_vec *v);
@@ -4088,9 +4450,16 @@ using
 
        int isl_point_get_coordinate(__isl_keep isl_point *pnt,
                enum isl_dim_type type, int pos, isl_int *v);
 
        int isl_point_get_coordinate(__isl_keep isl_point *pnt,
                enum isl_dim_type type, int pos, isl_int *v);
+       __isl_give isl_val *isl_point_get_coordinate_val(
+               __isl_keep isl_point *pnt,
+               enum isl_dim_type type, int pos);
        __isl_give isl_point *isl_point_set_coordinate(
                __isl_take isl_point *pnt,
                enum isl_dim_type type, int pos, isl_int v);
        __isl_give isl_point *isl_point_set_coordinate(
                __isl_take isl_point *pnt,
                enum isl_dim_type type, int pos, isl_int v);
+       __isl_give isl_point *isl_point_set_coordinate_val(
+               __isl_take isl_point *pnt,
+               enum isl_dim_type type, int pos,
+               __isl_take isl_val *v);
 
        __isl_give isl_point *isl_point_add_ui(
                __isl_take isl_point *pnt,
 
        __isl_give isl_point *isl_point_add_ui(
                __isl_take isl_point *pnt,
@@ -4244,6 +4613,9 @@ on the resulting quasipolynomials
        __isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
                __isl_take isl_space *domain,
                const isl_int n, const isl_int d);
        __isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
                __isl_take isl_space *domain,
                const isl_int n, const isl_int d);
+       __isl_give isl_qpolynomial *isl_qpolynomial_val_on_domain(
+               __isl_take isl_space *domain,
+               __isl_take isl_val *val);
        __isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(
                __isl_take isl_space *domain,
                enum isl_dim_type type, unsigned pos);
        __isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(
                __isl_take isl_space *domain,
                enum isl_dim_type type, unsigned pos);
@@ -4338,6 +4710,11 @@ will not have any existentially quantified variables, but that
 the dimensions of the sets may be different for different
 invocations of C<fn>.
 
 the dimensions of the sets may be different for different
 invocations of C<fn>.
 
+The constant term of a quasipolynomial can be extracted using
+
+       __isl_give isl_val *isl_qpolynomial_get_constant_val(
+               __isl_keep isl_qpolynomial *qp);
+
 To iterate over all terms in a quasipolynomial,
 use
 
 To iterate over all terms in a quasipolynomial,
 use
 
@@ -4355,6 +4732,8 @@ these functions
                isl_int *n);
        void isl_term_get_den(__isl_keep isl_term *term,
                isl_int *d);
                isl_int *n);
        void isl_term_get_den(__isl_keep isl_term *term,
                isl_int *d);
+       __isl_give isl_val *isl_term_get_coefficient_val(
+               __isl_keep isl_term *term);
        int isl_term_get_exp(__isl_keep isl_term *term,
                enum isl_dim_type type, unsigned pos);
        __isl_give isl_aff *isl_term_get_div(
        int isl_term_get_exp(__isl_keep isl_term *term,
                enum isl_dim_type type, unsigned pos);
        __isl_give isl_aff *isl_term_get_div(
@@ -4391,6 +4770,9 @@ obviously equal, use
 
        __isl_give isl_qpolynomial *isl_qpolynomial_scale(
                __isl_take isl_qpolynomial *qp, isl_int v);
 
        __isl_give isl_qpolynomial *isl_qpolynomial_scale(
                __isl_take isl_qpolynomial *qp, isl_int v);
+       __isl_give isl_qpolynomial *isl_qpolynomial_scale_val(
+               __isl_take isl_qpolynomial *qp,
+               __isl_take isl_val *v);
        __isl_give isl_qpolynomial *isl_qpolynomial_neg(
                __isl_take isl_qpolynomial *qp);
        __isl_give isl_qpolynomial *isl_qpolynomial_add(
        __isl_give isl_qpolynomial *isl_qpolynomial_neg(
                __isl_take isl_qpolynomial *qp);
        __isl_give isl_qpolynomial *isl_qpolynomial_add(
@@ -4405,6 +4787,10 @@ obviously equal, use
        __isl_give isl_qpolynomial *isl_qpolynomial_pow(
                __isl_take isl_qpolynomial *qp, unsigned exponent);
 
        __isl_give isl_qpolynomial *isl_qpolynomial_pow(
                __isl_take isl_qpolynomial *qp, unsigned exponent);
 
+       __isl_give isl_pw_qpolynomial *
+       isl_pw_qpolynomial_scale_val(
+               __isl_take isl_pw_qpolynomial *pwqp,
+               __isl_take isl_val *v);
        __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
                __isl_take isl_pw_qpolynomial *pwqp1,
                __isl_take isl_pw_qpolynomial *pwqp2);
        __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
                __isl_take isl_pw_qpolynomial *pwqp1,
                __isl_take isl_pw_qpolynomial *pwqp2);
@@ -4422,6 +4808,10 @@ obviously equal, use
        __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
                __isl_take isl_pw_qpolynomial *pwqp, unsigned exponent);
 
        __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
                __isl_take isl_pw_qpolynomial *pwqp, unsigned exponent);
 
+       __isl_give isl_union_pw_qpolynomial *
+       isl_union_pw_qpolynomial_scale_val(
+               __isl_take isl_union_pw_qpolynomial *upwqp,
+               __isl_take isl_val *v);
        __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
                __isl_take isl_union_pw_qpolynomial *upwqp1,
                __isl_take isl_union_pw_qpolynomial *upwqp2);
        __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
                __isl_take isl_union_pw_qpolynomial *upwqp1,
                __isl_take isl_union_pw_qpolynomial *upwqp2);
@@ -4627,6 +5017,17 @@ obviously equal, use
 
        __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
                __isl_take isl_qpolynomial_fold *fold, isl_int v);
 
        __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
                __isl_take isl_qpolynomial_fold *fold, isl_int v);
+       __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val(
+               __isl_take isl_qpolynomial_fold *fold,
+               __isl_take isl_val *v);
+       __isl_give isl_pw_qpolynomial_fold *
+       isl_pw_qpolynomial_fold_scale_val(
+               __isl_take isl_pw_qpolynomial_fold *pwf,
+               __isl_take isl_val *v);
+       __isl_give isl_union_pw_qpolynomial_fold *
+       isl_union_pw_qpolynomial_fold_scale_val(
+               __isl_take isl_union_pw_qpolynomial_fold *upwf,
+               __isl_take isl_val *v);
 
        __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
                __isl_take isl_pw_qpolynomial_fold *pwf1,
 
        __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
                __isl_take isl_pw_qpolynomial_fold *pwf1,