add isl_union_map_from_union_pw_multi_aff
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 20 Mar 2012 13:32:22 +0000 (14:32 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 6 May 2012 12:33:04 +0000 (14:33 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index e82e294..b13a931 100644 (file)
@@ -1278,8 +1278,8 @@ C<isl_dim_set> and C<isl_dim_div> for sets and
 of C<isl_dim_cst>, C<isl_dim_param>,
 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
 
-A (basic) set or relation can also be constructed from a (piecewise)
-(multiple) affine expression
+A (basic or union) set or relation can also be constructed from a
+(union) (piecewise) (multiple) affine expression
 or a list of affine expressions
 (See L<"Piecewise Quasi Affine Expressions"> and
 L<"Piecewise Multiple Quasi Affine Expressions">).
@@ -1301,6 +1301,9 @@ L<"Piecewise Multiple Quasi Affine Expressions">).
                __isl_take isl_pw_multi_aff *pma);
        __isl_give isl_map *isl_map_from_pw_multi_aff(
                __isl_take isl_pw_multi_aff *pma);
+       __isl_give isl_union_map *
+       isl_union_map_from_union_pw_multi_aff(
+               __isl_take isl_union_pw_multi_aff *upma);
 
 The C<domain_dim> argument describes the domain of the resulting
 basic relation.  It is required because the C<list> may consist
index f52eb2d..674ef8a 100644 (file)
@@ -397,6 +397,9 @@ __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_add(
        __isl_take isl_union_pw_multi_aff *upma1,
        __isl_take isl_union_pw_multi_aff *upma2);
 
+__isl_give isl_union_map *isl_union_map_from_union_pw_multi_aff(
+       __isl_take isl_union_pw_multi_aff *upma);
+
 __isl_give isl_printer *isl_printer_print_union_pw_multi_aff(
        __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma);
 
index 2f82f8f..8fbfb05 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -2948,3 +2948,44 @@ error:
        isl_union_pw_multi_aff_free(upma);
        return NULL;
 }
+
+/* Convert "pma" to an isl_map and add it to *umap.
+ */
+static int map_from_pw_multi_aff(__isl_take isl_pw_multi_aff *pma, void *user)
+{
+       isl_union_map **umap = user;
+       isl_map *map;
+
+       map = isl_map_from_pw_multi_aff(pma);
+       *umap = isl_union_map_add_map(*umap, map);
+
+       return 0;
+}
+
+/* Construct a union map mapping the domain of the union
+ * piecewise multi-affine expression to its range, with each dimension
+ * in the range equated to the corresponding affine expression on its cell.
+ */
+__isl_give isl_union_map *isl_union_map_from_union_pw_multi_aff(
+       __isl_take isl_union_pw_multi_aff *upma)
+{
+       isl_space *space;
+       isl_union_map *umap;
+
+       if (!upma)
+               return NULL;
+
+       space = isl_union_pw_multi_aff_get_space(upma);
+       umap = isl_union_map_empty(space);
+
+       if (isl_union_pw_multi_aff_foreach_pw_multi_aff(upma,
+                                       &map_from_pw_multi_aff, &umap) < 0)
+               goto error;
+
+       isl_union_pw_multi_aff_free(upma);
+       return umap;
+error:
+       isl_union_pw_multi_aff_free(upma);
+       isl_union_map_free(umap);
+       return NULL;
+}