From a4f661ce788a76e5a29edfde8ba2f30ced8fd4e8 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 20 Mar 2012 14:32:22 +0100 Subject: [PATCH] add isl_union_map_from_union_pw_multi_aff Signed-off-by: Sven Verdoolaege --- doc/user.pod | 7 +++++-- include/isl/aff.h | 3 +++ isl_aff.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/doc/user.pod b/doc/user.pod index e82e294..b13a931 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -1278,8 +1278,8 @@ C and C for sets and of C, C, C, C and C 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 argument describes the domain of the resulting basic relation. It is required because the C may consist diff --git a/include/isl/aff.h b/include/isl/aff.h index f52eb2d..674ef8a 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -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); diff --git a/isl_aff.c b/isl_aff.c index 2f82f8f..8fbfb05 100644 --- 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; +} -- 2.7.4