From 9ab3ff71b5fc17f9f8e69137d73ef00017d60cb1 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 11 May 2011 18:26:05 +0200 Subject: [PATCH] add isl_constraint_get_bound Signed-off-by: Sven Verdoolaege --- doc/user.pod | 9 +++++++++ include/isl/constraint.h | 4 ++++ isl_constraint.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index a082991e..d03bf54b 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2029,6 +2029,15 @@ Quasi affine expressions can be copied and free using __isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff); void *isl_aff_free(__isl_take isl_aff *aff); +A (rational) bound on a dimension can be extracted from an C +using the following function. The constraint is required to have +a non-zero coefficient for the specified dimension. + + #include + __isl_give isl_aff *isl_constraint_get_bound( + __isl_keep isl_constraint *constraint, + enum isl_dim_type type, int pos); + The expression can be inspected using #include diff --git a/include/isl/constraint.h b/include/isl/constraint.h index 974c37f3..7d20bab6 100644 --- a/include/isl/constraint.h +++ b/include/isl/constraint.h @@ -10,6 +10,7 @@ #ifndef ISL_CONSTRAINT_H #define ISL_CONSTRAINT_H +#include #include #include #include @@ -110,6 +111,9 @@ __isl_give isl_basic_map *isl_basic_map_from_constraint( struct isl_basic_set *isl_basic_set_from_constraint( struct isl_constraint *constraint); +__isl_give isl_aff *isl_constraint_get_bound( + __isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos); + __isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p, __isl_keep isl_constraint *c); void isl_constraint_dump(__isl_keep isl_constraint *c); 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 #include #include +#include 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; +} -- 2.11.4.GIT