Makefile.am: add isl_val_private.h to libisl.la sources
[platform/upstream/isl.git] / isl_constraint.c
index 483e26c..1b12a19 100644 (file)
@@ -16,6 +16,7 @@
 #include <isl/seq.h>
 #include <isl_aff_private.h>
 #include <isl_local_space_private.h>
+#include <isl_val_private.h>
 
 #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);
 }