add isl_map_fix_val and isl_set_fix_val
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 24 Jan 2013 19:51:26 +0000 (20:51 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 28 May 2013 18:42:11 +0000 (20:42 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/map.h
include/isl/set.h
isl_map.c

index 473ce3d..b696ac0 100644 (file)
@@ -2283,19 +2283,35 @@ without removing the dimensions.
        __isl_give isl_basic_set *isl_basic_set_fix_si(
                __isl_take isl_basic_set *bset,
                enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_basic_set *isl_basic_set_fix_val(
+               __isl_take isl_basic_set *bset,
+               enum isl_dim_type type, unsigned pos,
+               __isl_take isl_val *v);
        __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
                enum isl_dim_type type, unsigned pos,
                isl_int value);
        __isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
                enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_set *isl_set_fix_val(
+               __isl_take isl_set *set,
+               enum isl_dim_type type, unsigned pos,
+               __isl_take isl_val *v);
        __isl_give isl_basic_map *isl_basic_map_fix_si(
                __isl_take isl_basic_map *bmap,
                enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_basic_map *isl_basic_map_fix_val(
+               __isl_take isl_basic_map *bmap,
+               enum isl_dim_type type, unsigned pos,
+               __isl_take isl_val *v);
        __isl_give isl_map *isl_map_fix(__isl_take isl_map *map,
                enum isl_dim_type type, unsigned pos,
                isl_int value);
        __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
                enum isl_dim_type type, unsigned pos, int value);
+       __isl_give isl_map *isl_map_fix_val(
+               __isl_take isl_map *map,
+               enum isl_dim_type type, unsigned pos,
+               __isl_take isl_val *v);
 
 Intersect the set or relation with the hyperplane where the given
 dimension has the fixed given value.
index 1667a34..f807fe6 100644 (file)
@@ -23,6 +23,7 @@
 #include <isl/aff_type.h>
 #include <isl/list.h>
 #include <isl/map_type.h>
+#include <isl/val.h>
 
 #if defined(__cplusplus)
 extern "C" {
@@ -213,6 +214,8 @@ __isl_give isl_printer *isl_printer_print_map(__isl_take isl_printer *printer,
        __isl_keep isl_map *map);
 __isl_give isl_basic_map *isl_basic_map_fix_si(__isl_take isl_basic_map *bmap,
                enum isl_dim_type type, unsigned pos, int value);
+__isl_give isl_basic_map *isl_basic_map_fix_val(__isl_take isl_basic_map *bmap,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v);
 __isl_give isl_basic_map *isl_basic_map_lower_bound_si(
                __isl_take isl_basic_map *bmap,
                enum isl_dim_type type, unsigned pos, int value);
@@ -387,6 +390,8 @@ __isl_give isl_map *isl_map_fix(__isl_take isl_map *map,
        enum isl_dim_type type, unsigned pos, isl_int value);
 __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
                enum isl_dim_type type, unsigned pos, int value);
+__isl_give isl_map *isl_map_fix_val(__isl_take isl_map *map,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v);
 __isl_give isl_map *isl_map_lower_bound_si(__isl_take isl_map *map,
                enum isl_dim_type type, unsigned pos, int value);
 __isl_give isl_map *isl_map_upper_bound_si(__isl_take isl_map *map,
index 863f5ce..d9af196 100644 (file)
@@ -16,6 +16,7 @@
 #include <isl/mat.h>
 #include <isl/point.h>
 #include <isl/local_space.h>
+#include <isl/val.h>
 
 #if defined(__cplusplus)
 extern "C" {
@@ -162,6 +163,8 @@ __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);
 __isl_give isl_basic_set *isl_basic_set_fix_si(__isl_take isl_basic_set *bset,
                enum isl_dim_type type, unsigned pos, int value);
+__isl_give isl_basic_set *isl_basic_set_fix_val(__isl_take isl_basic_set *bset,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v);
 __isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
                enum isl_dim_type type, unsigned pos, int value);
 __isl_give isl_set *isl_set_lower_bound_si(__isl_take isl_set *set,
@@ -315,6 +318,8 @@ __isl_give isl_set *isl_set_preimage_pw_multi_aff(__isl_take isl_set *set,
        __isl_take isl_pw_multi_aff *pma);
 __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
                enum isl_dim_type type, unsigned pos, isl_int value);
+__isl_give isl_set *isl_set_fix_val(__isl_take isl_set *set,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v);
 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,
index d70f3f3..f71cda1 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -33,6 +33,7 @@
 #include <isl_aff_private.h>
 #include <isl_options_private.h>
 #include <isl_morph.h>
+#include <isl_val_private.h>
 
 static unsigned n(__isl_keep isl_space *dim, enum isl_dim_type type)
 {
@@ -5328,6 +5329,39 @@ error:
        return NULL;
 }
 
+/* Fix the value of the variable at position "pos" of type "type" of "bmap"
+ * to be equal to "v".
+ */
+__isl_give isl_basic_map *isl_basic_map_fix_val(__isl_take isl_basic_map *bmap,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v)
+{
+       if (!bmap || !v)
+               goto error;
+       if (!isl_val_is_int(v))
+               isl_die(isl_basic_map_get_ctx(bmap), isl_error_invalid,
+                       "expecting integer value", goto error);
+       if (pos >= isl_basic_map_dim(bmap, type))
+               isl_die(isl_basic_map_get_ctx(bmap), isl_error_invalid,
+                       "index out of bounds", goto error);
+       pos += isl_basic_map_offset(bmap, type);
+       bmap = isl_basic_map_fix_pos(bmap, pos, v->n);
+       isl_val_free(v);
+       return bmap;
+error:
+       isl_basic_map_free(bmap);
+       isl_val_free(v);
+       return NULL;
+}
+
+/* Fix the value of the variable at position "pos" of type "type" of "bset"
+ * to be equal to "v".
+ */
+__isl_give isl_basic_set *isl_basic_set_fix_val(__isl_take isl_basic_set *bset,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v)
+{
+       return isl_basic_map_fix_val(bset, type, pos, v);
+}
+
 struct isl_basic_set *isl_basic_set_fix_si(struct isl_basic_set *bset,
                enum isl_dim_type type, unsigned pos, int value)
 {
@@ -5467,6 +5501,48 @@ __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
        return (struct isl_set *)isl_map_fix((isl_map *)set, type, pos, value);
 }
 
+/* Fix the value of the variable at position "pos" of type "type" of "map"
+ * to be equal to "v".
+ */
+__isl_give isl_map *isl_map_fix_val(__isl_take isl_map *map,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v)
+{
+       int i;
+
+       map = isl_map_cow(map);
+       if (!map || !v)
+               goto error;
+
+       if (!isl_val_is_int(v))
+               isl_die(isl_map_get_ctx(map), isl_error_invalid,
+                       "expecting integer value", goto error);
+       if (pos >= isl_map_dim(map, type))
+               isl_die(isl_map_get_ctx(map), isl_error_invalid,
+                       "index out of bounds", goto error);
+       for (i = map->n - 1; i >= 0; --i) {
+               map->p[i] = isl_basic_map_fix_val(map->p[i], type, pos,
+                                                       isl_val_copy(v));
+               if (remove_if_empty(map, i) < 0)
+                       goto error;
+       }
+       ISL_F_CLR(map, ISL_MAP_NORMALIZED);
+       isl_val_free(v);
+       return map;
+error:
+       isl_map_free(map);
+       isl_val_free(v);
+       return NULL;
+}
+
+/* Fix the value of the variable at position "pos" of type "type" of "set"
+ * to be equal to "v".
+ */
+__isl_give isl_set *isl_set_fix_val(__isl_take isl_set *set,
+       enum isl_dim_type type, unsigned pos, __isl_take isl_val *v)
+{
+       return isl_map_fix_val(set, type, pos, v);
+}
+
 struct isl_map *isl_map_fix_input_si(struct isl_map *map,
                unsigned input, int value)
 {