From b62bd7ab74977403487a24e232aba8f121a27d85 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 16 Jul 2012 12:39:41 +0200 Subject: [PATCH] add isl_multi_pw_aff Signed-off-by: Sven Verdoolaege --- doc/user.pod | 38 +++++++++++++++++++++++++++++++++++++- include/isl/aff.h | 31 +++++++++++++++++++++++++++++++ include/isl/aff_type.h | 3 +++ include/isl/multi.h | 1 + isl_aff.c | 5 +++++ isl_aff_private.h | 5 +++++ isl_output.c | 30 ++++++++++++++++++++++++++++++ print.c | 3 +++ 8 files changed, 115 insertions(+), 1 deletion(-) diff --git a/doc/user.pod b/doc/user.pod index 7e00955b..9823d99a 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -746,6 +746,10 @@ of the original object. __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); + __isl_give isl_space *isl_multi_pw_aff_get_domain_space( + __isl_keep isl_multi_pw_aff *mpa); + __isl_give isl_space *isl_multi_pw_aff_get_space( + __isl_keep isl_multi_pw_aff *mpa); #include __isl_give isl_space *isl_point_get_space( @@ -3578,14 +3582,18 @@ An expression can be printed using An C object represents a sequence of zero or more affine expressions, all defined on the same domain space. +Similarly, an C object represents a sequence of +zero or more piecewise affine expressions. An C can be constructed from a single C or an C using the -following functions. +following functions. Similarly for C. #include __isl_give isl_multi_aff *isl_multi_aff_from_aff( __isl_take isl_aff *aff); + __isl_give isl_multi_pw_aff *isl_multi_pw_aff_from_pw_aff( + __isl_take isl_pw_aff *pa); __isl_give isl_multi_aff *isl_multi_aff_from_aff_list( __isl_take isl_space *space, __isl_take isl_aff_list *list); @@ -3604,10 +3612,14 @@ can be created using the following functions. __isl_take isl_space *space); __isl_give isl_multi_aff *isl_multi_aff_zero( __isl_take isl_space *space); + __isl_give isl_multi_pw_aff *isl_multi_pw_aff_zero( + __isl_take isl_space *space); __isl_give isl_multi_aff *isl_multi_aff_identity( __isl_take isl_space *space); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_identity( __isl_take isl_space *space); + __isl_give isl_multi_pw_aff *isl_multi_pw_aff_identity( + __isl_take isl_space *space); __isl_give isl_pw_multi_aff * isl_pw_multi_aff_from_multi_aff( __isl_take isl_multi_aff *ma); @@ -3655,6 +3667,11 @@ Multiple quasi affine expressions can be copied and freed using void *isl_union_pw_multi_aff_free( __isl_take isl_union_pw_multi_aff *upma); + __isl_give isl_multi_pw_aff *isl_multi_pw_aff_copy( + __isl_keep isl_multi_pw_aff *mpa); + void *isl_multi_pw_aff_free( + __isl_take isl_multi_pw_aff *mpa); + The expression can be inspected using #include @@ -3664,15 +3681,22 @@ The expression can be inspected using __isl_keep isl_pw_multi_aff *pma); isl_ctx *isl_union_pw_multi_aff_get_ctx( __isl_keep isl_union_pw_multi_aff *upma); + isl_ctx *isl_multi_pw_aff_get_ctx( + __isl_keep isl_multi_pw_aff *mpa); unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff, enum isl_dim_type type); unsigned isl_pw_multi_aff_dim( __isl_keep isl_pw_multi_aff *pma, enum isl_dim_type type); + unsigned isl_multi_pw_aff_dim( + __isl_keep isl_multi_pw_aff *mpa, + enum isl_dim_type type); __isl_give isl_aff *isl_multi_aff_get_aff( __isl_keep isl_multi_aff *multi, int pos); __isl_give isl_pw_aff *isl_pw_multi_aff_get_pw_aff( __isl_keep isl_pw_multi_aff *pma, int pos); + __isl_give isl_pw_aff *isl_multi_pw_aff_get_pw_aff( + __isl_keep isl_multi_pw_aff *mpa, int pos); const char *isl_pw_multi_aff_get_dim_name( __isl_keep isl_pw_multi_aff *pma, enum isl_dim_type type, unsigned pos); @@ -3725,6 +3749,11 @@ It can be modified using __isl_take isl_pw_multi_aff *pma, enum isl_dim_type type, __isl_take isl_id *id); + __isl_give isl_multi_pw_aff * + isl_multi_pw_aff_set_dim_name( + __isl_take isl_multi_pw_aff *mpa, + enum isl_dim_type type, unsigned pos, const char *s); + __isl_give isl_multi_aff *isl_multi_aff_drop_dims( __isl_take isl_multi_aff *maff, enum isl_dim_type type, unsigned first, unsigned n); @@ -3818,6 +3847,10 @@ Operations include isl_union_pw_multi_aff_flat_range_product( __isl_take isl_union_pw_multi_aff *upma1, __isl_take isl_union_pw_multi_aff *upma2); + __isl_give isl_multi_pw_aff * + isl_multi_pw_aff_flat_range_product( + __isl_take isl_multi_pw_aff *mpa1, + __isl_take isl_multi_pw_aff *mpa2); If the C argument of C is not C, then it is assigned the local space that lies at the basis of @@ -3855,6 +3888,9 @@ An expression can be printed using __isl_give isl_printer *isl_printer_print_union_pw_multi_aff( __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma); + __isl_give isl_printer *isl_printer_print_multi_pw_aff( + __isl_take isl_printer *p, + __isl_keep isl_multi_pw_aff *mpa); =head2 Points diff --git a/include/isl/aff.h b/include/isl/aff.h index 08b75b97..bfd2f5f5 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -475,6 +475,37 @@ __isl_give isl_union_map *isl_union_map_from_union_pw_multi_aff( __isl_give isl_printer *isl_printer_print_union_pw_multi_aff( __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma); +__isl_give isl_multi_pw_aff *isl_multi_pw_aff_zero(__isl_take isl_space *space); +__isl_give isl_multi_pw_aff *isl_multi_pw_aff_identity( + __isl_take isl_space *space); +__isl_give isl_multi_pw_aff *isl_multi_pw_aff_from_pw_aff( + __isl_take isl_pw_aff *pa); + +isl_ctx *isl_multi_pw_aff_get_ctx(__isl_keep isl_multi_pw_aff *mpa); +__isl_give isl_space *isl_multi_pw_aff_get_space( + __isl_keep isl_multi_pw_aff *mpa); +__isl_give isl_space *isl_multi_pw_aff_get_domain_space( + __isl_keep isl_multi_pw_aff *mpa); +__isl_give isl_multi_pw_aff *isl_multi_pw_aff_copy( + __isl_keep isl_multi_pw_aff *mpa); +void *isl_multi_pw_aff_free(__isl_take isl_multi_pw_aff *mpa); + +unsigned isl_multi_pw_aff_dim(__isl_keep isl_multi_pw_aff *mpa, + enum isl_dim_type type); +__isl_give isl_pw_aff *isl_multi_pw_aff_get_pw_aff( + __isl_keep isl_multi_pw_aff *mpa, int pos); + +__isl_give isl_multi_pw_aff *isl_multi_pw_aff_set_dim_name( + __isl_take isl_multi_pw_aff *mpa, + enum isl_dim_type type, unsigned pos, const char *s); + +__isl_give isl_multi_pw_aff *isl_multi_pw_aff_flat_range_product( + __isl_take isl_multi_pw_aff *mpa1, __isl_take isl_multi_pw_aff *mpa2); + +__isl_give isl_printer *isl_printer_print_multi_pw_aff( + __isl_take isl_printer *p, __isl_keep isl_multi_pw_aff *mpa); +void isl_multi_pw_aff_dump(__isl_keep isl_multi_pw_aff *mpa); + #if defined(__cplusplus) } #endif diff --git a/include/isl/aff_type.h b/include/isl/aff_type.h index 4be4d79f..e5308c70 100644 --- a/include/isl/aff_type.h +++ b/include/isl/aff_type.h @@ -16,4 +16,7 @@ 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; +struct isl_multi_pw_aff; +typedef struct isl_multi_pw_aff isl_multi_pw_aff; + #endif diff --git a/include/isl/multi.h b/include/isl/multi.h index 31de5719..31b7acaf 100644 --- a/include/isl/multi.h +++ b/include/isl/multi.h @@ -17,6 +17,7 @@ __isl_give isl_multi_##BASE *isl_multi_##BASE##_set_##BASE( \ __isl_take isl_##BASE *el); ISL_DECLARE_MULTI(aff) +ISL_DECLARE_MULTI(pw_aff) #if defined(__cplusplus) } diff --git a/isl_aff.c b/isl_aff.c index 9ad26d6d..657b863d 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -3817,3 +3817,8 @@ error: isl_pw_aff_free(pa); return NULL; } + +#undef BASE +#define BASE pw_aff + +#include diff --git a/isl_aff_private.h b/isl_aff_private.h index 06ee1ebc..770b73b9 100644 --- a/isl_aff_private.h +++ b/isl_aff_private.h @@ -99,4 +99,9 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_substitute( __isl_take isl_pw_multi_aff *pma, enum isl_dim_type type, unsigned pos, __isl_keep isl_pw_aff *subs); +#undef BASE +#define BASE pw_aff + +#include + #endif diff --git a/isl_output.c b/isl_output.c index 702a7f71..35c7cd36 100644 --- a/isl_output.c +++ b/isl_output.c @@ -2484,3 +2484,33 @@ error: isl_printer_free(p); return NULL; } + +static __isl_give isl_printer *print_multi_pw_aff_isl(__isl_take isl_printer *p, + __isl_keep isl_multi_pw_aff *mpa) +{ + int i; + + if (!mpa) + return isl_printer_free(p); + + p = isl_printer_print_str(p, "("); + for (i = 0; i < mpa->n; ++i) { + if (i) + p = isl_printer_print_str(p, ","); + p = isl_printer_print_pw_aff(p, mpa->p[i]); + } + p = isl_printer_print_str(p, ")"); + return p; +} + +__isl_give isl_printer *isl_printer_print_multi_pw_aff( + __isl_take isl_printer *p, __isl_keep isl_multi_pw_aff *mpa) +{ + if (!p || !mpa) + return isl_printer_free(p); + + if (p->output_format == ISL_FORMAT_ISL) + return print_multi_pw_aff_isl(p, mpa); + isl_die(p->ctx, isl_error_unsupported, "unsupported output format", + return isl_printer_free(p)); +} diff --git a/print.c b/print.c index 90e0deb8..abd8ad4b 100644 --- a/print.c +++ b/print.c @@ -79,5 +79,8 @@ #define BASE union_pw_multi_aff #include #undef BASE +#define BASE multi_pw_aff +#include +#undef BASE #define BASE point #include -- 2.11.4.GIT