support extended PolyLib output format
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 15 Oct 2010 09:14:57 +0000 (11:14 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 17 Oct 2010 09:51:18 +0000 (11:51 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
cat.c
doc/user.pod
include/isl_printer.h
isl_output.c

diff --git a/cat.c b/cat.c
index a37c183..e40e83e 100644 (file)
--- a/cat.c
+++ b/cat.c
@@ -7,6 +7,7 @@ struct isl_arg_choice cat_format[] = {
        {"isl",         ISL_FORMAT_ISL},
        {"omega",       ISL_FORMAT_OMEGA},
        {"polylib",     ISL_FORMAT_POLYLIB},
+       {"ext-polylib", ISL_FORMAT_EXT_POLYLIB},
        {"latex",       ISL_FORMAT_LATEX},
        {0}
 };
index 2edbbd9..d9db51e 100644 (file)
@@ -550,6 +550,19 @@ appear in the last columns before the constant column.
 The coefficients of any existentially quantified variables appear
 between those of the set variables and those of the parameters.
 
+=head3 Extended C<PolyLib> format
+
+The extended C<PolyLib> format is nearly identical to the
+C<PolyLib> format.  The only difference is that the line
+containing the number of rows and columns of a constraint matrix
+also contains four additional numbers:
+the number of output dimensions, the number of input dimensions,
+the number of local dimensions (i.e., the number of existentially
+quantified variables) and the number of parameters.
+For sets, the number of ``output'' dimensions is equal
+to the number of set dimensions, while the number of ``input''
+dimensions is zero.
+
 =head3 Input
 
        #include <isl_set.h>
@@ -606,7 +619,8 @@ The behavior of the printer can be modified in various ways
                __isl_take isl_printer *p, const char *suffix);
 
 The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
-C<ISL_FORMAT_POLYLIB> or C<ISL_FORMAT_LATEX> and defaults to C<ISL_FORMAT_ISL>.
+C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
+and defaults to C<ISL_FORMAT_ISL>.
 Each line in the output is indented by C<indent> spaces
 (default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
 In the C<PolyLib> format output,
index e66cf8c..d0430c0 100644 (file)
@@ -26,6 +26,7 @@ __isl_give isl_printer *isl_printer_set_indent(__isl_take isl_printer *p,
 #define ISL_FORMAT_OMEGA               3
 #define ISL_FORMAT_C                   4
 #define ISL_FORMAT_LATEX               5
+#define ISL_FORMAT_EXT_POLYLIB         6
 __isl_give isl_printer *isl_printer_set_output_format(__isl_take isl_printer *p,
        int output_format);
 
index c5a1a53..66a2d72 100644 (file)
@@ -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,
@@ -932,7 +946,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 +985,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 +1023,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)