add isl_{map,set}_add
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 2 Feb 2010 14:21:58 +0000 (15:21 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Wed, 3 Feb 2010 17:29:52 +0000 (18:29 +0100)
include/isl_map.h
include/isl_set.h
isl_map.c
isl_test.c

index f2d7945..ccf4d2c 100644 (file)
@@ -306,6 +306,10 @@ struct isl_set *isl_map_deltas(struct isl_map *map);
 struct isl_map *isl_map_detect_equalities(struct isl_map *map);
 __isl_give isl_basic_map *isl_map_affine_hull(__isl_take isl_map *map);
 __isl_give isl_basic_map *isl_map_convex_hull(__isl_take isl_map *map);
+__isl_give isl_basic_map *isl_basic_map_add(__isl_take isl_basic_map *bmap,
+               enum isl_dim_type type, unsigned n);
+__isl_give isl_map *isl_map_add(__isl_take isl_map *map,
+               enum isl_dim_type type, unsigned n);
 struct isl_map *isl_map_remove(struct isl_map *map,
        enum isl_dim_type type, unsigned first, unsigned n);
 struct isl_map *isl_map_remove_inputs(struct isl_map *map,
index ea06e7e..fc354c6 100644 (file)
@@ -228,6 +228,10 @@ struct isl_set *isl_set_fix_dim_si(struct isl_set *set,
                unsigned dim, int value);
 struct isl_set *isl_set_lower_bound_dim(struct isl_set *set,
                unsigned dim, isl_int value);
+__isl_give isl_basic_set *isl_basic_set_add(__isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned n);
+__isl_give isl_set *isl_set_add(__isl_take isl_set *set,
+               enum isl_dim_type type, unsigned n);
 __isl_give isl_basic_set *isl_basic_set_project_out(
                __isl_take isl_basic_set *bset,
                enum isl_dim_type type, unsigned first, unsigned n);
index eab41d9..8d6bfac 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -1956,6 +1956,92 @@ struct isl_basic_map *isl_basic_map_reverse(struct isl_basic_map *bmap)
        return isl_basic_map_from_basic_set(bset, dim);
 }
 
+__isl_give isl_basic_map *isl_basic_map_add(__isl_take isl_basic_map *bmap,
+               enum isl_dim_type type, unsigned n)
+{
+       struct isl_dim *res_dim;
+       struct isl_basic_map *res;
+       struct isl_dim_map *dim_map;
+       unsigned total, pos;
+
+       if (n == 0)
+               return bmap;
+
+       if (!bmap)
+               return NULL;
+
+       res_dim = isl_dim_add(isl_basic_map_get_dim(bmap), type, n);
+
+       total = isl_basic_map_total_dim(bmap) + n;
+       dim_map = isl_dim_map_alloc(bmap->ctx, total);
+       pos = 0;
+       isl_dim_map_dim(dim_map, bmap->dim, isl_dim_param, pos);
+       pos += isl_dim_size(res_dim, isl_dim_param);
+       isl_dim_map_dim(dim_map, bmap->dim, isl_dim_in, pos);
+       pos += isl_dim_size(res_dim, isl_dim_in);
+       isl_dim_map_dim(dim_map, bmap->dim, isl_dim_out, pos);
+       pos += isl_dim_size(res_dim, isl_dim_out);
+       isl_dim_map_div(dim_map, bmap, pos);
+
+       res = isl_basic_map_alloc_dim(res_dim,
+                       bmap->n_div, bmap->n_eq, bmap->n_ineq);
+       res = add_constraints_dim_map(res, bmap, dim_map);
+       res = isl_basic_map_simplify(res);
+       return isl_basic_map_finalize(res);
+}
+
+__isl_give isl_basic_set *isl_basic_set_add(__isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned n)
+{
+       if (!bset)
+               return NULL;
+       isl_assert(bset->ctx, type != isl_dim_in, goto error);
+       return (isl_basic_set *)isl_basic_map_add((isl_basic_map *)bset, type, n);
+error:
+       isl_basic_set_free(bset);
+       return NULL;
+}
+
+__isl_give isl_map *isl_map_add(__isl_take isl_map *map,
+               enum isl_dim_type type, unsigned n)
+{
+       int i;
+
+       if (n == 0)
+               return map;
+
+       map = isl_map_cow(map);
+       if (!map)
+               return NULL;
+
+       map->dim = isl_dim_add(map->dim, type, n);
+       if (!map->dim)
+               goto error;
+
+       for (i = 0; i < map->n; ++i) {
+               map->p[i] = isl_basic_map_add(map->p[i], type, n);
+               if (!map->p[i])
+                       goto error;
+       }
+
+       return map;
+error:
+       isl_map_free(map);
+       return NULL;
+}
+
+__isl_give isl_set *isl_set_add(__isl_take isl_set *set,
+               enum isl_dim_type type, unsigned n)
+{
+       if (!set)
+               return NULL;
+       isl_assert(set->ctx, type != isl_dim_in, goto error);
+       return (isl_set *)isl_map_add((isl_map *)set, type, n);
+error:
+       isl_set_free(set);
+       return NULL;
+}
+
 /* Turn final n dimensions into existentially quantified variables.
  */
 struct isl_basic_set *isl_basic_set_project_out(struct isl_basic_set *bset,
index 58f5e3a..0c9590d 100644 (file)
@@ -73,6 +73,20 @@ void test_construction(struct isl_ctx *ctx)
        isl_int_clear(v);
 }
 
+void test_dim(struct isl_ctx *ctx)
+{
+       isl_map *map1, *map2;
+
+       map1 = isl_map_read_from_str(ctx,
+           "[n] -> { [i] -> [j] : exists (a = [i/10] : i - 10a <= n ) }", -1);
+       map1 = isl_map_add(map1, isl_dim_in, 1);
+       map2 = isl_map_read_from_str(ctx,
+           "[n] -> { [i,k] -> [j] : exists (a = [i/10] : i - 10a <= n ) }", -1);
+       assert(isl_map_is_equal(map1, map2));
+       isl_map_free(map1);
+       isl_map_free(map2);
+}
+
 void test_div(struct isl_ctx *ctx)
 {
        isl_int v;
@@ -591,6 +605,7 @@ int main()
        ctx = isl_ctx_alloc();
        test_read(ctx);
        test_construction(ctx);
+       test_dim(ctx);
        test_div(ctx);
        test_application(ctx);
        test_affine_hull(ctx);