isl_constraint: add limited support for adding divs
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 29 Dec 2008 14:41:37 +0000 (15:41 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 6 Jan 2009 18:10:49 +0000 (19:10 +0100)
include/isl_constraint.h
include/isl_div.h
isl_constraint.c
isl_div.c

index e1a718b..8494581 100644 (file)
@@ -53,6 +53,8 @@ void isl_constraint_set_coefficient(struct isl_constraint *constraint,
        enum isl_dim_type type, int pos, isl_int v);
 
 struct isl_div *isl_constraint_div(struct isl_constraint *constraint, int pos);
+struct isl_constraint *isl_constraint_add_div(struct isl_constraint *constraint,
+       struct isl_div *div, int *pos);
 
 void isl_constraint_clear(struct isl_constraint *constraint);
 struct isl_constraint *isl_constraint_negate(struct isl_constraint *constraint);
index d4f73b5..98d5762 100644 (file)
@@ -15,6 +15,7 @@ struct isl_div {
        isl_int                 **line;
 };
 
+struct isl_div *isl_div_alloc(struct isl_dim *dim);
 struct isl_div *isl_basic_map_div(struct isl_basic_map *bmap, isl_int **line);
 struct isl_div *isl_div_free(struct isl_div *c);
 
index 7885475..741edb4 100644 (file)
@@ -190,6 +190,35 @@ error:
        return NULL;
 }
 
+struct isl_constraint *isl_constraint_add_div(struct isl_constraint *constraint,
+       struct isl_div *div, int *pos)
+{
+       if (!constraint || !div)
+               goto error;
+
+       isl_assert(constraint->ctx,
+           isl_dim_equal(div->bmap->dim, constraint->bmap->dim), goto error);
+       isl_assert(constraint->ctx,
+           constraint->bmap->n_eq + constraint->bmap->n_ineq == 1, goto error);
+
+       constraint->bmap = isl_basic_map_extend_dim(constraint->bmap,
+                               isl_dim_copy(constraint->bmap->dim), 1, 0, 0);
+       if (!constraint->bmap)
+               goto error;
+       constraint->line = &constraint->bmap->eq[0];
+       *pos = isl_basic_map_alloc_div(constraint->bmap);
+       if (*pos < 0)
+               goto error;
+       isl_seq_cpy(constraint->bmap->div[*pos], div->line[0],
+                       1 + 1 + isl_basic_map_total_dim(constraint->bmap));
+       isl_div_free(div);
+       return constraint;
+error:
+       isl_constraint_free(constraint);
+       isl_div_free(div);
+       return NULL;
+}
+
 int isl_constraint_dim(struct isl_constraint *constraint,
        enum isl_dim_type type)
 {
index 6cfaecc..141bec9 100644 (file)
--- a/isl_div.c
+++ b/isl_div.c
@@ -1,5 +1,6 @@
 #include <isl_div.h>
 #include <isl_map.h>
+#include "isl_map_private.h"
 
 static unsigned n(struct isl_div *d, enum isl_dim_type type)
 {
@@ -46,6 +47,22 @@ error:
        return NULL;
 }
 
+struct isl_div *isl_div_alloc(struct isl_dim *dim)
+{
+       struct isl_basic_map *bmap;
+
+       if (!dim)
+               return NULL;
+
+       bmap = isl_basic_map_alloc_dim(dim, 1, 0, 0);
+       if (!bmap)
+               return NULL;
+
+       isl_basic_map_alloc_div(bmap);
+       isl_seq_clr(bmap->div[0], 1 + 1 + isl_basic_map_total_dim(bmap));
+       return isl_basic_map_div(bmap, &bmap->div[0]);
+}
+
 struct isl_div *isl_div_free(struct isl_div *c)
 {
        if (!c)