/* * Copyright 2018 Cerebras Systems * * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, * Cerebras Systems, 175 S San Antonio Rd, Los Altos, CA, USA */ /* Bind the expressions of "multi" to parameters with identifiers * specified by "tuple", living in the same space as * (the target space of) "multi", * returning the elements in the domain where the expressions * are equal to the parameters. */ __isl_give DOM *FN(MULTI(BASE),bind)(__isl_take MULTI(BASE) *multi, __isl_take isl_multi_id *tuple) { int i; isl_id *id; isl_stat r; isl_size n; isl_space *multi_space, *tuple_space; EL *el; DOM *bnd; multi_space = isl_space_range(FN(MULTI(BASE),get_space)(multi)); tuple_space = isl_multi_id_peek_space(tuple); r = isl_space_check_equal_tuples(multi_space, tuple_space); isl_space_free(multi_space); if (r < 0) goto error; n = FN(MULTI(BASE),dim)(multi, isl_dim_set); if (n < 0) goto error; if (n == 0) { isl_multi_id_free(tuple); return FN(MULTI(BASE),domain)(multi); } el = FN(MULTI(BASE),get_at)(multi, 0); id = isl_multi_id_get_at(tuple, 0); bnd = FN(EL,bind_id)(el, id); for (i = 1; i < n; ++i) { DOM *bnd_i; el = FN(MULTI(BASE),get_at)(multi, i); id = isl_multi_id_get_at(tuple, i); bnd_i = FN(EL,bind_id)(el, id); bnd_i = FN(DOM,align_params)(bnd_i, FN(DOM,get_space)(bnd)); bnd = FN(DOM,align_params)(bnd, FN(DOM,get_space)(bnd_i)); bnd = FN(DOM,intersect)(bnd, bnd_i); } FN(MULTI(BASE),free)(multi); isl_multi_id_free(tuple); return bnd; error: FN(MULTI(BASE),free)(multi); isl_multi_id_free(tuple); return NULL; }