X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=isl_constraint.c;h=1b12a1960a564a211391146ee564d1714821d118;hb=19596bc4e5cd282b2e75d17077b1aaaeacbfd6f9;hp=483e26c4651e0e9b16385711e1f4e77ea06b5eda;hpb=0e1beed0cd7ffd213187079a299f75e5ae0dc72d;p=platform%2Fupstream%2Fisl.git diff --git a/isl_constraint.c b/isl_constraint.c index 483e26c..1b12a19 100644 --- a/isl_constraint.c +++ b/isl_constraint.c @@ -16,6 +16,7 @@ #include #include #include +#include #undef BASE #define BASE constraint @@ -408,6 +409,20 @@ void isl_constraint_get_constant(struct isl_constraint *constraint, isl_int *v) isl_int_set(*v, constraint->v->el[0]); } +/* Return the constant term of "constraint". + */ +__isl_give isl_val *isl_constraint_get_constant_val( + __isl_keep isl_constraint *constraint) +{ + isl_ctx *ctx; + + if (!constraint) + return NULL; + + ctx = isl_constraint_get_ctx(constraint); + return isl_val_int_from_isl_int(ctx, constraint->v->el[0]); +} + void isl_constraint_get_coefficient(struct isl_constraint *constraint, enum isl_dim_type type, int pos, isl_int *v) { @@ -422,6 +437,26 @@ void isl_constraint_get_coefficient(struct isl_constraint *constraint, isl_int_set(*v, constraint->v->el[pos]); } +/* Return the coefficient of the variable of type "type" at position "pos" + * of "constraint". + */ +__isl_give isl_val *isl_constraint_get_coefficient_val( + __isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos) +{ + isl_ctx *ctx; + + if (!constraint) + return NULL; + + ctx = isl_constraint_get_ctx(constraint); + if (pos < 0 || pos >= isl_local_space_dim(constraint->ls, type)) + isl_die(ctx, isl_error_invalid, + "position out of bounds", return NULL); + + pos += isl_local_space_offset(constraint->ls, type); + return isl_val_int_from_isl_int(ctx, constraint->v->el[pos]); +} + __isl_give isl_aff *isl_constraint_get_div(__isl_keep isl_constraint *constraint, int pos) { @@ -446,6 +481,26 @@ __isl_give isl_constraint *isl_constraint_set_constant( return constraint; } +/* Replace the constant term of "constraint" by "v". + */ +__isl_give isl_constraint *isl_constraint_set_constant_val( + __isl_take isl_constraint *constraint, __isl_take isl_val *v) +{ + constraint = isl_constraint_cow(constraint); + if (!constraint || !v) + goto error; + if (!isl_val_is_int(v)) + isl_die(isl_constraint_get_ctx(constraint), isl_error_invalid, + "expecting integer value", goto error); + constraint->v = isl_vec_set_element_val(constraint->v, 0, v); + if (!constraint->v) + constraint = isl_constraint_free(constraint); + return constraint; +error: + isl_val_free(v); + return isl_constraint_free(constraint); +} + __isl_give isl_constraint *isl_constraint_set_constant_si( __isl_take isl_constraint *constraint, int v) { @@ -488,6 +543,34 @@ __isl_give isl_constraint *isl_constraint_set_coefficient( return constraint; } +/* Replace the coefficient of the variable of type "type" at position "pos" + * of "constraint" by "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) +{ + constraint = isl_constraint_cow(constraint); + if (!constraint || !v) + goto error; + if (!isl_val_is_int(v)) + isl_die(isl_constraint_get_ctx(constraint), isl_error_invalid, + "expecting integer value", goto error); + + if (pos >= isl_local_space_dim(constraint->ls, type)) + isl_die(isl_constraint_get_ctx(constraint), isl_error_invalid, + "position out of bounds", goto error); + + pos += isl_local_space_offset(constraint->ls, type); + constraint->v = isl_vec_set_element_val(constraint->v, pos, v); + if (!constraint->v) + constraint = isl_constraint_free(constraint); + return constraint; +error: + isl_val_free(v); + return isl_constraint_free(constraint); +} + __isl_give isl_constraint *isl_constraint_set_coefficient_si( __isl_take isl_constraint *constraint, enum isl_dim_type type, int pos, int v) @@ -1168,33 +1251,32 @@ __isl_give isl_aff *isl_constraint_get_aff( return aff; } -/* Construct an equality constraint equating the given affine expression - * to zero. +/* Construct an inequality (eq = 0) or equality (eq = 1) constraint from "aff". + * In particular, construct aff >= 0 or aff = 0. + * + * The denominator of "aff" can be ignored. */ -__isl_give isl_constraint *isl_equality_from_aff(__isl_take isl_aff *aff) +static __isl_give isl_constraint *isl_constraint_alloc_aff(int eq, + __isl_take isl_aff *aff) { - int k; isl_local_space *ls; - isl_basic_set *bset; + isl_vec *v; if (!aff) return NULL; - ls = isl_aff_get_domain_local_space(aff); - bset = isl_basic_set_from_local_space(ls); - bset = isl_basic_set_extend_constraints(bset, 1, 0); - k = isl_basic_set_alloc_equality(bset); - if (k < 0) - goto error; - - isl_seq_cpy(bset->eq[k], aff->v->el + 1, aff->v->size - 1); + v = isl_vec_drop_els(isl_vec_copy(aff->v), 0, 1); isl_aff_free(aff); - return isl_basic_set_constraint(bset, &bset->eq[k]); -error: - isl_aff_free(aff); - isl_basic_set_free(bset); - return NULL; + return isl_constraint_alloc_vec(eq, ls, v); +} + +/* Construct an equality constraint equating the given affine expression + * to zero. + */ +__isl_give isl_constraint *isl_equality_from_aff(__isl_take isl_aff *aff) +{ + return isl_constraint_alloc_aff(1, aff); } /* Construct an inequality constraint enforcing the given affine expression @@ -1202,26 +1284,5 @@ error: */ __isl_give isl_constraint *isl_inequality_from_aff(__isl_take isl_aff *aff) { - int k; - isl_local_space *ls; - isl_basic_set *bset; - - if (!aff) - return NULL; - - ls = isl_aff_get_domain_local_space(aff); - bset = isl_basic_set_from_local_space(ls); - bset = isl_basic_set_extend_constraints(bset, 0, 1); - k = isl_basic_set_alloc_inequality(bset); - if (k < 0) - goto error; - - isl_seq_cpy(bset->ineq[k], aff->v->el + 1, aff->v->size - 1); - isl_aff_free(aff); - - return isl_basic_set_constraint(bset, &bset->ineq[k]); -error: - isl_aff_free(aff); - isl_basic_set_free(bset); - return NULL; + return isl_constraint_alloc_aff(0, aff); }