From 10aa3b971daf48c941794844fa1187d00b5b68d1 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 16 Apr 2012 17:27:00 +0200 Subject: [PATCH] add isl_multi_aff_identity Signed-off-by: Sven Verdoolaege --- doc/user.pod | 2 ++ include/isl/aff.h | 1 + isl_aff.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index d07cef9..1f5e0b4 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3354,6 +3354,8 @@ 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_aff *isl_multi_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); diff --git a/include/isl/aff.h b/include/isl/aff.h index faeb957..b4a2808 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -248,6 +248,7 @@ __isl_give isl_set *isl_pw_aff_list_gt_set(__isl_take isl_pw_aff_list *list1, __isl_take isl_pw_aff_list *list2); __isl_give isl_multi_aff *isl_multi_aff_zero(__isl_take isl_space *space); +__isl_give isl_multi_aff *isl_multi_aff_identity(__isl_take isl_space *space); isl_ctx *isl_multi_aff_get_ctx(__isl_keep isl_multi_aff *maff); __isl_give isl_space *isl_multi_aff_get_space(__isl_keep isl_multi_aff *maff); diff --git a/isl_aff.c b/isl_aff.c index 85e4953..b29d29f 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -2173,6 +2173,57 @@ __isl_give isl_multi_aff *isl_multi_aff_zero(__isl_take isl_space *space) return ma; } +/* Create an isl_multi_aff in the given space that maps each + * input dimension to the corresponding output dimension. + */ +__isl_give isl_multi_aff *isl_multi_aff_identity(__isl_take isl_space *space) +{ + int n; + isl_multi_aff *ma; + + if (!space) + return NULL; + + if (isl_space_is_set(space)) + isl_die(isl_space_get_ctx(space), isl_error_invalid, + "expecting map space", goto error); + + n = isl_space_dim(space, isl_dim_out); + if (n != isl_space_dim(space, isl_dim_in)) + isl_die(isl_space_get_ctx(space), isl_error_invalid, + "number of input and output dimensions needs to be " + "the same", goto error); + + ma = isl_multi_aff_alloc(isl_space_copy(space)); + + if (!n) + isl_space_free(space); + else { + int i; + isl_local_space *ls; + isl_aff *aff; + + space = isl_space_domain(space); + ls = isl_local_space_from_space(space); + aff = isl_aff_zero_on_domain(ls); + + for (i = 0; i < n; ++i) { + isl_aff *aff_i; + aff_i = isl_aff_copy(aff); + aff_i = isl_aff_add_coefficient_si(aff_i, + isl_dim_in, i, 1); + ma = isl_multi_aff_set_aff(ma, i, aff_i); + } + + isl_aff_free(aff); + } + + return ma; +error: + isl_space_free(space); + return NULL; +} + /* Create an isl_pw_multi_aff with the given isl_multi_aff on a universe * domain. */ -- 2.7.4