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
,
44 int i
= isl_basic_map_alloc_equality(bmap
);
47 copy_constraint_from(bmap
->eq
[i
], constraint
, bmap
->nparam
,
48 bmap
->n_in
+ bmap
->n_out
, bmap
->extra
);
52 static int add_inequality(struct isl_ctx
*ctx
, struct isl_basic_map
*bmap
,
55 int i
= isl_basic_map_alloc_inequality(bmap
);
58 copy_constraint_from(bmap
->ineq
[i
], constraint
, bmap
->nparam
,
59 bmap
->n_in
+ bmap
->n_out
, bmap
->extra
);
63 static struct isl_basic_map
*copy_constraints(
64 struct isl_ctx
*ctx
, struct isl_basic_map
*bmap
,
68 unsigned total
= bmap
->nparam
+ bmap
->n_in
+ bmap
->n_out
+ bmap
->extra
;
70 for (i
= 0; i
< P
->NbConstraints
; ++i
) {
71 if (value_zero_p(P
->Constraint
[i
][0])) {
72 if (add_equality(ctx
, bmap
, P
->Constraint
[i
]))
75 if (add_inequality(ctx
, bmap
, P
->Constraint
[i
]))
79 for (i
= 0; i
< bmap
->extra
; ++i
) {
80 int j
= isl_basic_map_alloc_div(bmap
);
83 isl_seq_clr(bmap
->div
[j
], 1+1+total
);
87 isl_basic_map_free(bmap
);
91 struct isl_basic_set
*isl_basic_set_new_from_polylib(
93 Polyhedron
*P
, unsigned nparam
, unsigned dim
)
95 return (struct isl_basic_set
*)
96 isl_basic_map_new_from_polylib(ctx
, P
, nparam
, 0, dim
);
99 struct isl_basic_map
*isl_basic_map_new_from_polylib(
100 struct isl_ctx
*ctx
, Polyhedron
*P
,
101 unsigned nparam
, unsigned in
, unsigned out
)
103 struct isl_basic_map
*bmap
;
106 isl_assert(ctx
, P
, return NULL
);
107 isl_assert(ctx
, P
->Dimension
>= nparam
+ in
+ out
, return NULL
);
109 extra
= P
->Dimension
- nparam
- in
- out
;
110 bmap
= isl_basic_map_alloc(ctx
, nparam
, in
, out
, extra
,
111 P
->NbEq
, P
->NbConstraints
- P
->NbEq
);
115 bmap
= copy_constraints(ctx
, bmap
, P
);
116 bmap
= isl_basic_map_simplify(bmap
);
117 return isl_basic_map_finalize(bmap
);
120 struct isl_set
*isl_set_new_from_polylib(struct isl_ctx
*ctx
,
121 Polyhedron
*D
, unsigned nparam
, unsigned dim
)
123 struct isl_set
*set
= NULL
;
127 for (P
= D
; P
; P
= P
->next
)
130 set
= isl_set_alloc(ctx
, nparam
, dim
, n
, ISL_MAP_DISJOINT
);
134 for (P
= D
; P
; P
= P
->next
)
136 isl_basic_set_new_from_polylib(ctx
, P
, nparam
, dim
));
137 set
= isl_set_remove_empty_parts(set
);
141 struct isl_map
*isl_map_new_from_polylib(struct isl_ctx
*ctx
,
143 unsigned nparam
, unsigned in
, unsigned out
)
145 struct isl_map
*map
= NULL
;
149 for (P
= D
; P
; P
= P
->next
)
152 map
= isl_map_alloc(ctx
, nparam
, in
, out
, n
, ISL_MAP_DISJOINT
);
156 for (P
= D
; P
; P
= P
->next
)
157 isl_map_add(map
, isl_basic_map_new_from_polylib(ctx
, P
,
159 map
= isl_map_remove_empty_parts(map
);
163 Polyhedron
*isl_basic_map_to_polylib(struct isl_basic_map
*bmap
)
173 M
= Matrix_Alloc(bmap
->n_eq
+ bmap
->n_ineq
,
174 1 + bmap
->n_in
+ bmap
->n_out
+ bmap
->n_div
+ bmap
->nparam
+ 1);
175 for (i
= 0; i
< bmap
->n_eq
; ++i
) {
176 value_set_si(M
->p
[i
][0], 0);
177 copy_constraint_to(M
->p
[i
], bmap
->eq
[i
],
178 bmap
->nparam
, bmap
->n_in
+ bmap
->n_out
, bmap
->n_div
);
181 for (i
= 0; i
< bmap
->n_ineq
; ++i
) {
182 value_set_si(M
->p
[off
+i
][0], 1);
183 copy_constraint_to(M
->p
[off
+i
], bmap
->ineq
[i
],
184 bmap
->nparam
, bmap
->n_in
+ bmap
->n_out
, bmap
->n_div
);
186 P
= Constraints2Polyhedron(M
, bmap
->ctx
->MaxRays
);
192 Polyhedron
*isl_map_to_polylib(struct isl_map
*map
)
195 Polyhedron
*R
= NULL
;
196 Polyhedron
**next
= &R
;
201 for (i
= 0; i
< map
->n
; ++i
) {
202 *next
= isl_basic_map_to_polylib(map
->p
[i
]);
203 next
= &(*next
)->next
;
206 return R
? R
: Empty_Polyhedron(map
->nparam
+ map
->n_in
+ map
->n_out
);
209 Polyhedron
*isl_basic_set_to_polylib(struct isl_basic_set
*bset
)
211 return isl_basic_map_to_polylib((struct isl_basic_map
*)bset
);
214 Polyhedron
*isl_set_to_polylib(struct isl_set
*set
)
216 return isl_map_to_polylib((struct isl_map
*)set
);