4 #include "isl_map_polylib.h"
5 #include "isl_map_private.h"
7 static void copy_values_from(isl_int *dst, Value *src, unsigned n)
11 for (i = 0; i < n; ++i)
12 value_assign(dst[i], src[i]);
15 static void copy_values_to(Value *dst, isl_int *src, unsigned n)
19 for (i = 0; i < n; ++i)
20 value_assign(dst[i], src[i]);
23 static void copy_constraint_from(isl_int *dst, Value *src,
24 unsigned nparam, unsigned dim, unsigned extra)
26 copy_values_from(dst, src+1+dim+extra+nparam, 1);
27 copy_values_from(dst+1, src+1+dim+extra, nparam);
28 copy_values_from(dst+1+nparam, src+1, dim);
29 copy_values_from(dst+1+nparam+dim, src+1+dim, extra);
32 static void copy_constraint_to(Value *dst, isl_int *src,
33 unsigned nparam, unsigned dim, unsigned extra)
35 copy_values_to(dst+1+dim+extra+nparam, src, 1);
36 copy_values_to(dst+1+dim+extra, src+1, nparam);
37 copy_values_to(dst+1, src+1+nparam, dim);
38 copy_values_to(dst+1+dim, src+1+nparam+dim, extra);
41 static int add_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
47 int i = isl_basic_map_alloc_equality(bmap);
50 nparam = isl_basic_map_n_param(bmap);
51 n_in = isl_basic_map_n_in(bmap);
52 n_out = isl_basic_map_n_out(bmap);
53 copy_constraint_from(bmap->eq[i], constraint, nparam,
54 n_in + n_out, bmap->extra);
58 static int add_inequality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
64 int i = isl_basic_map_alloc_inequality(bmap);
67 nparam = isl_basic_map_n_param(bmap);
68 n_in = isl_basic_map_n_in(bmap);
69 n_out = isl_basic_map_n_out(bmap);
70 copy_constraint_from(bmap->ineq[i], constraint, nparam,
71 n_in + n_out, bmap->extra);
75 static struct isl_basic_map *copy_constraints(
76 struct isl_ctx *ctx, struct isl_basic_map *bmap,
80 unsigned total = isl_basic_map_total_dim(bmap);
82 for (i = 0; i < P->NbConstraints; ++i) {
83 if (value_zero_p(P->Constraint[i][0])) {
84 if (add_equality(ctx, bmap, P->Constraint[i]))
87 if (add_inequality(ctx, bmap, P->Constraint[i]))
91 for (i = 0; i < bmap->extra; ++i) {
92 int j = isl_basic_map_alloc_div(bmap);
95 isl_seq_clr(bmap->div[j], 1+1+total);
99 isl_basic_map_free(bmap);
103 struct isl_basic_set *isl_basic_set_new_from_polylib(
105 Polyhedron *P, unsigned nparam, unsigned dim)
107 return (struct isl_basic_set *)
108 isl_basic_map_new_from_polylib(ctx, P, nparam, 0, dim);
111 struct isl_basic_map *isl_basic_map_new_from_polylib(
112 struct isl_ctx *ctx, Polyhedron *P,
113 unsigned nparam, unsigned in, unsigned out)
115 struct isl_basic_map *bmap;
118 isl_assert(ctx, P, return NULL);
119 isl_assert(ctx, P->Dimension >= nparam + in + out, return NULL);
121 extra = P->Dimension - nparam - in - out;
122 bmap = isl_basic_map_alloc(ctx, nparam, in, out, extra,
123 P->NbEq, P->NbConstraints - P->NbEq);
127 bmap = copy_constraints(ctx, bmap, P);
128 bmap = isl_basic_map_simplify(bmap);
129 return isl_basic_map_finalize(bmap);
132 struct isl_set *isl_set_new_from_polylib(struct isl_ctx *ctx,
133 Polyhedron *D, unsigned nparam, unsigned dim)
135 struct isl_set *set = NULL;
139 for (P = D; P; P = P->next)
142 set = isl_set_alloc(ctx, nparam, dim, n, ISL_MAP_DISJOINT);
146 for (P = D; P; P = P->next)
148 isl_basic_set_new_from_polylib(ctx, P, nparam, dim));
149 set = isl_set_remove_empty_parts(set);
153 struct isl_map *isl_map_new_from_polylib(struct isl_ctx *ctx,
155 unsigned nparam, unsigned in, unsigned out)
157 struct isl_map *map = NULL;
161 for (P = D; P; P = P->next)
164 map = isl_map_alloc(ctx, nparam, in, out, n, ISL_MAP_DISJOINT);
168 for (P = D; P; P = P->next)
169 isl_map_add(map, isl_basic_map_new_from_polylib(ctx, P,
171 map = isl_map_remove_empty_parts(map);
175 Polyhedron *isl_basic_map_to_polylib(struct isl_basic_map *bmap)
188 nparam = isl_basic_map_n_param(bmap);
189 n_in = isl_basic_map_n_in(bmap);
190 n_out = isl_basic_map_n_out(bmap);
191 M = Matrix_Alloc(bmap->n_eq + bmap->n_ineq,
192 1 + n_in + n_out + bmap->n_div + nparam + 1);
193 for (i = 0; i < bmap->n_eq; ++i) {
194 value_set_si(M->p[i][0], 0);
195 copy_constraint_to(M->p[i], bmap->eq[i],
196 nparam, n_in + n_out, bmap->n_div);
199 for (i = 0; i < bmap->n_ineq; ++i) {
200 value_set_si(M->p[off+i][0], 1);
201 copy_constraint_to(M->p[off+i], bmap->ineq[i],
202 nparam, n_in + n_out, bmap->n_div);
204 P = Constraints2Polyhedron(M, bmap->ctx->MaxRays);
210 Polyhedron *isl_map_to_polylib(struct isl_map *map)
213 Polyhedron *R = NULL;
214 Polyhedron **next = &R;
219 for (i = 0; i < map->n; ++i) {
220 *next = isl_basic_map_to_polylib(map->p[i]);
221 next = &(*next)->next;
224 return R ? R : Empty_Polyhedron(isl_dim_total(map->dim));
227 Polyhedron *isl_basic_set_to_polylib(struct isl_basic_set *bset)
229 return isl_basic_map_to_polylib((struct isl_basic_map *)bset);
232 Polyhedron *isl_set_to_polylib(struct isl_set *set)
234 return isl_map_to_polylib((struct isl_map *)set);