/* * Copyright 2013 Ecole Normale Superieure * * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France */ #include <isl_int.h> #include <isl_ctx_private.h> #include <isl_val_private.h> #undef EL_BASE #define EL_BASE … #include <isl_list_templ.c> #include <isl_list_read_templ.c> /* Allocate an isl_val object with indeterminate value. */ __isl_give isl_val *isl_val_alloc(isl_ctx *ctx) { … } /* Return a reference to an isl_val representing zero. */ __isl_give isl_val *isl_val_zero(isl_ctx *ctx) { … } /* Return a reference to an isl_val representing one. */ __isl_give isl_val *isl_val_one(isl_ctx *ctx) { … } /* Return a reference to an isl_val representing negative one. */ __isl_give isl_val *isl_val_negone(isl_ctx *ctx) { … } /* Return a reference to an isl_val representing NaN. */ __isl_give isl_val *isl_val_nan(isl_ctx *ctx) { … } /* Change "v" into a NaN. */ __isl_give isl_val *isl_val_set_nan(__isl_take isl_val *v) { … } /* Return a reference to an isl_val representing +infinity. */ __isl_give isl_val *isl_val_infty(isl_ctx *ctx) { … } /* Return a reference to an isl_val representing -infinity. */ __isl_give isl_val *isl_val_neginfty(isl_ctx *ctx) { … } /* Return a reference to an isl_val representing the integer "i". */ __isl_give isl_val *isl_val_int_from_si(isl_ctx *ctx, long i) { … } /* Change the value of "v" to be equal to the integer "i". */ __isl_give isl_val *isl_val_set_si(__isl_take isl_val *v, long i) { … } /* Change the value of "v" to be equal to zero. */ __isl_give isl_val *isl_val_set_zero(__isl_take isl_val *v) { … } /* Return a reference to an isl_val representing the unsigned integer "u". */ __isl_give isl_val *isl_val_int_from_ui(isl_ctx *ctx, unsigned long u) { … } /* Return a reference to an isl_val representing the integer "n". */ __isl_give isl_val *isl_val_int_from_isl_int(isl_ctx *ctx, isl_int n) { … } /* Return a reference to an isl_val representing the rational value "n"/"d". * Normalizing the isl_val (if needed) is left to the caller. */ __isl_give isl_val *isl_val_rat_from_isl_int(isl_ctx *ctx, isl_int n, isl_int d) { … } /* Return a new reference to "v". */ __isl_give isl_val *isl_val_copy(__isl_keep isl_val *v) { … } /* Return a fresh copy of "val". */ __isl_give isl_val *isl_val_dup(__isl_keep isl_val *val) { … } /* Return an isl_val that is equal to "val" and that has only * a single reference. */ __isl_give isl_val *isl_val_cow(__isl_take isl_val *val) { … } /* Free "v" and return NULL. */ __isl_null isl_val *isl_val_free(__isl_take isl_val *v) { … } /* Extract the numerator of a rational value "v" as an integer. * * If "v" is not a rational value, then the result is undefined. */ long isl_val_get_num_si(__isl_keep isl_val *v) { … } /* Extract the numerator of a rational value "v" as an isl_int. * * If "v" is not a rational value, then the result is undefined. */ isl_stat isl_val_get_num_isl_int(__isl_keep isl_val *v, isl_int *n) { … } /* Extract the denominator of a rational value "v" as an integer. * * If "v" is not a rational value, then the result is undefined. */ long isl_val_get_den_si(__isl_keep isl_val *v) { … } /* Extract the denominator of a rational value "v" as an isl_val. * * If "v" is not a rational value, then the result is undefined. */ __isl_give isl_val *isl_val_get_den_val(__isl_keep isl_val *v) { … } /* Return an approximation of "v" as a double. */ double isl_val_get_d(__isl_keep isl_val *v) { … } /* Return the isl_ctx to which "val" belongs. */ isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val) { … } /* Return a hash value that digests "val". */ uint32_t isl_val_get_hash(__isl_keep isl_val *val) { … } /* Normalize "v". * * In particular, make sure that the denominator of a rational value * is positive and the numerator and denominator do not have any * common divisors. * * This function should not be called by an external user * since it will only be given normalized values. */ __isl_give isl_val *isl_val_normalize(__isl_take isl_val *v) { … } /* Return the opposite of "v". */ __isl_give isl_val *isl_val_neg(__isl_take isl_val *v) { … } /* Return the inverse of "v". */ __isl_give isl_val *isl_val_inv(__isl_take isl_val *v) { … } /* Return the absolute value of "v". */ __isl_give isl_val *isl_val_abs(__isl_take isl_val *v) { … } /* Return the "floor" (greatest integer part) of "v". * That is, return the result of rounding towards -infinity. */ __isl_give isl_val *isl_val_floor(__isl_take isl_val *v) { … } /* Return the "ceiling" of "v". * That is, return the result of rounding towards +infinity. */ __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v) { … } /* Truncate "v". * That is, return the result of rounding towards zero. */ __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v) { … } /* Return 2^v, where v is an integer (that is not too large). */ __isl_give isl_val *isl_val_pow2(__isl_take isl_val *v) { … } /* This is an alternative name for the function above. */ __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v) { … } /* Return the minimum of "v1" and "v2". */ __isl_give isl_val *isl_val_min(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Return the maximum of "v1" and "v2". */ __isl_give isl_val *isl_val_max(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Return the sum of "v1" and "v2". */ __isl_give isl_val *isl_val_add(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Return the sum of "v1" and "v2". */ __isl_give isl_val *isl_val_add_ui(__isl_take isl_val *v1, unsigned long v2) { … } /* Subtract "v2" from "v1". */ __isl_give isl_val *isl_val_sub(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Subtract "v2" from "v1". */ __isl_give isl_val *isl_val_sub_ui(__isl_take isl_val *v1, unsigned long v2) { … } /* Return the product of "v1" and "v2". */ __isl_give isl_val *isl_val_mul(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Return the product of "v1" and "v2". * * This is a private copy of isl_val_mul for use in the generic * isl_multi_*_scale_val instantiated for isl_val. */ __isl_give isl_val *isl_val_scale_val(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Return the product of "v1" and "v2". */ __isl_give isl_val *isl_val_mul_ui(__isl_take isl_val *v1, unsigned long v2) { … } /* Divide "v1" by "v2". */ __isl_give isl_val *isl_val_div(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Divide "v1" by "v2". */ __isl_give isl_val *isl_val_div_ui(__isl_take isl_val *v1, unsigned long v2) { … } /* Divide "v1" by "v2". * * This is a private copy of isl_val_div for use in the generic * isl_multi_*_scale_down_val instantiated for isl_val. */ __isl_give isl_val *isl_val_scale_down_val(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Given two integer values "v1" and "v2", check if "v1" is divisible by "v2". */ isl_bool isl_val_is_divisible_by(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Given two integer values "v1" and "v2", return the residue of "v1" * modulo "v2". */ __isl_give isl_val *isl_val_mod(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Given two integer values "v1" and "v2", return the residue of "v1" * modulo "v2". * * This is a private copy of isl_val_mod for use in the generic * isl_multi_*_mod_multi_val instantiated for isl_val. */ __isl_give isl_val *isl_val_mod_val(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Given two integer values, return their greatest common divisor. */ __isl_give isl_val *isl_val_gcd(__isl_take isl_val *v1, __isl_take isl_val *v2) { … } /* Compute x, y and g such that g = gcd(a,b) and a*x+b*y = g. */ static void isl_int_gcdext(isl_int *g, isl_int *x, isl_int *y, isl_int a, isl_int b) { … } /* Given two integer values v1 and v2, return their greatest common divisor g, * as well as two integers x and y such that x * v1 + y * v2 = g. */ __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) { … } /* Does "v" represent an integer value? */ isl_bool isl_val_is_int(__isl_keep isl_val *v) { … } /* Does "v" represent a rational value? */ isl_bool isl_val_is_rat(__isl_keep isl_val *v) { … } /* Does "v" represent NaN? */ isl_bool isl_val_is_nan(__isl_keep isl_val *v) { … } /* Does "v" represent +infinity? */ isl_bool isl_val_is_infty(__isl_keep isl_val *v) { … } /* Does "v" represent -infinity? */ isl_bool isl_val_is_neginfty(__isl_keep isl_val *v) { … } /* Does "v" represent the integer zero? */ isl_bool isl_val_is_zero(__isl_keep isl_val *v) { … } /* Does "v" represent the integer one? */ isl_bool isl_val_is_one(__isl_keep isl_val *v) { … } /* Does "v" represent the integer negative one? */ isl_bool isl_val_is_negone(__isl_keep isl_val *v) { … } /* Is "v" (strictly) positive? */ isl_bool isl_val_is_pos(__isl_keep isl_val *v) { … } /* Is "v" (strictly) negative? */ isl_bool isl_val_is_neg(__isl_keep isl_val *v) { … } /* Is "v" non-negative? */ isl_bool isl_val_is_nonneg(__isl_keep isl_val *v) { … } /* Is "v" non-positive? */ isl_bool isl_val_is_nonpos(__isl_keep isl_val *v) { … } /* Return the sign of "v". * * The sign of NaN is undefined. */ int isl_val_sgn(__isl_keep isl_val *v) { … } /* Is "v1" (strictly) less than "v2"? */ isl_bool isl_val_lt(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Is "v1" (strictly) greater than "v2"? */ isl_bool isl_val_gt(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Is "v" (strictly) greater than "i"? */ isl_bool isl_val_gt_si(__isl_keep isl_val *v, long i) { … } /* Is "v1" less than or equal to "v2"? */ isl_bool isl_val_le(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Is "v1" greater than or equal to "v2"? */ isl_bool isl_val_ge(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* How does "v" compare to "i"? * * Return 1 if v is greater, -1 if v is smaller and 0 if v is equal to i. * * If v is NaN (or NULL), then the result is undefined. */ int isl_val_cmp_si(__isl_keep isl_val *v, long i) { … } /* Is "v1" equal to "v2"? */ isl_bool isl_val_eq(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Is "v" equal to "i"? */ isl_bool isl_val_eq_si(__isl_keep isl_val *v, long i) { … } /* Is "v1" equal to "v2" in absolute value? */ isl_bool isl_val_abs_eq(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Is "v1" different from "v2"? */ isl_bool isl_val_ne(__isl_keep isl_val *v1, __isl_keep isl_val *v2) { … } /* Print a textual representation of "v" onto "p". */ __isl_give isl_printer *isl_printer_print_val(__isl_take isl_printer *p, __isl_keep isl_val *v) { … } /* Is "val1" (obviously) equal to "val2"? * * This is a private copy of isl_val_eq for use in the generic * isl_multi_*_plain_is_equal instantiated for isl_val. */ isl_bool isl_val_plain_is_equal(__isl_keep isl_val *val1, __isl_keep isl_val *val2) { … } /* Does "v" have any non-zero coefficients * for any dimension in the given range? * * This function is only meant to be used in the generic isl_multi_* * functions which have to deal with base objects that have an associated * space. Since an isl_val does not have any coefficients, this function * always returns isl_bool_false. */ isl_bool isl_val_involves_dims(__isl_keep isl_val *v, enum isl_dim_type type, unsigned first, unsigned n) { … } /* Insert "n" dimensions of type "type" at position "first". * * This function is only meant to be used in the generic isl_multi_* * functions which have to deal with base objects that have an associated * space. Since an isl_val does not have an associated space, this function * does not do anything. */ __isl_give isl_val *isl_val_insert_dims(__isl_take isl_val *v, enum isl_dim_type type, unsigned first, unsigned n) { … } /* Change the name of the dimension of type "type" at position "pos" to "s". * * This function is only meant to be used in the generic isl_multi_* * functions which have to deal with base objects that have an associated * space. Since an isl_val does not have an associated space, this function * does not do anything. */ __isl_give isl_val *isl_val_set_dim_name(__isl_take isl_val *v, enum isl_dim_type type, unsigned pos, const char *s) { … } /* Return an isl_val that is zero on "ls". * * This function is only meant to be used in the generic isl_multi_* * functions which have to deal with base objects that have an associated * space. Since an isl_val does not have an associated space, this function * simply returns a zero isl_val in the same context as "ls". */ __isl_give isl_val *isl_val_zero_on_domain(__isl_take isl_local_space *ls) { … } #define isl_val_involves_nan … #undef BASE #define BASE … #include <isl_multi_no_domain_templ.c> #include <isl_multi_no_explicit_domain.c> #include <isl_multi_templ.c> #include <isl_multi_un_op_templ.c> #include <isl_multi_bin_val_templ.c> #include <isl_multi_arith_templ.c> #include <isl_multi_dim_id_templ.c> #include <isl_multi_dims.c> #include <isl_multi_min_max_templ.c> #include <isl_multi_nan_templ.c> #include <isl_multi_product_templ.c> #include <isl_multi_splice_templ.c> #include <isl_multi_tuple_id_templ.c> #include <isl_multi_zero_templ.c> /* Does "mv" consist of only zeros? */ isl_bool isl_multi_val_is_zero(__isl_keep isl_multi_val *mv) { … } /* Add "v" to each of the elements of "mv". */ __isl_give isl_multi_val *isl_multi_val_add_val(__isl_take isl_multi_val *mv, __isl_take isl_val *v) { … } /* Reduce the elements of "mv" modulo "v". */ __isl_give isl_multi_val *isl_multi_val_mod_val(__isl_take isl_multi_val *mv, __isl_take isl_val *v) { … }