add isl_map_oppose
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 18 Jul 2011 14:28:53 +0000 (16:28 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Wed, 20 Jul 2011 15:37:26 +0000 (17:37 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/map.h
isl_map.c

index 9fca1d0..3c3a324 100644 (file)
@@ -1530,6 +1530,13 @@ dimension has the fixed given value.
 Intersect the set or relation with the hyperplane where the given
 dimensions are equal to each other.
 
+       __isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
+               enum isl_dim_type type1, int pos1,
+               enum isl_dim_type type2, int pos2);
+
+Intersect the relation with the hyperplane where the given
+dimensions have opposite values.
+
 =item * Identity
 
        __isl_give isl_map *isl_set_identity(
index d27172e..c25be2c 100644 (file)
@@ -344,6 +344,8 @@ struct isl_map *isl_map_remove_inputs(struct isl_map *map,
 
 __isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
        enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2);
+__isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
+       enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2);
 
 __isl_give isl_map *isl_set_identity(__isl_take isl_set *set);
 
index 6f0362d..78534bf 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -9005,3 +9005,41 @@ error:
        isl_map_free(map);
        return NULL;
 }
+
+/* Add a constraint imposing that the given two dimensions have opposite values.
+ */
+__isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
+       enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2)
+{
+       isl_basic_map *bmap = NULL;
+       int i;
+
+       if (!map)
+               return NULL;
+
+       if (pos1 >= isl_map_dim(map, type1))
+               isl_die(map->ctx, isl_error_invalid,
+                       "index out of bounds", goto error);
+       if (pos2 >= isl_map_dim(map, type2))
+               isl_die(map->ctx, isl_error_invalid,
+                       "index out of bounds", goto error);
+
+       bmap = isl_basic_map_alloc_dim(isl_map_get_dim(map), 0, 1, 0);
+       i = isl_basic_map_alloc_equality(bmap);
+       if (i < 0)
+               goto error;
+       isl_seq_clr(bmap->eq[i], 1 + isl_basic_map_total_dim(bmap));
+       pos1 += isl_basic_map_offset(bmap, type1);
+       pos2 += isl_basic_map_offset(bmap, type2);
+       isl_int_set_si(bmap->eq[i][pos1], 1);
+       isl_int_set_si(bmap->eq[i][pos2], 1);
+       bmap = isl_basic_map_finalize(bmap);
+
+       map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
+
+       return map;
+error:
+       isl_basic_map_free(bmap);
+       isl_map_free(map);
+       return NULL;
+}