1*e4b17023SJohn Marino /* Gimple Represented as Polyhedra.
2*e4b17023SJohn Marino Copyright (C) 2009, 2010 Free Software Foundation, Inc.
3*e4b17023SJohn Marino Contributed by Sebastian Pop <sebastian.pop@inria.fr>
4*e4b17023SJohn Marino and Tobias Grosser <grosser@fim.uni-passau.de>.
5*e4b17023SJohn Marino
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
9*e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
10*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino any later version.
12*e4b17023SJohn Marino
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*e4b17023SJohn Marino GNU General Public License for more details.
17*e4b17023SJohn Marino
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
21*e4b17023SJohn Marino
22*e4b17023SJohn Marino #include "config.h"
23*e4b17023SJohn Marino #include "system.h"
24*e4b17023SJohn Marino #include "coretypes.h"
25*e4b17023SJohn Marino
26*e4b17023SJohn Marino #ifdef HAVE_cloog
27*e4b17023SJohn Marino
28*e4b17023SJohn Marino #include "ppl_c.h"
29*e4b17023SJohn Marino #include "cloog/cloog.h"
30*e4b17023SJohn Marino #include "graphite-cloog-util.h"
31*e4b17023SJohn Marino #include "graphite-cloog-compat.h"
32*e4b17023SJohn Marino
33*e4b17023SJohn Marino /* Counts the number of constraints in PCS. */
34*e4b17023SJohn Marino
35*e4b17023SJohn Marino static int
ppl_Constrain_System_number_of_constraints(ppl_const_Constraint_System_t pcs)36*e4b17023SJohn Marino ppl_Constrain_System_number_of_constraints (ppl_const_Constraint_System_t pcs)
37*e4b17023SJohn Marino {
38*e4b17023SJohn Marino ppl_Constraint_System_const_iterator_t cit, end;
39*e4b17023SJohn Marino int num = 0;
40*e4b17023SJohn Marino
41*e4b17023SJohn Marino ppl_new_Constraint_System_const_iterator (&cit);
42*e4b17023SJohn Marino ppl_new_Constraint_System_const_iterator (&end);
43*e4b17023SJohn Marino
44*e4b17023SJohn Marino for (ppl_Constraint_System_begin (pcs, cit),
45*e4b17023SJohn Marino ppl_Constraint_System_end (pcs, end);
46*e4b17023SJohn Marino !ppl_Constraint_System_const_iterator_equal_test (cit, end);
47*e4b17023SJohn Marino ppl_Constraint_System_const_iterator_increment (cit))
48*e4b17023SJohn Marino num++;
49*e4b17023SJohn Marino
50*e4b17023SJohn Marino ppl_delete_Constraint_System_const_iterator (cit);
51*e4b17023SJohn Marino ppl_delete_Constraint_System_const_iterator (end);
52*e4b17023SJohn Marino return num;
53*e4b17023SJohn Marino }
54*e4b17023SJohn Marino
55*e4b17023SJohn Marino static void
oppose_constraint(CloogMatrix * m,int row)56*e4b17023SJohn Marino oppose_constraint (CloogMatrix *m, int row)
57*e4b17023SJohn Marino {
58*e4b17023SJohn Marino int k;
59*e4b17023SJohn Marino
60*e4b17023SJohn Marino /* Do not oppose the first column: it is the eq/ineq one. */
61*e4b17023SJohn Marino /* Cast needed to remove warning that is generated as CLooG isl
62*e4b17023SJohn Marino is using an unsigned int for NbColumns and CLooG PPL is
63*e4b17023SJohn Marino using a signed int for NBColumns. */
64*e4b17023SJohn Marino for (k = 1; k < (int)m->NbColumns; k++)
65*e4b17023SJohn Marino mpz_neg (m->p[row][k], m->p[row][k]);
66*e4b17023SJohn Marino }
67*e4b17023SJohn Marino
68*e4b17023SJohn Marino /* Inserts constraint CSTR at row ROW of matrix M. */
69*e4b17023SJohn Marino
70*e4b17023SJohn Marino static void
insert_constraint_into_matrix(CloogMatrix * m,int row,ppl_const_Constraint_t cstr)71*e4b17023SJohn Marino insert_constraint_into_matrix (CloogMatrix *m, int row,
72*e4b17023SJohn Marino ppl_const_Constraint_t cstr)
73*e4b17023SJohn Marino {
74*e4b17023SJohn Marino ppl_Coefficient_t c;
75*e4b17023SJohn Marino ppl_dimension_type i, dim, nb_cols = m->NbColumns;
76*e4b17023SJohn Marino
77*e4b17023SJohn Marino ppl_Constraint_space_dimension (cstr, &dim);
78*e4b17023SJohn Marino ppl_new_Coefficient (&c);
79*e4b17023SJohn Marino
80*e4b17023SJohn Marino for (i = 0; i < dim; i++)
81*e4b17023SJohn Marino {
82*e4b17023SJohn Marino ppl_Constraint_coefficient (cstr, i, c);
83*e4b17023SJohn Marino ppl_Coefficient_to_mpz_t (c, m->p[row][i + 1]);
84*e4b17023SJohn Marino }
85*e4b17023SJohn Marino
86*e4b17023SJohn Marino for (i = dim; i < nb_cols - 1; i++)
87*e4b17023SJohn Marino mpz_set_si (m->p[row][i + 1], 0);
88*e4b17023SJohn Marino
89*e4b17023SJohn Marino ppl_Constraint_inhomogeneous_term (cstr, c);
90*e4b17023SJohn Marino ppl_Coefficient_to_mpz_t (c, m->p[row][nb_cols - 1]);
91*e4b17023SJohn Marino mpz_set_si (m->p[row][0], 1);
92*e4b17023SJohn Marino
93*e4b17023SJohn Marino switch (ppl_Constraint_type (cstr))
94*e4b17023SJohn Marino {
95*e4b17023SJohn Marino case PPL_CONSTRAINT_TYPE_LESS_THAN:
96*e4b17023SJohn Marino oppose_constraint (m, row);
97*e4b17023SJohn Marino case PPL_CONSTRAINT_TYPE_GREATER_THAN:
98*e4b17023SJohn Marino mpz_sub_ui (m->p[row][nb_cols - 1],
99*e4b17023SJohn Marino m->p[row][nb_cols - 1], 1);
100*e4b17023SJohn Marino break;
101*e4b17023SJohn Marino
102*e4b17023SJohn Marino case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
103*e4b17023SJohn Marino oppose_constraint (m, row);
104*e4b17023SJohn Marino case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
105*e4b17023SJohn Marino break;
106*e4b17023SJohn Marino
107*e4b17023SJohn Marino case PPL_CONSTRAINT_TYPE_EQUAL:
108*e4b17023SJohn Marino mpz_set_si (m->p[row][0], 0);
109*e4b17023SJohn Marino break;
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino default:
112*e4b17023SJohn Marino /* Not yet implemented. */
113*e4b17023SJohn Marino gcc_unreachable();
114*e4b17023SJohn Marino }
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino ppl_delete_Coefficient (c);
117*e4b17023SJohn Marino }
118*e4b17023SJohn Marino
119*e4b17023SJohn Marino /* Creates a CloogMatrix from constraint system PCS. */
120*e4b17023SJohn Marino
121*e4b17023SJohn Marino static CloogMatrix *
new_Cloog_Matrix_from_ppl_Constraint_System(ppl_const_Constraint_System_t pcs)122*e4b17023SJohn Marino new_Cloog_Matrix_from_ppl_Constraint_System (ppl_const_Constraint_System_t pcs)
123*e4b17023SJohn Marino {
124*e4b17023SJohn Marino CloogMatrix *matrix;
125*e4b17023SJohn Marino ppl_Constraint_System_const_iterator_t cit, end;
126*e4b17023SJohn Marino ppl_dimension_type dim;
127*e4b17023SJohn Marino int rows;
128*e4b17023SJohn Marino int row = 0;
129*e4b17023SJohn Marino
130*e4b17023SJohn Marino rows = ppl_Constrain_System_number_of_constraints (pcs);
131*e4b17023SJohn Marino ppl_Constraint_System_space_dimension (pcs, &dim);
132*e4b17023SJohn Marino matrix = cloog_matrix_alloc (rows, dim + 2);
133*e4b17023SJohn Marino ppl_new_Constraint_System_const_iterator (&cit);
134*e4b17023SJohn Marino ppl_new_Constraint_System_const_iterator (&end);
135*e4b17023SJohn Marino
136*e4b17023SJohn Marino for (ppl_Constraint_System_begin (pcs, cit),
137*e4b17023SJohn Marino ppl_Constraint_System_end (pcs, end);
138*e4b17023SJohn Marino !ppl_Constraint_System_const_iterator_equal_test (cit, end);
139*e4b17023SJohn Marino ppl_Constraint_System_const_iterator_increment (cit))
140*e4b17023SJohn Marino {
141*e4b17023SJohn Marino ppl_const_Constraint_t c;
142*e4b17023SJohn Marino ppl_Constraint_System_const_iterator_dereference (cit, &c);
143*e4b17023SJohn Marino insert_constraint_into_matrix (matrix, row, c);
144*e4b17023SJohn Marino row++;
145*e4b17023SJohn Marino }
146*e4b17023SJohn Marino
147*e4b17023SJohn Marino ppl_delete_Constraint_System_const_iterator (cit);
148*e4b17023SJohn Marino ppl_delete_Constraint_System_const_iterator (end);
149*e4b17023SJohn Marino
150*e4b17023SJohn Marino return matrix;
151*e4b17023SJohn Marino }
152*e4b17023SJohn Marino
153*e4b17023SJohn Marino /* Creates a CloogMatrix from polyhedron PH. */
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino CloogMatrix *
new_Cloog_Matrix_from_ppl_Polyhedron(ppl_const_Polyhedron_t ph)156*e4b17023SJohn Marino new_Cloog_Matrix_from_ppl_Polyhedron (ppl_const_Polyhedron_t ph)
157*e4b17023SJohn Marino {
158*e4b17023SJohn Marino ppl_const_Constraint_System_t pcs;
159*e4b17023SJohn Marino CloogMatrix *res;
160*e4b17023SJohn Marino
161*e4b17023SJohn Marino ppl_Polyhedron_get_constraints (ph, &pcs);
162*e4b17023SJohn Marino res = new_Cloog_Matrix_from_ppl_Constraint_System (pcs);
163*e4b17023SJohn Marino
164*e4b17023SJohn Marino return res;
165*e4b17023SJohn Marino }
166*e4b17023SJohn Marino
167*e4b17023SJohn Marino /* Translates row ROW of the CloogMatrix MATRIX to a PPL Constraint. */
168*e4b17023SJohn Marino
169*e4b17023SJohn Marino static ppl_Constraint_t
cloog_matrix_to_ppl_constraint(CloogMatrix * matrix,int row)170*e4b17023SJohn Marino cloog_matrix_to_ppl_constraint (CloogMatrix *matrix, int row)
171*e4b17023SJohn Marino {
172*e4b17023SJohn Marino int j;
173*e4b17023SJohn Marino ppl_Constraint_t cstr;
174*e4b17023SJohn Marino ppl_Coefficient_t coef;
175*e4b17023SJohn Marino ppl_Linear_Expression_t expr;
176*e4b17023SJohn Marino ppl_dimension_type dim = matrix->NbColumns - 2;
177*e4b17023SJohn Marino
178*e4b17023SJohn Marino ppl_new_Coefficient (&coef);
179*e4b17023SJohn Marino ppl_new_Linear_Expression_with_dimension (&expr, dim);
180*e4b17023SJohn Marino
181*e4b17023SJohn Marino /* Cast needed to remove warning that is generated as CLooG isl
182*e4b17023SJohn Marino is using an unsigned int for NbColumns and CLooG PPL is
183*e4b17023SJohn Marino using a signed int for NBColumns. */
184*e4b17023SJohn Marino for (j = 1; j < (int)matrix->NbColumns - 1; j++)
185*e4b17023SJohn Marino {
186*e4b17023SJohn Marino ppl_assign_Coefficient_from_mpz_t (coef, matrix->p[row][j]);
187*e4b17023SJohn Marino ppl_Linear_Expression_add_to_coefficient (expr, j - 1, coef);
188*e4b17023SJohn Marino }
189*e4b17023SJohn Marino
190*e4b17023SJohn Marino ppl_assign_Coefficient_from_mpz_t (coef,
191*e4b17023SJohn Marino matrix->p[row][matrix->NbColumns - 1]);
192*e4b17023SJohn Marino ppl_Linear_Expression_add_to_inhomogeneous (expr, coef);
193*e4b17023SJohn Marino ppl_delete_Coefficient (coef);
194*e4b17023SJohn Marino
195*e4b17023SJohn Marino if (mpz_sgn (matrix->p[row][0]) == 0)
196*e4b17023SJohn Marino ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL);
197*e4b17023SJohn Marino else
198*e4b17023SJohn Marino ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
199*e4b17023SJohn Marino
200*e4b17023SJohn Marino ppl_delete_Linear_Expression (expr);
201*e4b17023SJohn Marino return cstr;
202*e4b17023SJohn Marino }
203*e4b17023SJohn Marino
204*e4b17023SJohn Marino /* Creates a PPL constraint system from MATRIX. */
205*e4b17023SJohn Marino
206*e4b17023SJohn Marino static void
new_Constraint_System_from_Cloog_Matrix(ppl_Constraint_System_t * pcs,CloogMatrix * matrix)207*e4b17023SJohn Marino new_Constraint_System_from_Cloog_Matrix (ppl_Constraint_System_t *pcs,
208*e4b17023SJohn Marino CloogMatrix *matrix)
209*e4b17023SJohn Marino {
210*e4b17023SJohn Marino int i;
211*e4b17023SJohn Marino
212*e4b17023SJohn Marino ppl_new_Constraint_System (pcs);
213*e4b17023SJohn Marino
214*e4b17023SJohn Marino /* Cast needed to remove warning that is generated as CLooG isl
215*e4b17023SJohn Marino is using an unsigned int for NbColumns and CLooG PPL is
216*e4b17023SJohn Marino using a signed int for NBColumns. */
217*e4b17023SJohn Marino for (i = 0; i < (int)matrix->NbRows; i++)
218*e4b17023SJohn Marino {
219*e4b17023SJohn Marino ppl_Constraint_t c = cloog_matrix_to_ppl_constraint (matrix, i);
220*e4b17023SJohn Marino ppl_Constraint_System_insert_Constraint (*pcs, c);
221*e4b17023SJohn Marino ppl_delete_Constraint (c);
222*e4b17023SJohn Marino }
223*e4b17023SJohn Marino }
224*e4b17023SJohn Marino
225*e4b17023SJohn Marino /* Creates a PPL Polyhedron from MATRIX. */
226*e4b17023SJohn Marino
227*e4b17023SJohn Marino void
new_C_Polyhedron_from_Cloog_Matrix(ppl_Polyhedron_t * ph,CloogMatrix * matrix)228*e4b17023SJohn Marino new_C_Polyhedron_from_Cloog_Matrix (ppl_Polyhedron_t *ph,
229*e4b17023SJohn Marino CloogMatrix *matrix)
230*e4b17023SJohn Marino {
231*e4b17023SJohn Marino ppl_Constraint_System_t cs;
232*e4b17023SJohn Marino new_Constraint_System_from_Cloog_Matrix (&cs, matrix);
233*e4b17023SJohn Marino ppl_new_C_Polyhedron_recycle_Constraint_System (ph, cs);
234*e4b17023SJohn Marino }
235*e4b17023SJohn Marino
236*e4b17023SJohn Marino /* Creates a CloogDomain from polyhedron PH. */
237*e4b17023SJohn Marino
238*e4b17023SJohn Marino CloogDomain *
new_Cloog_Domain_from_ppl_Polyhedron(ppl_const_Polyhedron_t ph,int nb_params,CloogState * state ATTRIBUTE_UNUSED)239*e4b17023SJohn Marino new_Cloog_Domain_from_ppl_Polyhedron (ppl_const_Polyhedron_t ph, int nb_params,
240*e4b17023SJohn Marino CloogState *state ATTRIBUTE_UNUSED)
241*e4b17023SJohn Marino {
242*e4b17023SJohn Marino CloogMatrix *mat = new_Cloog_Matrix_from_ppl_Polyhedron (ph);
243*e4b17023SJohn Marino CloogDomain *res = cloog_domain_from_cloog_matrix (state, mat, nb_params);
244*e4b17023SJohn Marino cloog_matrix_free (mat);
245*e4b17023SJohn Marino return res;
246*e4b17023SJohn Marino }
247*e4b17023SJohn Marino
248*e4b17023SJohn Marino /* Create a CloogScattering from polyhedron PH. */
249*e4b17023SJohn Marino
250*e4b17023SJohn Marino CloogScattering *
new_Cloog_Scattering_from_ppl_Polyhedron(ppl_const_Polyhedron_t ph,int nb_params ATTRIBUTE_UNUSED,int nb_scatt ATTRIBUTE_UNUSED,CloogState * state ATTRIBUTE_UNUSED)251*e4b17023SJohn Marino new_Cloog_Scattering_from_ppl_Polyhedron (ppl_const_Polyhedron_t ph,
252*e4b17023SJohn Marino int nb_params ATTRIBUTE_UNUSED,
253*e4b17023SJohn Marino int nb_scatt ATTRIBUTE_UNUSED,
254*e4b17023SJohn Marino CloogState *state ATTRIBUTE_UNUSED)
255*e4b17023SJohn Marino {
256*e4b17023SJohn Marino #ifdef CLOOG_ORG
257*e4b17023SJohn Marino CloogMatrix *mat = new_Cloog_Matrix_from_ppl_Polyhedron (ph);
258*e4b17023SJohn Marino CloogScattering *res = cloog_scattering_from_cloog_matrix (state, mat,
259*e4b17023SJohn Marino nb_scatt,
260*e4b17023SJohn Marino nb_params);
261*e4b17023SJohn Marino
262*e4b17023SJohn Marino cloog_matrix_free (mat);
263*e4b17023SJohn Marino return res;
264*e4b17023SJohn Marino #else
265*e4b17023SJohn Marino return new_Cloog_Domain_from_ppl_Polyhedron (ph, nb_params, state);
266*e4b17023SJohn Marino #endif
267*e4b17023SJohn Marino }
268*e4b17023SJohn Marino
269*e4b17023SJohn Marino /* Creates a CloogDomain from a pointset powerset PS. */
270*e4b17023SJohn Marino
271*e4b17023SJohn Marino CloogDomain *
new_Cloog_Domain_from_ppl_Pointset_Powerset(ppl_Pointset_Powerset_C_Polyhedron_t ps,int nb_params,CloogState * state ATTRIBUTE_UNUSED)272*e4b17023SJohn Marino new_Cloog_Domain_from_ppl_Pointset_Powerset
273*e4b17023SJohn Marino (ppl_Pointset_Powerset_C_Polyhedron_t ps, int nb_params,
274*e4b17023SJohn Marino CloogState *state ATTRIBUTE_UNUSED)
275*e4b17023SJohn Marino {
276*e4b17023SJohn Marino CloogDomain *res = NULL;
277*e4b17023SJohn Marino ppl_Pointset_Powerset_C_Polyhedron_iterator_t it, end;
278*e4b17023SJohn Marino
279*e4b17023SJohn Marino ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&it);
280*e4b17023SJohn Marino ppl_new_Pointset_Powerset_C_Polyhedron_iterator (&end);
281*e4b17023SJohn Marino
282*e4b17023SJohn Marino for (ppl_Pointset_Powerset_C_Polyhedron_iterator_begin (ps, it),
283*e4b17023SJohn Marino ppl_Pointset_Powerset_C_Polyhedron_iterator_end (ps, end);
284*e4b17023SJohn Marino !ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test (it, end);
285*e4b17023SJohn Marino ppl_Pointset_Powerset_C_Polyhedron_iterator_increment (it))
286*e4b17023SJohn Marino {
287*e4b17023SJohn Marino ppl_const_Polyhedron_t ph;
288*e4b17023SJohn Marino CloogDomain *tmp;
289*e4b17023SJohn Marino
290*e4b17023SJohn Marino ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference (it, &ph);
291*e4b17023SJohn Marino tmp = new_Cloog_Domain_from_ppl_Polyhedron (ph, nb_params, state);
292*e4b17023SJohn Marino
293*e4b17023SJohn Marino if (res == NULL)
294*e4b17023SJohn Marino res = tmp;
295*e4b17023SJohn Marino else
296*e4b17023SJohn Marino res = cloog_domain_union (res, tmp);
297*e4b17023SJohn Marino }
298*e4b17023SJohn Marino
299*e4b17023SJohn Marino ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (it);
300*e4b17023SJohn Marino ppl_delete_Pointset_Powerset_C_Polyhedron_iterator (end);
301*e4b17023SJohn Marino
302*e4b17023SJohn Marino gcc_assert (res != NULL);
303*e4b17023SJohn Marino
304*e4b17023SJohn Marino return res;
305*e4b17023SJohn Marino }
306*e4b17023SJohn Marino
307*e4b17023SJohn Marino /* Print to FILE the matrix MAT in OpenScop format. OUTPUT is the number
308*e4b17023SJohn Marino of output dimensions, INPUT is the number of input dimensions, LOCALS
309*e4b17023SJohn Marino is the number of existentially quantified variables and PARAMS is the
310*e4b17023SJohn Marino number of parameters. */
311*e4b17023SJohn Marino
312*e4b17023SJohn Marino static void
openscop_print_cloog_matrix(FILE * file,CloogMatrix * mat,int output,int input,int locals,int params)313*e4b17023SJohn Marino openscop_print_cloog_matrix (FILE *file, CloogMatrix *mat,
314*e4b17023SJohn Marino int output, int input, int locals,
315*e4b17023SJohn Marino int params)
316*e4b17023SJohn Marino {
317*e4b17023SJohn Marino int i, j;
318*e4b17023SJohn Marino
319*e4b17023SJohn Marino fprintf (file, "%d %d %d %d %d %d \n", cloog_matrix_nrows (mat),
320*e4b17023SJohn Marino cloog_matrix_ncolumns (mat), output, input, locals, params);
321*e4b17023SJohn Marino
322*e4b17023SJohn Marino for (i = 0; i < cloog_matrix_nrows (mat); i++)
323*e4b17023SJohn Marino {
324*e4b17023SJohn Marino for (j = 0; j < cloog_matrix_ncolumns (mat); j++)
325*e4b17023SJohn Marino if (j == 0)
326*e4b17023SJohn Marino fprintf (file, "%ld ", mpz_get_si (mat->p[i][j]));
327*e4b17023SJohn Marino else
328*e4b17023SJohn Marino fprintf (file, "%6ld ", mpz_get_si (mat->p[i][j]));
329*e4b17023SJohn Marino
330*e4b17023SJohn Marino fprintf (file, "\n");
331*e4b17023SJohn Marino }
332*e4b17023SJohn Marino }
333*e4b17023SJohn Marino
334*e4b17023SJohn Marino /* Print to FILE the polyhedron PH in OpenScop format. OUTPUT is the number
335*e4b17023SJohn Marino of output dimensions, INPUT is the number of input dimensions, LOCALS is
336*e4b17023SJohn Marino the number of existentially quantified variables and PARAMS is the number
337*e4b17023SJohn Marino of parameters. */
338*e4b17023SJohn Marino
339*e4b17023SJohn Marino void
openscop_print_polyhedron_matrix(FILE * file,ppl_const_Polyhedron_t ph,int output,int input,int locals,int params)340*e4b17023SJohn Marino openscop_print_polyhedron_matrix (FILE *file, ppl_const_Polyhedron_t ph,
341*e4b17023SJohn Marino int output, int input, int locals,
342*e4b17023SJohn Marino int params)
343*e4b17023SJohn Marino {
344*e4b17023SJohn Marino CloogMatrix *mat = new_Cloog_Matrix_from_ppl_Polyhedron (ph);
345*e4b17023SJohn Marino openscop_print_cloog_matrix (file, mat, output, input, locals, params);
346*e4b17023SJohn Marino cloog_matrix_free (mat);
347*e4b17023SJohn Marino }
348*e4b17023SJohn Marino
349*e4b17023SJohn Marino /* Read from FILE a matrix in OpenScop format. OUTPUT is the number of
350*e4b17023SJohn Marino output dimensions, INPUT is the number of input dimensions, LOCALS
351*e4b17023SJohn Marino is the number of existentially quantified variables and PARAMS is the
352*e4b17023SJohn Marino number of parameters. */
353*e4b17023SJohn Marino
354*e4b17023SJohn Marino static CloogMatrix *
openscop_read_cloog_matrix(FILE * file,int * output,int * input,int * locals,int * params)355*e4b17023SJohn Marino openscop_read_cloog_matrix (FILE *file, int *output, int *input, int *locals,
356*e4b17023SJohn Marino int *params)
357*e4b17023SJohn Marino {
358*e4b17023SJohn Marino int nb_rows, nb_cols, i, j;
359*e4b17023SJohn Marino CloogMatrix *mat;
360*e4b17023SJohn Marino int *openscop_matrix_header, *matrix_line;
361*e4b17023SJohn Marino
362*e4b17023SJohn Marino openscop_matrix_header = openscop_read_N_int (file, 6);
363*e4b17023SJohn Marino
364*e4b17023SJohn Marino nb_rows = openscop_matrix_header[0];
365*e4b17023SJohn Marino nb_cols = openscop_matrix_header[1];
366*e4b17023SJohn Marino *output = openscop_matrix_header[2];
367*e4b17023SJohn Marino *input = openscop_matrix_header[3];
368*e4b17023SJohn Marino *locals = openscop_matrix_header[4];
369*e4b17023SJohn Marino *params = openscop_matrix_header[5];
370*e4b17023SJohn Marino
371*e4b17023SJohn Marino free (openscop_matrix_header);
372*e4b17023SJohn Marino
373*e4b17023SJohn Marino if (nb_rows == 0 || nb_cols == 0)
374*e4b17023SJohn Marino return NULL;
375*e4b17023SJohn Marino
376*e4b17023SJohn Marino mat = cloog_matrix_alloc (nb_rows, nb_cols);
377*e4b17023SJohn Marino mat->NbRows = nb_rows;
378*e4b17023SJohn Marino mat->NbColumns = nb_cols;
379*e4b17023SJohn Marino
380*e4b17023SJohn Marino for (i = 0; i < nb_rows; i++)
381*e4b17023SJohn Marino {
382*e4b17023SJohn Marino matrix_line = openscop_read_N_int (file, nb_cols);
383*e4b17023SJohn Marino
384*e4b17023SJohn Marino for (j = 0; j < nb_cols; j++)
385*e4b17023SJohn Marino mpz_set_si (mat->p[i][j], matrix_line[j]);
386*e4b17023SJohn Marino }
387*e4b17023SJohn Marino
388*e4b17023SJohn Marino return mat;
389*e4b17023SJohn Marino }
390*e4b17023SJohn Marino
391*e4b17023SJohn Marino /* Read from FILE the polyhedron PH in OpenScop format. OUTPUT is the number
392*e4b17023SJohn Marino of output dimensions, INPUT is the number of input dimensions, LOCALS is
393*e4b17023SJohn Marino the number of existentially quantified variables and PARAMS is the number
394*e4b17023SJohn Marino of parameters. */
395*e4b17023SJohn Marino
396*e4b17023SJohn Marino void
openscop_read_polyhedron_matrix(FILE * file,ppl_Polyhedron_t * ph,int * output,int * input,int * locals,int * params)397*e4b17023SJohn Marino openscop_read_polyhedron_matrix (FILE *file, ppl_Polyhedron_t *ph,
398*e4b17023SJohn Marino int *output, int *input, int *locals,
399*e4b17023SJohn Marino int *params)
400*e4b17023SJohn Marino {
401*e4b17023SJohn Marino CloogMatrix *mat;
402*e4b17023SJohn Marino
403*e4b17023SJohn Marino mat = openscop_read_cloog_matrix (file, output, input, locals, params);
404*e4b17023SJohn Marino
405*e4b17023SJohn Marino if (!mat)
406*e4b17023SJohn Marino *ph = NULL;
407*e4b17023SJohn Marino else
408*e4b17023SJohn Marino {
409*e4b17023SJohn Marino new_C_Polyhedron_from_Cloog_Matrix (ph, mat);
410*e4b17023SJohn Marino cloog_matrix_free (mat);
411*e4b17023SJohn Marino }
412*e4b17023SJohn Marino }
413*e4b17023SJohn Marino
414*e4b17023SJohn Marino #endif
415