add isl_multi_aff_identity
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 16 Apr 2012 15:27:00 +0000 (17:27 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 2 Aug 2012 10:20:08 +0000 (12:20 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index d07cef9..1f5e0b4 100644 (file)
@@ -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);
index faeb957..b4a2808 100644 (file)
@@ -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);
index 85e4953..b29d29f 100644 (file)
--- 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.
  */