xref: /dflybsd-src/contrib/gcc-4.7/gcc/graphite-cloog-util.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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