From 59bbb398f4ef67d88dd66f4b281cf7a2b9f5c4af Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 2 Feb 2010 15:21:58 +0100 Subject: [PATCH] add isl_{map,set}_add --- include/isl_map.h | 4 +++ include/isl_set.h | 4 +++ isl_map.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ isl_test.c | 15 ++++++++++ 4 files changed, 109 insertions(+) diff --git a/include/isl_map.h b/include/isl_map.h index f2d7945..ccf4d2c 100644 --- a/include/isl_map.h +++ b/include/isl_map.h @@ -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, diff --git a/include/isl_set.h b/include/isl_set.h index ea06e7e..fc354c6 100644 --- a/include/isl_set.h +++ b/include/isl_set.h @@ -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); diff --git a/isl_map.c b/isl_map.c index eab41d9..8d6bfac 100644 --- 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, diff --git a/isl_test.c b/isl_test.c index 58f5e3a..0c9590d 100644 --- a/isl_test.c +++ b/isl_test.c @@ -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); -- 2.7.4