From bb625a7aa9c62f45f3b03ccde9023c9306513389 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 12 Apr 2013 13:59:06 +0200 Subject: [PATCH] add isl_aff_get_coefficient_val Signed-off-by: Sven Verdoolaege --- doc/user.pod | 3 +++ include/isl/aff.h | 2 ++ isl_aff.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index c1145e8..637e9b1 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3627,6 +3627,9 @@ The expression can be inspected using __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); + __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); __isl_give isl_aff *isl_aff_get_div( diff --git a/include/isl/aff.h b/include/isl/aff.h index 74a5992..1f10e7a 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -40,6 +40,8 @@ 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); +__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); __isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v); __isl_give isl_aff *isl_aff_set_constant_si(__isl_take isl_aff *aff, int v); diff --git a/isl_aff.c b/isl_aff.c index a4b9748..8313286 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -455,6 +455,35 @@ int isl_aff_get_coefficient(__isl_keep isl_aff *aff, return 0; } +/* Return the coefficient of the variable of type "type" at position "pos" + * of "aff". + */ +__isl_give isl_val *isl_aff_get_coefficient_val(__isl_keep isl_aff *aff, + enum isl_dim_type type, int pos) +{ + isl_ctx *ctx; + isl_val *v; + + if (!aff) + return NULL; + + ctx = isl_aff_get_ctx(aff); + if (type == isl_dim_out) + isl_die(ctx, isl_error_invalid, + "output/set dimension does not have a coefficient", + return NULL); + if (type == isl_dim_in) + type = isl_dim_set; + + if (pos >= isl_local_space_dim(aff->ls, type)) + isl_die(ctx, isl_error_invalid, + "position out of bounds", return NULL); + + pos += isl_local_space_offset(aff->ls, type); + v = isl_val_rat_from_isl_int(ctx, aff->v->el[1 + pos], aff->v->el[0]); + return isl_val_normalize(v); +} + __isl_give isl_aff *isl_aff_set_denominator(__isl_take isl_aff *aff, isl_int v) { aff = isl_aff_cow(aff); -- 2.7.4