2 * Copyright 2008-2009 Katholieke Universiteit Leuven
3 * Copyright 2010 INRIA Saclay
5 * Use of this software is governed by the GNU LGPLv2.1 license
7 * Written by Sven Verdoolaege, K.U.Leuven, Departement
8 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
9 * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
10 * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
15 static void print_constraint_polylib(struct isl_basic_set *bset,
17 FILE *out, int indent, const char *prefix, const char *suffix)
20 unsigned dim = isl_basic_set_n_dim(bset);
21 unsigned nparam = isl_basic_set_n_param(bset);
22 isl_int *c = ineq ? bset->ineq[n] : bset->eq[n];
24 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
25 fprintf(out, "%d", ineq);
26 for (i = 0; i < dim; ++i) {
28 isl_int_print(out, c[1+nparam+i], 5);
30 for (i = 0; i < bset->n_div; ++i) {
32 isl_int_print(out, c[1+nparam+dim+i], 5);
34 for (i = 0; i < nparam; ++i) {
36 isl_int_print(out, c[1+i], 5);
39 isl_int_print(out, c[0], 5);
40 fprintf(out, "%s\n", suffix ? suffix : "");
43 static void print_constraints_polylib(struct isl_basic_set *bset,
44 FILE *out, int indent, const char *prefix, const char *suffix)
48 for (i = 0; i < bset->n_eq; ++i)
49 print_constraint_polylib(bset, 0, i, out,
50 indent, prefix, suffix);
51 for (i = 0; i < bset->n_ineq; ++i)
52 print_constraint_polylib(bset, 1, i, out,
53 indent, prefix, suffix);
56 static void isl_basic_set_print_polylib(struct isl_basic_set *bset, FILE *out,
57 int indent, const char *prefix, const char *suffix)
59 unsigned total = isl_basic_set_total_dim(bset);
60 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
61 fprintf(out, "%d %d", bset->n_eq + bset->n_ineq, 1 + total + 1);
62 fprintf(out, "%s\n", suffix ? suffix : "");
63 print_constraints_polylib(bset, out, indent, prefix, suffix);
66 static void isl_set_print_polylib(struct isl_set *set, FILE *out, int indent)
70 fprintf(out, "%*s", indent, "");
71 fprintf(out, "%d\n", set->n);
72 for (i = 0; i < set->n; ++i) {
74 isl_basic_set_print_polylib(set->p[i], out, indent, NULL, NULL);
78 static print_name(struct isl_dim *dim, FILE *out,
79 enum isl_dim_type type, unsigned pos, int set)
83 name = type == isl_dim_div ? NULL : isl_dim_get_name(dim, type, pos);
86 fprintf(out, "%s", name);
89 if (type == isl_dim_param)
91 else if (type == isl_dim_div)
93 else if (set || type == isl_dim_in)
97 fprintf(out, "%s%d", prefix, pos);
101 static void print_var_list(struct isl_dim *dim, FILE *out,
102 enum isl_dim_type type, int set)
106 for (i = 0; i < isl_dim_size(dim, type); ++i) {
109 print_name(dim, out, type, i, set);
113 static void print_tuple(__isl_keep isl_dim *dim, FILE *out,
114 enum isl_dim_type type, int set)
117 print_var_list(dim, out, type, set);
121 static void print_term(__isl_keep isl_dim *dim,
122 isl_int c, int pos, FILE *out, int set)
124 enum isl_dim_type type;
125 unsigned n_in = isl_dim_size(dim, isl_dim_in);
126 unsigned n_out = isl_dim_size(dim, isl_dim_out);
127 unsigned nparam = isl_dim_size(dim, isl_dim_param);
130 isl_int_print(out, c, 0);
134 if (!isl_int_is_one(c))
135 isl_int_print(out, c, 0);
136 if (pos < 1 + nparam) {
137 type = isl_dim_param;
139 } else if (pos < 1 + nparam + n_in) {
142 } else if (pos < 1 + nparam + n_in + n_out) {
144 pos -= 1 + nparam + n_in;
147 pos -= 1 + nparam + n_in + n_out;
149 print_name(dim, out, type, pos, set);
152 static void print_affine(__isl_keep isl_basic_map *bmap, FILE *out,
157 unsigned len = 1 + isl_basic_map_total_dim(bmap);
159 for (i = 0, first = 1; i < len; ++i) {
160 if (isl_int_is_zero(c[i]))
162 if (!first && isl_int_is_pos(c[i]))
165 print_term(bmap->dim, c[i], i, out, set);
171 static void print_constraint(struct isl_basic_map *bmap, FILE *out,
172 isl_int *c, const char *suffix, int first_constraint, int set)
174 if (!first_constraint)
175 fprintf(out, " and ");
177 print_affine(bmap, out, c, set);
179 fprintf(out, " %s", suffix);
182 static void print_constraints(__isl_keep isl_basic_map *bmap, FILE *out,
187 for (i = 0; i < bmap->n_eq; ++i)
188 print_constraint(bmap, out, bmap->eq[i], "= 0", !i, set);
189 for (i = 0; i < bmap->n_ineq; ++i)
190 print_constraint(bmap, out, bmap->ineq[i], ">= 0",
191 !bmap->n_eq && !i, set);
194 static void print_disjunct(__isl_keep isl_basic_map *bmap, FILE *out, int set)
196 if (bmap->n_div > 0) {
198 fprintf(out, "exists (");
199 for (i = 0; i < bmap->n_div; ++i) {
202 print_name(bmap->dim, out, isl_dim_div, i, 0);
203 if (isl_int_is_zero(bmap->div[i][0]))
205 fprintf(out, " = [(");
206 print_affine(bmap, out, bmap->div[i] + 1, set);
208 isl_int_print(out, bmap->div[i][0], 0);
214 print_constraints(bmap, out, set);
220 static void isl_basic_map_print_isl(__isl_keep isl_basic_map *bmap, FILE *out,
221 int indent, const char *prefix, const char *suffix)
225 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
226 if (isl_basic_map_dim(bmap, isl_dim_param) > 0) {
227 print_tuple(bmap->dim, out, isl_dim_param, 0);
228 fprintf(out, " -> ");
231 print_tuple(bmap->dim, out, isl_dim_in, 0);
232 fprintf(out, " -> ");
233 print_tuple(bmap->dim, out, isl_dim_out, 0);
235 print_disjunct(bmap, out, 0);
236 fprintf(out, " }%s\n", suffix ? suffix : "");
239 static void isl_basic_set_print_isl(__isl_keep isl_basic_set *bset, FILE *out,
240 int indent, const char *prefix, const char *suffix)
244 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
245 if (isl_basic_set_dim(bset, isl_dim_param) > 0) {
246 print_tuple(bset->dim, out, isl_dim_param, 0);
247 fprintf(out, " -> ");
250 print_tuple(bset->dim, out, isl_dim_set, 1);
252 print_disjunct((isl_basic_map *)bset, out, 1);
253 fprintf(out, " }%s\n", suffix ? suffix : "");
256 static void isl_map_print_isl(__isl_keep isl_map *map, FILE *out, int indent)
260 fprintf(out, "%*s", indent, "");
261 if (isl_map_dim(map, isl_dim_param) > 0) {
262 print_tuple(map->dim, out, isl_dim_param, 0);
263 fprintf(out, " -> ");
266 print_tuple(map->dim, out, isl_dim_in, 0);
267 fprintf(out, " -> ");
268 print_tuple(map->dim, out, isl_dim_out, 0);
271 fprintf(out, "1 = 0");
272 for (i = 0; i < map->n; ++i) {
274 fprintf(out, " or ");
275 print_disjunct(map->p[i], out, 0);
277 fprintf(out, " }\n");
280 static void isl_set_print_isl(__isl_keep isl_set *set, FILE *out, int indent)
284 fprintf(out, "%*s", indent, "");
285 if (isl_set_dim(set, isl_dim_param) > 0) {
286 print_tuple(set->dim, out, isl_dim_param, 0);
287 fprintf(out, " -> ");
290 print_tuple(set->dim, out, isl_dim_set, 1);
293 fprintf(out, "1 = 0");
294 for (i = 0; i < set->n; ++i) {
296 fprintf(out, " or ");
297 print_disjunct((isl_basic_map *)set->p[i], out, 1);
299 fprintf(out, " }\n");
302 void isl_basic_map_print(__isl_keep isl_basic_map *bmap, FILE *out, int indent,
303 const char *prefix, const char *suffix, unsigned output_format)
307 if (output_format == ISL_FORMAT_ISL)
308 isl_basic_map_print_isl(bmap, out, indent, prefix, suffix);
310 isl_assert(bmap->ctx, 0, return);
313 void isl_basic_set_print(struct isl_basic_set *bset, FILE *out, int indent,
314 const char *prefix, const char *suffix, unsigned output_format)
318 if (output_format == ISL_FORMAT_ISL)
319 isl_basic_set_print_isl(bset, out, indent, prefix, suffix);
320 else if (output_format == ISL_FORMAT_POLYLIB)
321 isl_basic_set_print_polylib(bset, out, indent, prefix, suffix);
322 else if (output_format == ISL_FORMAT_POLYLIB_CONSTRAINTS)
323 print_constraints_polylib(bset, out, indent, prefix, suffix);
325 isl_assert(bset->ctx, 0, return);
328 void isl_set_print(struct isl_set *set, FILE *out, int indent,
329 unsigned output_format)
333 if (output_format == ISL_FORMAT_ISL)
334 isl_set_print_isl(set, out, indent);
335 else if (output_format == ISL_FORMAT_POLYLIB)
336 isl_set_print_polylib(set, out, indent);
338 isl_assert(set->ctx, 0, return);
341 void isl_map_print(__isl_keep isl_map *map, FILE *out, int indent,
342 unsigned output_format)
346 if (output_format == ISL_FORMAT_ISL)
347 isl_map_print_isl(map, out, indent);
349 isl_assert(map->ctx, 0, return);