X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_output.c;h=a1feb7f68455969920b4be2caa9d583023f39f66;hb=ca90b151a05f17ccc1c3215ff24dc5d7b9198ff4;hp=98c26477c37b7b93ddf49d8268e63b704ca70d72;hpb=3d0da01fea8d99341310e4ea891e912ffd80ebfa;p=platform%2Fupstream%2Fisl.git diff --git a/isl_output.c b/isl_output.c index 98c2647..a1feb7f 100644 --- a/isl_output.c +++ b/isl_output.c @@ -2,7 +2,7 @@ * Copyright 2008-2009 Katholieke Universiteit Leuven * Copyright 2010 INRIA Saclay * - * Use of this software is governed by the GNU LGPLv2.1 license + * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, K.U.Leuven, Departement * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium @@ -24,6 +24,7 @@ #include #include #include +#include static const char *s_to[2] = { " -> ", " \\to " }; static const char *s_and[2] = { " and ", " \\wedge " }; @@ -565,17 +566,6 @@ static __isl_give isl_printer *basic_map_print_omega( return p; } -static __isl_give isl_printer *isl_basic_map_print_omega( - __isl_keep isl_basic_map *bmap, __isl_take isl_printer *p) -{ - p = print_omega_parameters(bmap->dim, p); - - p = isl_printer_start_line(p); - p = basic_map_print_omega(bmap, p); - p = isl_printer_end_line(p); - return p; -} - static __isl_give isl_printer *basic_set_print_omega( __isl_keep isl_basic_set *bset, __isl_take isl_printer *p) { @@ -587,31 +577,16 @@ static __isl_give isl_printer *basic_set_print_omega( return p; } -static __isl_give isl_printer *isl_basic_set_print_omega( - __isl_keep isl_basic_set *bset, __isl_take isl_printer *p) -{ - p = print_omega_parameters(bset->dim, p); - - p = isl_printer_start_line(p); - p = basic_set_print_omega(bset, p); - p = isl_printer_end_line(p); - return p; -} - static __isl_give isl_printer *isl_map_print_omega(__isl_keep isl_map *map, __isl_take isl_printer *p) { int i; - p = print_omega_parameters(map->dim, p); - - p = isl_printer_start_line(p); for (i = 0; i < map->n; ++i) { if (i) p = isl_printer_print_str(p, " union "); p = basic_map_print_omega(map->p[i], p); } - p = isl_printer_end_line(p); return p; } @@ -620,15 +595,11 @@ static __isl_give isl_printer *isl_set_print_omega(__isl_keep isl_set *set, { int i; - p = print_omega_parameters(set->dim, p); - - p = isl_printer_start_line(p); for (i = 0; i < set->n; ++i) { if (i) p = isl_printer_print_str(p, " union "); p = basic_set_print_omega(set->p[i], p); } - p = isl_printer_end_line(p); return p; } @@ -955,7 +926,7 @@ __isl_give isl_printer *isl_printer_print_basic_map(__isl_take isl_printer *p, if (p->output_format == ISL_FORMAT_ISL) return isl_basic_map_print_isl(bmap, p, 0); else if (p->output_format == ISL_FORMAT_OMEGA) - return isl_basic_map_print_omega(bmap, p); + return basic_map_print_omega(bmap, p); isl_assert(bmap->ctx, 0, goto error); error: isl_printer_free(p); @@ -995,7 +966,7 @@ __isl_give isl_printer *isl_printer_print_basic_set(__isl_take isl_printer *p, else if (p->output_format == ISL_FORMAT_POLYLIB_CONSTRAINTS) return bset_print_constraints_polylib(bset, p); else if (p->output_format == ISL_FORMAT_OMEGA) - return isl_basic_set_print_omega(bset, p); + return basic_set_print_omega(bset, p); isl_assert(p->ctx, 0, goto error); error: isl_printer_free(p); @@ -1648,10 +1619,22 @@ static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p, return print_partial_affine_c(p, dim, bset, c, len); } +/* We skip the constraint if it is implied by the div expression. + */ static __isl_give isl_printer *print_constraint_c(__isl_take isl_printer *p, __isl_keep isl_space *dim, __isl_keep isl_basic_set *bset, isl_int *c, const char *op, int first) { + unsigned o_div; + unsigned n_div; + int div; + + o_div = isl_basic_set_offset(bset, isl_dim_div); + n_div = isl_basic_set_dim(bset, isl_dim_div); + div = isl_seq_last_non_zero(c + o_div, n_div); + if (div >= 0 && isl_basic_set_is_div_constraint(bset, c, div)) + return p; + if (!first) p = isl_printer_print_str(p, " && "); @@ -1697,6 +1680,9 @@ static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p, { int i; + if (!set) + return isl_printer_free(p); + if (set->n == 0) p = isl_printer_print_str(p, "0"); @@ -1956,8 +1942,8 @@ error: return NULL; } -__isl_give isl_printer *isl_printer_print_space(__isl_take isl_printer *p, - __isl_keep isl_space *dim) +static __isl_give isl_printer *isl_printer_print_space_isl( + __isl_take isl_printer *p, __isl_keep isl_space *dim) { if (!dim) goto error; @@ -1980,6 +1966,21 @@ error: return NULL; } +__isl_give isl_printer *isl_printer_print_space(__isl_take isl_printer *p, + __isl_keep isl_space *space) +{ + if (!p || !space) + return isl_printer_free(p); + if (p->output_format == ISL_FORMAT_ISL) + return isl_printer_print_space_isl(p, space); + else if (p->output_format == ISL_FORMAT_OMEGA) + return print_omega_parameters(space, p); + + isl_die(isl_space_get_ctx(space), isl_error_unsupported, + "output format not supported for space", + return isl_printer_free(p)); +} + __isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p, __isl_keep isl_local_space *ls) { @@ -2189,35 +2190,82 @@ static __isl_give isl_printer *print_aff_c(__isl_take isl_printer *p, unsigned total; total = isl_local_space_dim(aff->ls, isl_dim_all); - p = isl_printer_print_str(p, "("); + if (!isl_int_is_one(aff->v->el[0])) + p = isl_printer_print_str(p, "("); p = print_ls_partial_affine_c(p, aff->ls, aff->v->el + 1, 1 + total); - if (isl_int_is_one(aff->v->el[0])) - p = isl_printer_print_str(p, ")"); - else { + if (!isl_int_is_one(aff->v->el[0])) { p = isl_printer_print_str(p, ")/"); p = isl_printer_print_isl_int(p, aff->v->el[0]); } return p; } +/* Print the affine expression "aff" in C format to "p". + * The dimension names are taken from "space" + * "set" represents the domain of the affine expression. + */ +static __isl_give isl_printer *print_aff_on_domain_c(__isl_take isl_printer *p, + __isl_keep isl_space *space, __isl_keep isl_aff *aff, + __isl_keep isl_set *set) +{ + isl_set *u; + isl_ast_build *build; + isl_ast_expr *expr; + + u = isl_set_universe(isl_space_copy(space)); + build = isl_ast_build_from_context(u); + build = isl_ast_build_restrict(build, isl_set_copy(set)); + expr = isl_ast_expr_from_aff(isl_aff_copy(aff), build); + p = isl_printer_print_ast_expr(p, expr); + isl_ast_expr_free(expr); + isl_ast_build_free(build); + + return p; +} + +/* In the C format, we cannot express that "pwaff" may be undefined + * on parts of the domain space. We therefore assume that the expression + * will only be evaluated on its definition domain and compute the gist + * of each cell with respect to this domain. + */ static __isl_give isl_printer *print_pw_aff_c(__isl_take isl_printer *p, __isl_keep isl_pw_aff *pwaff) { int i; + isl_set *domain; + isl_space *space; if (pwaff->n < 1) isl_die(p->ctx, isl_error_unsupported, "cannot print empty isl_pw_aff in C format", goto error); + space = isl_pw_aff_get_domain_space(pwaff); + if (!space) + goto error; + + domain = isl_pw_aff_domain(isl_pw_aff_copy(pwaff)); for (i = 0; i < pwaff->n - 1; ++i) { + isl_set *set_i; + p = isl_printer_print_str(p, "("); - p = print_set_c(p, pwaff->dim, pwaff->p[i].set); + + set_i = isl_set_copy(pwaff->p[i].set); + set_i = isl_set_gist(set_i, isl_set_copy(domain)); + p = print_set_c(p, space, set_i); + isl_set_free(set_i); + p = isl_printer_print_str(p, ") ? ("); - p = print_aff_c(p, pwaff->p[i].aff); + p = print_aff_on_domain_c(p, space, + pwaff->p[i].aff, pwaff->p[i].set); p = isl_printer_print_str(p, ") : "); } - return print_aff_c(p, pwaff->p[pwaff->n - 1].aff); + isl_set_free(domain); + + p = print_aff_on_domain_c(p, space, pwaff->p[pwaff->n - 1].aff, + pwaff->p[pwaff->n - 1].set); + isl_space_free(space); + return p; error: isl_printer_free(p); return NULL; @@ -2296,3 +2344,188 @@ error: isl_printer_free(p); return NULL; } + +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; + + 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: + isl_printer_free(p); + return NULL; +} + +static __isl_give isl_printer *print_unnamed_pw_multi_aff_c( + __isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma) +{ + int i; + + for (i = 0; i < pma->n - 1; ++i) { + p = isl_printer_print_str(p, "("); + p = print_set_c(p, pma->dim, pma->p[i].set); + p = isl_printer_print_str(p, ") ? ("); + p = print_aff_c(p, pma->p[i].maff->p[0]); + p = isl_printer_print_str(p, ") : "); + } + + return print_aff_c(p, pma->p[pma->n - 1].maff->p[0]); +} + +static __isl_give isl_printer *print_pw_multi_aff_c(__isl_take isl_printer *p, + __isl_keep isl_pw_multi_aff *pma) +{ + int n; + const char *name; + + if (!pma) + goto error; + if (pma->n < 1) + isl_die(p->ctx, isl_error_unsupported, + "cannot print empty isl_pw_multi_aff in C format", + goto error); + name = isl_pw_multi_aff_get_tuple_name(pma, isl_dim_out); + if (!name && isl_pw_multi_aff_dim(pma, isl_dim_out) == 1) + return print_unnamed_pw_multi_aff_c(p, pma); + if (!name) + isl_die(p->ctx, isl_error_unsupported, + "cannot print unnamed isl_pw_multi_aff in C format", + goto error); + + p = isl_printer_print_str(p, name); + n = isl_pw_multi_aff_dim(pma, isl_dim_out); + if (n != 0) + isl_die(p->ctx, isl_error_unsupported, + "not supported yet", goto error); + + return p; +error: + isl_printer_free(p); + return NULL; +} + +__isl_give isl_printer *isl_printer_print_pw_multi_aff( + __isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma) +{ + if (!p || !pma) + goto error; + + if (p->output_format == ISL_FORMAT_ISL) + return print_pw_multi_aff_isl(p, pma); + if (p->output_format == ISL_FORMAT_C) + return print_pw_multi_aff_c(p, pma); + isl_die(p->ctx, isl_error_unsupported, "unsupported output format", + goto error); +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; +} + +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)); +}