add isl_pw_*_intersect_params
[platform/upstream/isl.git] / isl_input.c
index f8df835..320703a 100644 (file)
@@ -899,7 +899,7 @@ static __isl_give isl_map *read_tuple(struct isl_stream *s,
                nested = read_nested_tuple(s, isl_map_universe(dim), v);
                if (type == isl_dim_in) {
                        nested = isl_map_reverse(nested);
-                       map = isl_map_intersect(nested, map);
+                       map = isl_map_intersect_params(nested, map);
                } else {
                        isl_set *set;
                        dim = isl_set_get_space(nested);
@@ -1058,9 +1058,14 @@ static int resolve_paren_expr(struct isl_stream *s,
        if (!tok || tok->type != '(')
                goto error;
 
+       if (isl_stream_next_token_is(s, '('))
+               if (resolve_paren_expr(s, v, isl_map_copy(map)))
+                       goto error;
+
        if (isl_stream_next_token_is(s, ISL_TOKEN_EXISTS) ||
            isl_stream_next_token_is(s, ISL_TOKEN_TRUE) ||
-           isl_stream_next_token_is(s, ISL_TOKEN_FALSE)) {
+           isl_stream_next_token_is(s, ISL_TOKEN_FALSE) ||
+           isl_stream_next_token_is(s, ISL_TOKEN_MAP)) {
                map = read_disjuncts(s, v, map);
                if (isl_stream_eat(s, ')'))
                        goto error;
@@ -2609,3 +2614,72 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(isl_ctx *ctx,
        isl_stream_free(s);
        return pma;
 }
+
+/* Read a multi-affine expression from "s".
+ * We call isl_stream_read_pw_multi_aff to parse a possibly piecewise
+ * multi-affine expression and then check that the result is
+ * a single multi-affine expression on a universe domain.
+ */
+__isl_give isl_multi_aff *isl_stream_read_multi_aff(struct isl_stream *s)
+{
+       isl_pw_multi_aff *pma;
+       isl_multi_aff *maff;
+
+       pma = isl_stream_read_pw_multi_aff(s);
+       if (!pma)
+               return NULL;
+       if (pma->n != 1)
+               isl_die(s->ctx, isl_error_invalid,
+                       "expecting single list of affine expressions",
+                       return isl_pw_multi_aff_free(pma));
+       if (!isl_set_plain_is_universe(pma->p[0].set))
+               isl_die(s->ctx, isl_error_invalid, "expecting universe domain",
+                       return isl_pw_multi_aff_free(pma));
+       maff = isl_multi_aff_copy(pma->p[0].maff);
+       isl_pw_multi_aff_free(pma);
+       return maff;
+}
+
+__isl_give isl_multi_aff *isl_multi_aff_read_from_str(isl_ctx *ctx,
+       const char *str)
+{
+       isl_multi_aff *maff;
+       struct isl_stream *s = isl_stream_new_str(ctx, str);
+       if (!s)
+               return NULL;
+       maff = isl_stream_read_multi_aff(s);
+       isl_stream_free(s);
+       return maff;
+}
+
+__isl_give isl_union_pw_qpolynomial *isl_stream_read_union_pw_qpolynomial(
+       struct isl_stream *s)
+{
+       struct isl_obj obj;
+
+       obj = obj_read(s);
+       if (obj.type == isl_obj_pw_qpolynomial) {
+               obj.type = isl_obj_union_pw_qpolynomial;
+               obj.v = isl_union_pw_qpolynomial_from_pw_qpolynomial(obj.v);
+       }
+       if (obj.v)
+               isl_assert(s->ctx, obj.type == isl_obj_union_pw_qpolynomial,
+                          goto error);
+
+       return obj.v;
+error:
+       obj.type->free(obj.v);
+       return NULL;
+}
+
+__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_read_from_str(
+       isl_ctx *ctx, const char *str)
+{
+       isl_union_pw_qpolynomial *upwqp;
+       struct isl_stream *s = isl_stream_new_str(ctx, str);
+       if (!s)
+               return NULL;
+       upwqp = isl_stream_read_union_pw_qpolynomial(s);
+       isl_stream_free(s);
+       return upwqp;
+}