isl_arg_parse: always print help option
[platform/upstream/isl.git] / isl_output.c
index c5a1a53..05f36eb 100644 (file)
 
 #include <stdlib.h>
 #include <string.h>
-#include <isl_set.h>
-#include <isl_seq.h>
+#include <isl/set.h>
+#include <isl/seq.h>
 #include <isl_polynomial_private.h>
 #include <isl_printer_private.h>
 #include <isl_dim_private.h>
 #include <isl_map_private.h>
 #include <isl_mat_private.h>
-#include <isl_union_map.h>
+#include <isl/union_map.h>
 
 static const char *s_to[2] = { " -> ", " \\to " };
 static const char *s_and[2] = { " and ", " \\wedge " };
@@ -93,25 +93,39 @@ static __isl_give isl_printer *bset_print_constraints_polylib(
 }
 
 static __isl_give isl_printer *isl_basic_map_print_polylib(
-       __isl_keep isl_basic_map *bmap, __isl_take isl_printer *p)
+       __isl_keep isl_basic_map *bmap, __isl_take isl_printer *p, int ext)
 {
        unsigned total = isl_basic_map_total_dim(bmap);
        p = isl_printer_start_line(p);
        p = isl_printer_print_int(p, bmap->n_eq + bmap->n_ineq);
        p = isl_printer_print_str(p, " ");
        p = isl_printer_print_int(p, 1 + total + 1);
+       if (ext) {
+               p = isl_printer_print_str(p, " ");
+               p = isl_printer_print_int(p,
+                                   isl_basic_map_dim(bmap, isl_dim_out));
+               p = isl_printer_print_str(p, " ");
+               p = isl_printer_print_int(p,
+                                   isl_basic_map_dim(bmap, isl_dim_in));
+               p = isl_printer_print_str(p, " ");
+               p = isl_printer_print_int(p,
+                                   isl_basic_map_dim(bmap, isl_dim_div));
+               p = isl_printer_print_str(p, " ");
+               p = isl_printer_print_int(p,
+                                   isl_basic_map_dim(bmap, isl_dim_param));
+       }
        p = isl_printer_end_line(p);
        return print_constraints_polylib(bmap, p);
 }
 
 static __isl_give isl_printer *isl_basic_set_print_polylib(
-       __isl_keep isl_basic_set *bset, __isl_take isl_printer *p)
+       __isl_keep isl_basic_set *bset, __isl_take isl_printer *p, int ext)
 {
-       return isl_basic_map_print_polylib((struct isl_basic_map *)bset, p);
+       return isl_basic_map_print_polylib((struct isl_basic_map *)bset, p, ext);
 }
 
 static __isl_give isl_printer *isl_map_print_polylib(__isl_keep isl_map *map,
-       __isl_take isl_printer *p)
+       __isl_take isl_printer *p, int ext)
 {
        int i;
 
@@ -121,15 +135,15 @@ static __isl_give isl_printer *isl_map_print_polylib(__isl_keep isl_map *map,
        for (i = 0; i < map->n; ++i) {
                p = isl_printer_start_line(p);
                p = isl_printer_end_line(p);
-               p = isl_basic_map_print_polylib(map->p[i], p);
+               p = isl_basic_map_print_polylib(map->p[i], p, ext);
        }
        return p;
 }
 
 static __isl_give isl_printer *isl_set_print_polylib(__isl_keep isl_set *set,
-       __isl_take isl_printer *p)
+       __isl_take isl_printer *p, int ext)
 {
-       return isl_map_print_polylib((struct isl_map *)set, p);
+       return isl_map_print_polylib((struct isl_map *)set, p, ext);
 }
 
 static int count_same_name(__isl_keep isl_dim *dim,
@@ -205,26 +219,41 @@ static enum isl_dim_type pos2type(__isl_keep isl_dim *dim, unsigned *pos)
        return type;
 }
 
+static __isl_give isl_printer *print_div(__isl_keep isl_dim *dim,
+       __isl_keep isl_mat *div, int pos, __isl_take isl_printer *p);
+
 static __isl_give isl_printer *print_term(__isl_keep isl_dim *dim,
+       __isl_keep isl_mat *div,
        isl_int c, unsigned pos, __isl_take isl_printer *p, int set, int latex)
 {
        enum isl_dim_type type;
+       int print_div_def;
 
        if (pos == 0)
                return isl_printer_print_isl_int(p, c);
 
+       type = pos2type(dim, &pos);
+       print_div_def = type == isl_dim_div && div &&
+                       !isl_int_is_zero(div->row[pos][0]);
+
        if (isl_int_is_one(c))
                ;
        else if (isl_int_is_negone(c))
                p = isl_printer_print_str(p, "-");
-       else
+       else {
                p = isl_printer_print_isl_int(p, c);
-       type = pos2type(dim, &pos);
-       p = print_name(dim, p, type, pos, set, latex);
+               if (p->output_format == ISL_FORMAT_C || print_div_def)
+                       p = isl_printer_print_str(p, "*");
+       }
+       if (print_div_def)
+               p = print_div(dim, div, pos, p);
+       else
+               p = print_name(dim, p, type, pos, set, latex);
        return p;
 }
 
 static __isl_give isl_printer *print_affine_of_len(__isl_keep isl_dim *dim,
+       __isl_keep isl_mat *div,
        __isl_take isl_printer *p, isl_int *c, int len, int set)
 {
        int i;
@@ -243,7 +272,7 @@ static __isl_give isl_printer *print_affine_of_len(__isl_keep isl_dim *dim,
                                p = isl_printer_print_str(p, " + ");
                }
                first = 0;
-               p = print_term(dim, c[i], i, p, set, 0);
+               p = print_term(dim, div, c[i], i, p, set, 0);
                if (flip)
                        isl_int_neg(c[i], c[i]);
        }
@@ -256,7 +285,7 @@ static __isl_give isl_printer *print_affine(__isl_keep isl_basic_map *bmap,
        __isl_keep isl_dim *dim, __isl_take isl_printer *p, isl_int *c, int set)
 {
        unsigned len = 1 + isl_basic_map_total_dim(bmap);
-       return print_affine_of_len(dim, p, c, len, set);
+       return print_affine_of_len(dim, NULL, p, c, len, set);
 }
 
 static int defining_equality(__isl_keep isl_basic_map *eq,
@@ -301,7 +330,8 @@ static __isl_give isl_printer *print_nested_var_list(__isl_take isl_printer *p,
                if (j >= 0) {
                        int pos = 1 + isl_dim_offset(global_dim, global_type)
                                    + offset + i;
-                       p = print_affine_of_len(eq->dim, p, eq->eq[j], pos, set);
+                       p = print_affine_of_len(eq->dim, NULL,
+                                               p, eq->eq[j], pos, set);
                } else {
                        p = print_name(global_dim, p, global_type, offset + i,
                                        set, latex);
@@ -416,7 +446,7 @@ static __isl_give isl_printer *print_constraint(struct isl_basic_map *bmap,
 
        isl_int_abs(c[last], c[last]);
 
-       p = print_term(dim, c[last], last, p, set, latex);
+       p = print_term(dim, NULL, c[last], last, p, set, latex);
 
        p = isl_printer_print_str(p, " ");
        p = isl_printer_print_str(p, op);
@@ -932,7 +962,9 @@ __isl_give isl_printer *isl_printer_print_basic_set(__isl_take isl_printer *p,
        if (p->output_format == ISL_FORMAT_ISL)
                return isl_basic_set_print_isl(bset, p, 0);
        else if (p->output_format == ISL_FORMAT_POLYLIB)
-               return isl_basic_set_print_polylib(bset, p);
+               return isl_basic_set_print_polylib(bset, p, 0);
+       else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
+               return isl_basic_set_print_polylib(bset, p, 1);
        else if (p->output_format == ISL_FORMAT_POLYLIB_CONSTRAINTS)
                return bset_print_constraints_polylib(bset, p);
        else if (p->output_format == ISL_FORMAT_OMEGA)
@@ -969,7 +1001,9 @@ __isl_give isl_printer *isl_printer_print_set(__isl_take isl_printer *p,
        if (p->output_format == ISL_FORMAT_ISL)
                return isl_map_print_isl((isl_map *)set, p, 1);
        else if (p->output_format == ISL_FORMAT_POLYLIB)
-               return isl_set_print_polylib(set, p);
+               return isl_set_print_polylib(set, p, 0);
+       else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
+               return isl_set_print_polylib(set, p, 1);
        else if (p->output_format == ISL_FORMAT_OMEGA)
                return isl_set_print_omega(set, p);
        else if (p->output_format == ISL_FORMAT_LATEX)
@@ -1005,7 +1039,9 @@ __isl_give isl_printer *isl_printer_print_map(__isl_take isl_printer *p,
        if (p->output_format == ISL_FORMAT_ISL)
                return isl_map_print_isl(map, p, 0);
        else if (p->output_format == ISL_FORMAT_POLYLIB)
-               return isl_map_print_polylib(map, p);
+               return isl_map_print_polylib(map, p, 0);
+       else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
+               return isl_map_print_polylib(map, p, 1);
        else if (p->output_format == ISL_FORMAT_OMEGA)
                return isl_map_print_omega(map, p);
        else if (p->output_format == ISL_FORMAT_LATEX)
@@ -1207,7 +1243,8 @@ static __isl_give isl_printer *print_div(__isl_keep isl_dim *dim,
 {
        int c = p->output_format == ISL_FORMAT_C;
        p = isl_printer_print_str(p, c ? "floord(" : "[(");
-       p = print_affine_of_len(dim, p, div->row[pos] + 1, div->n_col - 1, 1);
+       p = print_affine_of_len(dim, div, p,
+                               div->row[pos] + 1, div->n_col - 1, 1);
        p = isl_printer_print_str(p, c ? ", " : ")/");
        p = isl_printer_print_isl_int(p, div->row[pos][0]);
        p = isl_printer_print_str(p, c ? ")" : "]");
@@ -1253,7 +1290,7 @@ static __isl_give isl_printer *print_base(__isl_take isl_printer *p,
 
        total = isl_dim_total(dim);
        if (var < total)
-               p = print_term(dim, dim->ctx->one, 1 + var, p, 1, 0);
+               p = print_term(dim, NULL, dim->ctx->one, 1 + var, p, 1, 0);
        else
                p = print_div(dim, div, var - total, p);
        return p;
@@ -1414,8 +1451,8 @@ static __isl_give isl_printer *isl_pwqp_print_isl_body(
        for (i = 0; i < pwqp->n; ++i) {
                if (i)
                        p = isl_printer_print_str(p, "; ");
-               if (isl_dim_size(pwqp->p[i].set->dim, isl_dim_set) > 0 ||
-                   isl_dim_get_tuple_name(pwqp->p[i].set->dim, isl_dim_set)) {
+               if (isl_dim_size(pwqp->dim, isl_dim_set) > 0 ||
+                   isl_dim_is_named_or_nested(pwqp->dim, isl_dim_set)) {
                        p = print_dim(pwqp->p[i].set->dim, p, 1, 0, NULL);
                        p = isl_printer_print_str(p, " -> ");
                }
@@ -1438,7 +1475,8 @@ static __isl_give isl_printer *print_pw_qpolynomial_isl(
        }
        p = isl_printer_print_str(p, "{ ");
        if (pwqp->n == 0) {
-               if (isl_dim_size(pwqp->dim, isl_dim_set) > 0) {
+               if (isl_dim_size(pwqp->dim, isl_dim_set) > 0 ||
+                   isl_dim_is_named_or_nested(pwqp->dim, isl_dim_set)) {
                        p = print_dim(pwqp->dim, p, 1, 0, NULL);
                        p = isl_printer_print_str(p, " -> ");
                }
@@ -1475,7 +1513,8 @@ static __isl_give isl_printer *isl_pwf_print_isl_body(
        for (i = 0; i < pwf->n; ++i) {
                if (i)
                        p = isl_printer_print_str(p, "; ");
-               if (isl_dim_size(pwf->p[i].set->dim, isl_dim_set) > 0) {
+               if (isl_dim_size(pwf->dim, isl_dim_set) > 0 ||
+                   isl_dim_is_named_or_nested(pwf->dim, isl_dim_set)) {
                        p = print_dim(pwf->p[i].set->dim, p, 1, 0, NULL);
                        p = isl_printer_print_str(p, " -> ");
                }
@@ -1495,7 +1534,8 @@ static __isl_give isl_printer *print_pw_qpolynomial_fold_isl(
        }
        p = isl_printer_print_str(p, "{ ");
        if (pwf->n == 0) {
-               if (isl_dim_size(pwf->dim, isl_dim_set) > 0) {
+               if (isl_dim_size(pwf->dim, isl_dim_set) > 0 ||
+                   isl_dim_is_named_or_nested(pwf->dim, isl_dim_set)) {
                        p = print_dim(pwf->dim, p, 1, 0, NULL);
                        p = isl_printer_print_str(p, " -> ");
                }
@@ -1507,21 +1547,22 @@ static __isl_give isl_printer *print_pw_qpolynomial_fold_isl(
 }
 
 static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p,
-       __isl_keep isl_basic_set *bset, isl_int *c);
+       __isl_keep isl_dim *dim, __isl_keep isl_basic_set *bset, isl_int *c);
 
 static __isl_give isl_printer *print_name_c(__isl_take isl_printer *p,
+       __isl_keep isl_dim *dim,
        __isl_keep isl_basic_set *bset, enum isl_dim_type type, unsigned pos)
 {
        if (type == isl_dim_div) {
                p = isl_printer_print_str(p, "floord(");
-               p = print_affine_c(p, bset, bset->div[pos] + 1);
+               p = print_affine_c(p, dim, bset, bset->div[pos] + 1);
                p = isl_printer_print_str(p, ", ");
                p = isl_printer_print_isl_int(p, bset->div[pos][0]);
                p = isl_printer_print_str(p, ")");
        } else {
                const char *name;
 
-               name = isl_dim_get_name(bset->dim, type, pos);
+               name = isl_dim_get_name(dim, type, pos);
                if (!name)
                        name = "UNNAMED";
                p = isl_printer_print_str(p, name);
@@ -1530,6 +1571,7 @@ static __isl_give isl_printer *print_name_c(__isl_take isl_printer *p,
 }
 
 static __isl_give isl_printer *print_term_c(__isl_take isl_printer *p,
+       __isl_keep isl_dim *dim,
        __isl_keep isl_basic_set *bset, isl_int c, unsigned pos)
 {
        enum isl_dim_type type;
@@ -1546,12 +1588,13 @@ static __isl_give isl_printer *print_term_c(__isl_take isl_printer *p,
                p = isl_printer_print_isl_int(p, c);
                p = isl_printer_print_str(p, "*");
        }
-       type = pos2type(bset->dim, &pos);
-       p = print_name_c(p, bset, type, pos);
+       type = pos2type(dim, &pos);
+       p = print_name_c(p, dim, bset, type, pos);
        return p;
 }
 
 static __isl_give isl_printer *print_partial_affine_c(__isl_take isl_printer *p,
+       __isl_keep isl_dim *dim,
        __isl_keep isl_basic_set *bset, isl_int *c, unsigned len)
 {
        int i;
@@ -1570,7 +1613,7 @@ static __isl_give isl_printer *print_partial_affine_c(__isl_take isl_printer *p,
                                p = isl_printer_print_str(p, " + ");
                }
                first = 0;
-               p = print_term_c(p, bset, c[i], i);
+               p = print_term_c(p, dim, bset, c[i], i);
                if (flip)
                        isl_int_neg(c[i], c[i]);
        }
@@ -1580,19 +1623,20 @@ static __isl_give isl_printer *print_partial_affine_c(__isl_take isl_printer *p,
 }
 
 static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p,
-       __isl_keep isl_basic_set *bset, isl_int *c)
+       __isl_keep isl_dim *dim, __isl_keep isl_basic_set *bset, isl_int *c)
 {
        unsigned len = 1 + isl_basic_set_total_dim(bset);
-       return print_partial_affine_c(p, bset, c, len);
+       return print_partial_affine_c(p, dim, bset, c, len);
 }
 
 static __isl_give isl_printer *print_constraint_c(__isl_take isl_printer *p,
+       __isl_keep isl_dim *dim,
        __isl_keep isl_basic_set *bset, isl_int *c, const char *op, int first)
 {
        if (!first)
                p = isl_printer_print_str(p, " && ");
 
-       p = print_affine_c(p, bset, c);
+       p = print_affine_c(p, dim, bset, c);
        p = isl_printer_print_str(p, " ");
        p = isl_printer_print_str(p, op);
        p = isl_printer_print_str(p, " 0");
@@ -1600,7 +1644,7 @@ static __isl_give isl_printer *print_constraint_c(__isl_take isl_printer *p,
 }
 
 static __isl_give isl_printer *print_basic_set_c(__isl_take isl_printer *p,
-       __isl_keep isl_basic_set *bset)
+       __isl_keep isl_dim *dim, __isl_keep isl_basic_set *bset)
 {
        int i, j;
        unsigned n_div = isl_basic_set_dim(bset, isl_dim_div);
@@ -1609,12 +1653,13 @@ static __isl_give isl_printer *print_basic_set_c(__isl_take isl_printer *p,
        for (i = 0; i < bset->n_eq; ++i) {
                j = isl_seq_last_non_zero(bset->eq[i] + 1 + total, n_div);
                if (j < 0)
-                       p = print_constraint_c(p, bset, bset->eq[i], "==", !i);
+                       p = print_constraint_c(p, dim, bset,
+                                               bset->eq[i], "==", !i);
                else {
                        if (i)
                                p = isl_printer_print_str(p, " && ");
                        p = isl_printer_print_str(p, "(");
-                       p = print_partial_affine_c(p, bset, bset->eq[i],
+                       p = print_partial_affine_c(p, dim, bset, bset->eq[i],
                                                   1 + total + j);
                        p = isl_printer_print_str(p, ") % ");
                        p = isl_printer_print_isl_int(p,
@@ -1623,13 +1668,13 @@ static __isl_give isl_printer *print_basic_set_c(__isl_take isl_printer *p,
                }
        }
        for (i = 0; i < bset->n_ineq; ++i)
-               p = print_constraint_c(p, bset, bset->ineq[i], ">=",
+               p = print_constraint_c(p, dim, bset, bset->ineq[i], ">=",
                                        !bset->n_eq && !i);
        return p;
 }
 
 static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p,
-       __isl_keep isl_set *set)
+       __isl_keep isl_dim *dim, __isl_keep isl_set *set)
 {
        int i;
 
@@ -1641,7 +1686,7 @@ static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p,
                        p = isl_printer_print_str(p, " || ");
                if (set->n > 1)
                        p = isl_printer_print_str(p, "(");
-               p = print_basic_set_c(p, set->p[i]);
+               p = print_basic_set_c(p, dim, set->p[i]);
                if (set->n > 1)
                        p = isl_printer_print_str(p, ")");
        }
@@ -1649,7 +1694,7 @@ static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p,
 }
 
 static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
-       __isl_keep isl_qpolynomial *qp)
+       __isl_keep isl_dim *dim, __isl_keep isl_qpolynomial *qp)
 {
        isl_int den;
 
@@ -1664,7 +1709,7 @@ static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
                qp = isl_qpolynomial_mul(qp, f);
        }
        if (qp)
-               p = upoly_print(qp->upoly, qp->dim, qp->div, p, 0);
+               p = upoly_print(qp->upoly, dim, qp->div, p, 0);
        if (!isl_int_is_one(den)) {
                p = isl_printer_print_str(p, ")/");
                p = isl_printer_print_isl_int(p, den);
@@ -1675,18 +1720,18 @@ static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
 }
 
 static __isl_give isl_printer *print_pw_qpolynomial_c(
-       __isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwpq)
+       __isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
 {
        int i;
 
-       if (pwpq->n == 1 && isl_set_fast_is_universe(pwpq->p[0].set))
-               return print_qpolynomial_c(p, pwpq->p[0].qp);
+       if (pwqp->n == 1 && isl_set_fast_is_universe(pwqp->p[0].set))
+               return print_qpolynomial_c(p, pwqp->dim, pwqp->p[0].qp);
 
-       for (i = 0; i < pwpq->n; ++i) {
+       for (i = 0; i < pwqp->n; ++i) {
                p = isl_printer_print_str(p, "(");
-               p = print_set_c(p, pwpq->p[i].set);
+               p = print_set_c(p, pwqp->dim, pwqp->p[i].set);
                p = isl_printer_print_str(p, ") ? (");
-               p = print_qpolynomial_c(p, pwpq->p[i].qp);
+               p = print_qpolynomial_c(p, pwqp->dim, pwqp->p[i].qp);
                p = isl_printer_print_str(p, ") : ");
        }
 
@@ -1761,7 +1806,8 @@ error:
 }
 
 static __isl_give isl_printer *print_qpolynomial_fold_c(
-       __isl_take isl_printer *p, __isl_keep isl_qpolynomial_fold *fold)
+       __isl_take isl_printer *p, __isl_keep isl_dim *dim,
+       __isl_keep isl_qpolynomial_fold *fold)
 {
        int i;
 
@@ -1774,7 +1820,7 @@ static __isl_give isl_printer *print_qpolynomial_fold_c(
        for (i = 0; i < fold->n; ++i) {
                if (i)
                        p = isl_printer_print_str(p, ", ");
-               p = print_qpolynomial_c(p, fold->qp[i]);
+               p = print_qpolynomial_c(p, dim, fold->qp[i]);
                if (i)
                        p = isl_printer_print_str(p, ")");
        }
@@ -1787,13 +1833,13 @@ static __isl_give isl_printer *print_pw_qpolynomial_fold_c(
        int i;
 
        if (pwf->n == 1 && isl_set_fast_is_universe(pwf->p[0].set))
-               return print_qpolynomial_fold_c(p, pwf->p[0].fold);
+               return print_qpolynomial_fold_c(p, pwf->dim, pwf->p[0].fold);
 
        for (i = 0; i < pwf->n; ++i) {
                p = isl_printer_print_str(p, "(");
-               p = print_set_c(p, pwf->p[i].set);
+               p = print_set_c(p, pwf->dim, pwf->p[i].set);
                p = isl_printer_print_str(p, ") ? (");
-               p = print_qpolynomial_fold_c(p, pwf->p[i].fold);
+               p = print_qpolynomial_fold_c(p, pwf->dim, pwf->p[i].fold);
                p = isl_printer_print_str(p, ") : ");
        }