1 #include <isl_aff_polylib.h>
2 #include <isl_set_polylib.h>
3 #include <isl/vertices.h>
4 #include "isl_param_util.h"
6 static Matrix
*expr2vertex(Polyhedron
*E
, unsigned nvar
)
10 unsigned nparam
= E
->Dimension
- nvar
;
14 value_set_si(mone
, -1);
15 M
= Matrix_Alloc(nvar
, nparam
+ 1 + 1);
16 for (i
= 0; i
< nvar
; ++i
) {
17 Vector_Scale(E
->Constraint
[i
] + 1 + nvar
, M
->p
[i
],
19 value_assign(M
->p
[i
][nparam
+ 1], E
->Constraint
[i
][1 + i
]);
26 #define INT_BITS (sizeof(unsigned) * 8)
28 static int add_vertex(__isl_take isl_vertex
*vertex
, void *user
)
30 Param_Vertices
***next_V
= (Param_Vertices
***) user
;
37 ctx
= isl_vertex_get_ctx(vertex
);
39 dom
= isl_vertex_get_domain(vertex
);
40 D
= isl_basic_set_to_polylib(dom
);
41 isl_basic_set_free(dom
);
43 expr
= isl_vertex_get_expr(vertex
);
45 V
= isl_alloc_type(ctx
, Param_Vertices
);
46 V
->Vertex
= isl_multi_aff_to_polylib(expr
);
47 V
->Domain
= Polyhedron2Constraints(D
);
52 isl_multi_aff_free(expr
);
57 isl_vertex_free(vertex
);
62 struct bv_add_chamber_data
{
63 Param_Domain
**next_D
;
68 static int add_chamber_vertex(__isl_take isl_vertex
*vertex
, void *user
)
71 struct bv_add_chamber_data
*data
= (struct bv_add_chamber_data
*)user
;
74 v
= isl_vertex_get_id(vertex
);
75 data
->dom
->F
[v
/ INT_BITS
] |= 1u << (INT_BITS
- (v
% INT_BITS
) - 1);
77 isl_vertex_free(vertex
);
82 static int add_chamber(__isl_take isl_cell
*cell
, void *user
)
84 struct bv_add_chamber_data
*data
= (struct bv_add_chamber_data
*)user
;
86 isl_basic_set
*domain
;
88 ctx
= isl_cell_get_ctx(cell
);
90 domain
= isl_cell_get_domain(cell
);
92 data
->dom
= isl_alloc_type(ctx
, Param_Domain
);
93 data
->dom
->Domain
= isl_basic_set_to_polylib(domain
);
94 data
->dom
->F
= isl_calloc_array(ctx
, unsigned, data
->vertex_len
);
95 data
->dom
->next
= NULL
;
97 isl_basic_set_free(domain
);
99 *data
->next_D
= data
->dom
;
100 data
->next_D
= &data
->dom
->next
;
102 isl_cell_foreach_vertex(cell
, &add_chamber_vertex
, data
);
109 Param_Polyhedron
*ISL_P2PP(Polyhedron
*P
, Polyhedron
*C
,
110 struct barvinok_options
*options
)
113 isl_ctx
*ctx
= isl_ctx_alloc();
115 isl_basic_set
*bset
, *context
;
116 isl_vertices
*vertices
;
117 unsigned nparam
= C
->Dimension
;
118 unsigned nvar
= P
->Dimension
- nparam
;
119 Param_Polyhedron
*PP
= isl_calloc_type(ctx
, Param_Polyhedron
);
120 Param_Vertices
**next_V
;
121 struct bv_add_chamber_data data
;
123 dim
= isl_space_set_alloc(ctx
, nparam
, nvar
);
124 bset
= isl_basic_set_new_from_polylib(P
, dim
);
125 dim
= isl_space_set_alloc(ctx
, nparam
, 0);
126 context
= isl_basic_set_new_from_polylib(C
, dim
);
128 bset
= isl_basic_set_intersect(bset
, context
);
130 vertices
= isl_basic_set_compute_vertices(bset
);
131 isl_basic_set_free(bset
);
134 PP
->nbV
= isl_vertices_get_n_vertices(vertices
);
135 PP
->Constraints
= Polyhedron2Constraints(P
);
138 isl_vertices_foreach_vertex(vertices
, &add_vertex
, &next_V
);
140 data
.next_D
= &PP
->D
;
141 data
.vertex_len
= (PP
->nbV
+ INT_BITS
- 1)/INT_BITS
;
142 isl_vertices_foreach_cell(vertices
, &add_chamber
, &data
);
144 isl_vertices_free(vertices
);