add isl_basic_set_fix
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 21 Oct 2009 12:01:53 +0000 (14:01 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Wed, 21 Oct 2009 20:58:47 +0000 (22:58 +0200)
include/isl_set.h
isl_map.c

index fa79ff3..e5c63ac 100644 (file)
@@ -131,6 +131,8 @@ void isl_basic_set_print(__isl_keep isl_basic_set *bset, FILE *out, int indent,
        const char *prefix, const char *suffix, unsigned output_format);
 void isl_set_print(__isl_keep struct isl_set *set, FILE *out, int indent,
        unsigned output_format);
+__isl_give isl_basic_set *isl_basic_set_fix(__isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned pos, isl_int value);
 struct isl_basic_set *isl_basic_set_fix_si(struct isl_basic_set *bset,
                enum isl_dim_type type, unsigned pos, int value);
 
index 9a0beb1..c642ec3 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -3077,8 +3077,8 @@ struct isl_set *isl_set_extend(struct isl_set *base,
                                                        nparam, 0, dim);
 }
 
-static struct isl_basic_map *isl_basic_map_fix_pos(struct isl_basic_map *bmap,
-               unsigned pos, int value)
+static struct isl_basic_map *isl_basic_map_fix_pos_si(
+       struct isl_basic_map *bmap, unsigned pos, int value)
 {
        int j;
 
@@ -3097,14 +3097,47 @@ error:
        return NULL;
 }
 
+static __isl_give isl_basic_map *isl_basic_map_fix_pos(
+       __isl_take isl_basic_map *bmap, unsigned pos, isl_int value)
+{
+       int j;
+
+       bmap = isl_basic_map_cow(bmap);
+       bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
+       j = isl_basic_map_alloc_equality(bmap);
+       if (j < 0)
+               goto error;
+       isl_seq_clr(bmap->eq[j] + 1, isl_basic_map_total_dim(bmap));
+       isl_int_set_si(bmap->eq[j][pos], -1);
+       isl_int_set(bmap->eq[j][0], value);
+       bmap = isl_basic_map_simplify(bmap);
+       return isl_basic_map_finalize(bmap);
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
 struct isl_basic_map *isl_basic_map_fix_si(struct isl_basic_map *bmap,
                enum isl_dim_type type, unsigned pos, int value)
 {
        if (!bmap)
                return NULL;
        isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-       return isl_basic_map_fix_pos(bmap, isl_basic_map_offset(bmap, type) + pos,
-                                       value);
+       return isl_basic_map_fix_pos_si(bmap,
+               isl_basic_map_offset(bmap, type) + pos, value);
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
+__isl_give isl_basic_map *isl_basic_map_fix(__isl_take isl_basic_map *bmap,
+               enum isl_dim_type type, unsigned pos, isl_int value)
+{
+       if (!bmap)
+               return NULL;
+       isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
+       return isl_basic_map_fix_pos(bmap,
+               isl_basic_map_offset(bmap, type) + pos, value);
 error:
        isl_basic_map_free(bmap);
        return NULL;
@@ -3118,6 +3151,14 @@ struct isl_basic_set *isl_basic_set_fix_si(struct isl_basic_set *bset,
                                        type, pos, value);
 }
 
+__isl_give isl_basic_set *isl_basic_set_fix(__isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned pos, isl_int value)
+{
+       return (struct isl_basic_set *)
+               isl_basic_map_fix((struct isl_basic_map *)bset,
+                                       type, pos, value);
+}
+
 struct isl_basic_map *isl_basic_map_fix_input_si(struct isl_basic_map *bmap,
                unsigned input, int value)
 {