diff options
author | Sven Verdoolaege <skimo@kotnet.org> | 2011-05-11 18:26:05 +0200 |
---|---|---|
committer | Sven Verdoolaege <skimo@kotnet.org> | 2011-05-16 18:06:05 +0200 |
commit | 9ab3ff71b5fc17f9f8e69137d73ef00017d60cb1 (patch) | |
tree | 8f831b401337f3d984d40bb331d2e7e08fcc5c9a /isl_constraint.c | |
parent | eba3288afd24ee3aeec159692be38775aae6188d (diff) | |
download | isl-9ab3ff71b5fc17f9f8e69137d73ef00017d60cb1.tar.gz isl-9ab3ff71b5fc17f9f8e69137d73ef00017d60cb1.tar.bz2 isl-9ab3ff71b5fc17f9f8e69137d73ef00017d60cb1.zip |
add isl_constraint_get_bound
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
Diffstat (limited to 'isl_constraint.c')
-rw-r--r-- | isl_constraint.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/isl_constraint.c b/isl_constraint.c index 446fb959..ecc1a0d6 100644 --- a/isl_constraint.c +++ b/isl_constraint.c @@ -15,6 +15,7 @@ #include <isl_dim_private.h> #include <isl_div_private.h> #include <isl/seq.h> +#include <isl_aff_private.h> isl_ctx *isl_constraint_get_ctx(__isl_keep isl_constraint *c) { @@ -965,3 +966,41 @@ error: isl_basic_set_free(context); return -1; } + +__isl_give isl_aff *isl_constraint_get_bound( + __isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos) +{ + isl_aff *aff; + isl_local_space *ls; + + if (!constraint) + return NULL; + if (pos >= isl_basic_set_dim(constraint->bmap, type)) + isl_die(constraint->ctx, isl_error_invalid, + "index out of bounds", return NULL); + if (!isl_basic_map_may_be_set(constraint->bmap)) + isl_die(constraint->ctx, isl_error_invalid, + "not a set constraint", return NULL); + + pos += offset(constraint, type); + if (isl_int_is_zero(constraint->line[0][pos])) + isl_die(constraint->ctx, isl_error_invalid, + "constraint does not define a bound on given dimension", + return NULL); + + ls = isl_basic_set_get_local_space(constraint->bmap); + aff = isl_aff_alloc(ls); + if (!aff) + return NULL; + + if (isl_int_is_neg(constraint->line[0][pos])) + isl_seq_cpy(aff->v->el + 1, constraint->line[0], + aff->v->size - 1); + else + isl_seq_neg(aff->v->el + 1, constraint->line[0], + aff->v->size - 1); + isl_int_set_si(aff->v->el[1 + pos], 0); + isl_int_abs(aff->v->el[0], constraint->line[0][pos]); + + return aff; +} |