From f068f30e43903b246ea5aad7a57a1138435daf0e Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 20 Mar 2012 14:24:15 +0100 Subject: [PATCH] add isl_union_pw_multi_aff Signed-off-by: Sven Verdoolaege --- doc/user.pod | 31 ++++++++++++++++++++ include/isl/aff.h | 31 ++++++++++++++++++++ include/isl/aff_type.h | 3 ++ isl_aff.c | 14 +++++++++ isl_output.c | 78 +++++++++++++++++++++++++++++++++++++++++++++----- isl_union_templ.c | 2 ++ print.c | 3 ++ 7 files changed, 155 insertions(+), 7 deletions(-) diff --git a/doc/user.pod b/doc/user.pod index dcc1161..1bcdf49 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -664,6 +664,8 @@ of the original object. __isl_keep isl_pw_multi_aff *pma); __isl_give isl_space *isl_pw_multi_aff_get_space( __isl_keep isl_pw_multi_aff *pma); + __isl_give isl_space *isl_union_pw_multi_aff_get_space( + __isl_keep isl_union_pw_multi_aff *upma); #include __isl_give isl_space *isl_point_get_space( @@ -3228,6 +3230,14 @@ be created using the following functions. __isl_take isl_set *set, __isl_take isl_multi_aff *maff); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_empty( + __isl_take isl_space *space); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_add_pw_multi_aff( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_pw_multi_aff *pma); + A piecewise multiple quasi affine expression can also be initialized from an C or C, provided the C is a singleton and the C is single-valued. @@ -3249,6 +3259,12 @@ Multiple quasi affine expressions can be copied and freed using void *isl_pw_multi_aff_free( __isl_take isl_pw_multi_aff *pma); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_copy( + __isl_keep isl_union_pw_multi_aff *upma); + void *isl_union_pw_multi_aff_free( + __isl_take isl_union_pw_multi_aff *upma); + The expression can be inspected using #include @@ -3256,6 +3272,8 @@ The expression can be inspected using __isl_keep isl_multi_aff *maff); isl_ctx *isl_pw_multi_aff_get_ctx( __isl_keep isl_pw_multi_aff *pma); + isl_ctx *isl_union_pw_multi_aff_get_ctx( + __isl_keep isl_union_pw_multi_aff *upma); unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff, enum isl_dim_type type); unsigned isl_pw_multi_aff_dim( @@ -3290,6 +3308,11 @@ The expression can be inspected using __isl_take isl_multi_aff *maff, void *user), void *user); + int isl_union_pw_multi_aff_foreach_pw_multi_aff( + __isl_keep isl_union_pw_multi_aff *upma, + int (*fn)(__isl_take isl_pw_multi_aff *pma, + void *user), void *user); + It can be modified using #include @@ -3328,6 +3351,9 @@ Operations include __isl_give isl_pw_multi_aff *isl_pw_multi_aff_add( __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2); + __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_pw_multi_aff *isl_pw_multi_aff_union_add( __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2); @@ -3359,6 +3385,8 @@ Operations include __isl_take isl_set *set); __isl_give isl_set *isl_pw_multi_aff_domain( __isl_take isl_pw_multi_aff *pma); + __isl_give isl_union_set *isl_union_pw_multi_aff_domain( + __isl_take isl_union_pw_multi_aff *upma); If the C argument of C is not C, then it is assigned the local space that lies at the basis of @@ -3381,6 +3409,9 @@ An expression can be printed using __isl_give isl_printer *isl_printer_print_pw_multi_aff( __isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma); + __isl_give isl_printer *isl_printer_print_union_pw_multi_aff( + __isl_take isl_printer *p, + __isl_keep isl_union_pw_multi_aff *upma); =head2 Points diff --git a/include/isl/aff.h b/include/isl/aff.h index 4ef0078..2e8ffef 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -7,6 +7,7 @@ #include #include #include +#include #if defined(__cplusplus) extern "C" { @@ -365,6 +366,36 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(isl_ctx *ctx, const char *str); void isl_pw_multi_aff_dump(__isl_keep isl_pw_multi_aff *pma); + +__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_empty( + __isl_take isl_space *space); +__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_copy( + __isl_keep isl_union_pw_multi_aff *upma); +void *isl_union_pw_multi_aff_free(__isl_take isl_union_pw_multi_aff *upma); + +__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_add_pw_multi_aff( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_pw_multi_aff *pma); + +isl_ctx *isl_union_pw_multi_aff_get_ctx( + __isl_keep isl_union_pw_multi_aff *upma); +__isl_give isl_space *isl_union_pw_multi_aff_get_space( + __isl_keep isl_union_pw_multi_aff *upma); + +int isl_union_pw_multi_aff_foreach_pw_multi_aff( + __isl_keep isl_union_pw_multi_aff *upma, + int (*fn)(__isl_take isl_pw_multi_aff *pma, void *user), void *user); + +__isl_give isl_union_set *isl_union_pw_multi_aff_domain( + __isl_take isl_union_pw_multi_aff *upma); + +__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_printer *isl_printer_print_union_pw_multi_aff( + __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma); + #if defined(__cplusplus) } #endif diff --git a/include/isl/aff_type.h b/include/isl/aff_type.h index 152eeb5..4be4d79 100644 --- a/include/isl/aff_type.h +++ b/include/isl/aff_type.h @@ -13,4 +13,7 @@ typedef struct isl_multi_aff isl_multi_aff; struct isl_pw_multi_aff; typedef struct isl_pw_multi_aff isl_pw_multi_aff; +struct isl_union_pw_multi_aff; +typedef struct isl_union_pw_multi_aff isl_union_pw_multi_aff; + #endif diff --git a/isl_aff.c b/isl_aff.c index ae72c2e..ccd2b42 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -12,7 +12,9 @@ */ #include +#define ISL_DIM_H #include +#include #include #include #include @@ -2316,6 +2318,18 @@ __isl_give isl_multi_aff *isl_multi_aff_drop_dims(__isl_take isl_multi_aff *maff #include +#undef UNION +#define UNION isl_union_pw_multi_aff +#undef PART +#define PART isl_pw_multi_aff +#undef PARTS +#define PARTS pw_multi_aff +#define ALIGN_DOMAIN + +#define NO_EVAL + +#include + static __isl_give isl_pw_multi_aff *pw_multi_aff_add( __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2) { diff --git a/isl_output.c b/isl_output.c index 1f6a01a..5e75ee9 100644 --- a/isl_output.c +++ b/isl_output.c @@ -2330,25 +2330,38 @@ error: return NULL; } -static __isl_give isl_printer *print_pw_multi_aff_isl(__isl_take isl_printer *p, - __isl_keep isl_pw_multi_aff *pma) +static __isl_give isl_printer *print_pw_multi_aff_body( + __isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma) { int i; if (!pma) goto error; - if (isl_space_dim(pma->dim, isl_dim_param) > 0) { - p = print_tuple(pma->dim, p, isl_dim_param, 0, NULL, NULL); - p = isl_printer_print_str(p, " -> "); - } - p = isl_printer_print_str(p, "{ "); for (i = 0; i < pma->n; ++i) { if (i) p = isl_printer_print_str(p, "; "); p = print_multi_aff(p, pma->p[i].maff); p = print_disjuncts((isl_map *)pma->p[i].set, p, 0); } + return p; +error: + isl_printer_free(p); + return NULL; +} + +static __isl_give isl_printer *print_pw_multi_aff_isl(__isl_take isl_printer *p, + __isl_keep isl_pw_multi_aff *pma) +{ + if (!pma) + goto error; + + if (isl_space_dim(pma->dim, isl_dim_param) > 0) { + p = print_tuple(pma->dim, p, isl_dim_param, 0, NULL, NULL); + p = isl_printer_print_str(p, " -> "); + } + p = isl_printer_print_str(p, "{ "); + p = print_pw_multi_aff_body(p, pma); p = isl_printer_print_str(p, " }"); return p; error: @@ -2420,3 +2433,54 @@ error: isl_printer_free(p); return NULL; } + +static int print_pw_multi_aff_body_wrap(__isl_take isl_pw_multi_aff *pma, + void *user) +{ + struct isl_union_print_data *data; + data = (struct isl_union_print_data *) user; + + if (!data->first) + data->p = isl_printer_print_str(data->p, "; "); + data->first = 0; + + data->p = print_pw_multi_aff_body(data->p, pma); + isl_pw_multi_aff_free(pma); + + return 0; +} + +static __isl_give isl_printer *print_union_pw_multi_aff_isl( + __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma) +{ + struct isl_union_print_data data = { p, 1 }; + isl_space *space; + + space = isl_union_pw_multi_aff_get_space(upma); + if (isl_space_dim(space, isl_dim_param) > 0) { + p = print_tuple(space, p, isl_dim_param, 0, NULL, NULL); + p = isl_printer_print_str(p, s_to[0]); + } + isl_space_free(space); + p = isl_printer_print_str(p, s_open_set[0]); + isl_union_pw_multi_aff_foreach_pw_multi_aff(upma, + &print_pw_multi_aff_body_wrap, &data); + p = data.p; + p = isl_printer_print_str(p, s_close_set[0]); + return p; +} + +__isl_give isl_printer *isl_printer_print_union_pw_multi_aff( + __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma) +{ + if (!p || !upma) + goto error; + + if (p->output_format == ISL_FORMAT_ISL) + return print_union_pw_multi_aff_isl(p, upma); + isl_die(p->ctx, isl_error_unsupported, "unsupported output format", + goto error); +error: + isl_printer_free(p); + return NULL; +} diff --git a/isl_union_templ.c b/isl_union_templ.c index 2aaa7ff..dce36c0 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -613,6 +613,7 @@ __isl_give UNION *FN(UNION,gist)(__isl_take UNION *u, return match_domain_op(u, uset, &FN(PW,gist)); } +#ifndef NO_EVAL __isl_give isl_qpolynomial *FN(UNION,eval)(__isl_take UNION *u, __isl_take isl_point *pnt) { @@ -646,6 +647,7 @@ error: isl_point_free(pnt); return NULL; } +#endif static int coalesce_entry(void **entry, void *user) { diff --git a/print.c b/print.c index 4e0aecd..c64961e 100644 --- a/print.c +++ b/print.c @@ -75,3 +75,6 @@ #undef BASE #define BASE pw_multi_aff #include +#undef BASE +#define BASE union_pw_multi_aff +#include -- 2.7.4