- isl_dim *wrap;
-
- if (!dim)
- return NULL;
-
- wrap = isl_dim_alloc(dim->ctx, dim->nparam, 0, dim->n_in + dim->n_out);
-
- wrap = copy_ids(wrap, isl_dim_param, 0, dim, isl_dim_param);
- wrap = copy_ids(wrap, isl_dim_set, 0, dim, isl_dim_in);
- wrap = copy_ids(wrap, isl_dim_set, dim->n_in, dim, isl_dim_out);
-
- if (!wrap)
- goto error;
-
- wrap->nested[1] = dim;
-
- return wrap;
-error:
- isl_dim_free(dim);
- return NULL;
-}
-
-__isl_give isl_dim *isl_dim_unwrap(__isl_take isl_dim *dim)
-{
- isl_dim *unwrap;
-
- if (!dim)
- return NULL;
-
- if (!isl_dim_is_wrapping(dim))
- isl_die(dim->ctx, isl_error_invalid, "not a wrapping dim",
- goto error);
-
- unwrap = isl_dim_copy(dim->nested[1]);
- isl_dim_free(dim);
-
- return unwrap;
-error:
- isl_dim_free(dim);
- return NULL;
-}
-
-int isl_dim_is_named_or_nested(__isl_keep isl_dim *dim, enum isl_dim_type type)
-{
- if (type != isl_dim_in && type != isl_dim_out)
- return 0;
- if (!dim)
- return -1;
- if (dim->tuple_id[type - isl_dim_in])
- return 1;
- if (dim->nested[type - isl_dim_in])
- return 1;
- return 0;
-}
-
-int isl_dim_may_be_set(__isl_keep isl_dim *dim)
-{
- if (!dim)
- return -1;
- if (isl_dim_size(dim, isl_dim_in) != 0)
- return 0;
- if (isl_dim_is_named_or_nested(dim, isl_dim_in))
- return 0;
- return 1;
-}
-
-__isl_give isl_dim *isl_dim_reset(__isl_take isl_dim *dim,
- enum isl_dim_type type)
-{
- if (!isl_dim_is_named_or_nested(dim, type))
- return dim;
-
- dim = isl_dim_cow(dim);
- if (!dim)
- return NULL;
-
- isl_id_free(dim->tuple_id[type - isl_dim_in]);
- dim->tuple_id[type - isl_dim_in] = NULL;
- isl_dim_free(dim->nested[type - isl_dim_in]);
- dim->nested[type - isl_dim_in] = NULL;
-
- return dim;
-}
-
-__isl_give isl_dim *isl_dim_flatten(__isl_take isl_dim *dim)
-{
- if (!dim)
- return NULL;
- if (!dim->nested[0] && !dim->nested[1])
- return dim;
-
- if (dim->nested[0])
- dim = isl_dim_reset(dim, isl_dim_in);
- if (dim && dim->nested[1])
- dim = isl_dim_reset(dim, isl_dim_out);
-
- return dim;
-}
-
-__isl_give isl_dim *isl_dim_flatten_range(__isl_take isl_dim *dim)
-{
- if (!dim)
- return NULL;
- if (!dim->nested[1])
- return dim;
-
- return isl_dim_reset(dim, isl_dim_out);
-}
-
-/* Replace the dimensions of the given type of dst by those of src.
- */
-__isl_give isl_dim *isl_dim_replace(__isl_take isl_dim *dst,
- enum isl_dim_type type, __isl_keep isl_dim *src)
-{
- dst = isl_dim_cow(dst);
-
- if (!dst || !src)
- goto error;
-
- dst = isl_dim_drop(dst, type, 0, isl_dim_size(dst, type));
- dst = isl_dim_add(dst, type, isl_dim_size(src, type));
- dst = copy_ids(dst, type, 0, src, type);
-
- if (dst && type == isl_dim_param) {
- int i;
- for (i = 0; i <= 1; ++i) {
- if (!dst->nested[i])
- continue;
- dst->nested[i] = isl_dim_replace(dst->nested[i],
- type, src);
- if (!dst->nested[i])
- goto error;
- }
- }
-
- return dst;
-error:
- isl_dim_free(dst);
- return NULL;
-}
-
-/* Given a dimension specification "dim" of a set, create a dimension
- * specification for the lift of the set. In particular, the result
- * is of the form [dim -> local[..]], with n_local variables in the
- * range of the wrapped map.
- */
-__isl_give isl_dim *isl_dim_lift(__isl_take isl_dim *dim, unsigned n_local)
-{
- isl_dim *local_dim;
-
- if (!dim)
- return NULL;
-
- local_dim = isl_dim_dup(dim);
- local_dim = isl_dim_drop(local_dim, isl_dim_set, 0, dim->n_out);
- local_dim = isl_dim_add(local_dim, isl_dim_set, n_local);
- local_dim = isl_dim_set_tuple_name(local_dim, isl_dim_set, "local");
- dim = isl_dim_join(isl_dim_from_domain(dim),
- isl_dim_from_range(local_dim));
- dim = isl_dim_wrap(dim);
- dim = isl_dim_set_tuple_name(dim, isl_dim_set, "lifted");
-
- return dim;
-}
-
-int isl_dim_can_zip(__isl_keep isl_dim *dim)
-{
- if (!dim)
- return -1;
-
- return dim->nested[0] && dim->nested[1];
-}
-
-__isl_give isl_dim *isl_dim_zip(__isl_take isl_dim *dim)
-{
- isl_dim *dom, *ran;
- isl_dim *dom_dom, *dom_ran, *ran_dom, *ran_ran;
-
- if (!isl_dim_can_zip(dim))
- isl_die(dim->ctx, isl_error_invalid, "dim cannot be zipped",
- goto error);
-
- if (!dim)
- return 0;
- dom = isl_dim_unwrap(isl_dim_domain(isl_dim_copy(dim)));
- ran = isl_dim_unwrap(isl_dim_range(dim));
- dom_dom = isl_dim_domain(isl_dim_copy(dom));
- dom_ran = isl_dim_range(dom);
- ran_dom = isl_dim_domain(isl_dim_copy(ran));
- ran_ran = isl_dim_range(ran);
- dom = isl_dim_join(isl_dim_from_domain(dom_dom),
- isl_dim_from_range(ran_dom));
- ran = isl_dim_join(isl_dim_from_domain(dom_ran),
- isl_dim_from_range(ran_ran));
- return isl_dim_join(isl_dim_from_domain(isl_dim_wrap(dom)),
- isl_dim_from_range(isl_dim_wrap(ran)));
-error:
- isl_dim_free(dim);
- return NULL;
-}
-
-int isl_dim_has_named_params(__isl_keep isl_dim *dim)
-{
- int i;
- unsigned off;
-
- if (!dim)
- return -1;
- if (dim->nparam == 0)
- return 1;
- off = isl_dim_offset(dim, isl_dim_param);
- if (off + dim->nparam > dim->n_id)
- return 0;
- for (i = 0; i < dim->nparam; ++i)
- if (!dim->ids[off + i])
- return 0;
- return 1;
-}
-
-/* Align the initial parameters of dim1 to match the order in dim2.
- */
-__isl_give isl_dim *isl_dim_align_params(__isl_take isl_dim *dim1,
- __isl_take isl_dim *dim2)
-{
- isl_reordering *exp;
-
- if (!isl_dim_has_named_params(dim1) || !isl_dim_has_named_params(dim2))
- isl_die(isl_dim_get_ctx(dim1), isl_error_invalid,
- "parameter alignment requires named parameters",
- goto error);
-
- exp = isl_parameter_alignment_reordering(dim1, dim2);
- isl_dim_free(dim1);
- isl_dim_free(dim2);
- if (!exp)
- return NULL;
- dim1 = isl_dim_copy(exp->dim);
- isl_reordering_free(exp);
- return dim1;
-error:
- isl_dim_free(dim1);
- isl_dim_free(dim2);
- return NULL;