add isl_aff_get_coefficient_val
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 12 Apr 2013 11:59:06 +0000 (13:59 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 28 May 2013 16:24:48 +0000 (18:24 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index c1145e8..637e9b1 100644 (file)
@@ -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(
index 74a5992..1f10e7a 100644 (file)
@@ -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);
index a4b9748..8313286 100644 (file)
--- 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);