X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=doc%2Fuser.pod;h=29917dae6698bff040fb323bb86b0e2981ba983c;hb=b4b6b1d9c56cd90541c868ede82b450159121a8a;hp=42d9c43d3cc3a1d955ccf7762f8f8e00fa51a5b4;hpb=a27a0e2748ca6316268cb9d15da5f705b0423ff9;p=platform%2Fupstream%2Fisl.git diff --git a/doc/user.pod b/doc/user.pod index 42d9c43..29917da 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -343,7 +343,163 @@ before the C itself is freed. isl_ctx *isl_ctx_alloc(); void isl_ctx_free(isl_ctx *ctx); -=head2 Integers +=head2 Values + +An C represents an integer value, a rational value +or one of three special values, infinity, negative infinity and NaN. +Some predefined values can be created using the following functions. + + #include + __isl_give isl_val *isl_val_zero(isl_ctx *ctx); + __isl_give isl_val *isl_val_one(isl_ctx *ctx); + __isl_give isl_val *isl_val_nan(isl_ctx *ctx); + __isl_give isl_val *isl_val_infty(isl_ctx *ctx); + __isl_give isl_val *isl_val_neginfty(isl_ctx *ctx); + +Specific integer values can be created using the following functions. + + #include + __isl_give isl_val *isl_val_int_from_si(isl_ctx *ctx, + long i); + __isl_give isl_val *isl_val_int_from_ui(isl_ctx *ctx, + unsigned long u); + +They can be copied and freed using the following functions. + + #include + __isl_give isl_val *isl_val_copy(__isl_keep isl_val *v); + void *isl_val_free(__isl_take isl_val *v); + +They can be inspected using the following functions. + + #include + isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val); + long isl_val_get_num_si(__isl_keep isl_val *v); + long isl_val_get_den_si(__isl_keep isl_val *v); + double isl_val_get_d(__isl_keep isl_val *v); + +Note that C, C and +C can only be applied to rational values. + +An C can be modified using the following function. + + #include + __isl_give isl_val *isl_val_set_si(__isl_take isl_val *v, + long i); + +The following unary properties are defined on Cs. + + #include + int isl_val_sgn(__isl_keep isl_val *v); + int isl_val_is_zero(__isl_keep isl_val *v); + int isl_val_is_one(__isl_keep isl_val *v); + int isl_val_is_negone(__isl_keep isl_val *v); + int isl_val_is_nonneg(__isl_keep isl_val *v); + int isl_val_is_nonpos(__isl_keep isl_val *v); + int isl_val_is_pos(__isl_keep isl_val *v); + int isl_val_is_neg(__isl_keep isl_val *v); + int isl_val_is_int(__isl_keep isl_val *v); + int isl_val_is_rat(__isl_keep isl_val *v); + int isl_val_is_nan(__isl_keep isl_val *v); + int isl_val_is_infty(__isl_keep isl_val *v); + int isl_val_is_neginfty(__isl_keep isl_val *v); + +Note that the sign of NaN is undefined. + +The following binary properties are defined on pairs of Cs. + + #include + int isl_val_lt(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + int isl_val_le(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + int isl_val_gt(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + int isl_val_ge(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + int isl_val_eq(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + int isl_val_ne(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + +For integer Cs we additionally have the following binary property. + + #include + int isl_val_is_divisible_by(__isl_keep isl_val *v1, + __isl_keep isl_val *v2); + +An C can also be compared to an integer using the following +function. The result is undefined for NaN. + + #include + int isl_val_cmp_si(__isl_keep isl_val *v, long i); + +The following unary operations are available on Cs. + + #include + __isl_give isl_val *isl_val_abs(__isl_take isl_val *v); + __isl_give isl_val *isl_val_neg(__isl_take isl_val *v); + __isl_give isl_val *isl_val_floor(__isl_take isl_val *v); + __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v); + __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v); + +The following binary operations are available on Cs. + + #include + __isl_give isl_val *isl_val_abs(__isl_take isl_val *v); + __isl_give isl_val *isl_val_neg(__isl_take isl_val *v); + __isl_give isl_val *isl_val_floor(__isl_take isl_val *v); + __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v); + __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v); + __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v); + __isl_give isl_val *isl_val_min(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_max(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_add(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_add_ui(__isl_take isl_val *v1, + unsigned long v2); + __isl_give isl_val *isl_val_sub(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_sub_ui(__isl_take isl_val *v1, + unsigned long v2); + __isl_give isl_val *isl_val_mul(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_mul_ui(__isl_take isl_val *v1, + unsigned long v2); + __isl_give isl_val *isl_val_div(__isl_take isl_val *v1, + __isl_take isl_val *v2); + +On integer values, we additionally have the following operations. + + #include + __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v); + __isl_give isl_val *isl_val_mod(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_gcd(__isl_take isl_val *v1, + __isl_take isl_val *v2); + __isl_give isl_val *isl_val_gcdext(__isl_take isl_val *v1, + __isl_take isl_val *v2, __isl_give isl_val **x, + __isl_give isl_val **y); + +The function C returns the greatest common divisor g +of C and C as well as two integers C<*x> and C<*y> such +that C<*x> * C + C<*y> * C = g. + +A value can be read from input using + + #include + __isl_give isl_val *isl_val_read_from_str(isl_ctx *ctx, + const char *str); + +A value can be printed using + + #include + __isl_give isl_printer *isl_printer_print_val( + __isl_take isl_printer *p, __isl_keep isl_val *v); + +=head2 Integers (obsolescent) All operations on integers, mainly the coefficients of the constraints describing the sets and relations, @@ -734,6 +890,10 @@ of the original object. __isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space( __isl_keep isl_union_pw_qpolynomial_fold *upwf); + #include + __isl_give isl_space *isl_multi_val_get_space( + __isl_keep isl_multi_val *mv); + #include __isl_give isl_space *isl_aff_get_domain_space( __isl_keep isl_aff *aff); @@ -2165,6 +2325,10 @@ dimensions have opposite values. __isl_give isl_map *isl_map_order_lt(__isl_take isl_map *map, enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2); + __isl_give isl_basic_map *isl_basic_map_order_gt( + __isl_take isl_basic_map *bmap, + enum isl_dim_type type1, int pos1, + enum isl_dim_type type2, int pos2); __isl_give isl_map *isl_map_order_gt(__isl_take isl_map *map, enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2); @@ -2335,6 +2499,11 @@ per space. __isl_take isl_basic_set *bset, enum isl_dim_type type, unsigned first, unsigned n); + __isl_give isl_basic_map * + isl_basic_map_drop_constraints_involving_dims( + __isl_take isl_basic_map *bmap, + enum isl_dim_type type, + unsigned first, unsigned n); __isl_give isl_basic_set * isl_basic_set_drop_constraints_not_involving_dims( __isl_take isl_basic_set *bset, @@ -2812,10 +2981,17 @@ a parametric set as well. __isl_give isl_set *isl_set_preimage_pw_multi_aff( __isl_take isl_set *set, __isl_take isl_pw_multi_aff *pma); + __isl_give isl_map *isl_map_preimage_domain_multi_aff( + __isl_take isl_map *map, + __isl_take isl_multi_aff *ma); + __isl_give isl_union_map * + isl_union_map_preimage_domain_multi_aff( + __isl_take isl_union_map *umap, + __isl_take isl_multi_aff *ma); -These functions compute the preimage of the given set under +These functions compute the preimage of the given set or map domain under the given function. In other words, the expression is plugged -into the set description. +into the set description or into the domain of the map. Objects of types C and C are described in L. @@ -3061,6 +3237,10 @@ returning a basic set or relation. __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom, __isl_give isl_set **empty); + __isl_give isl_pw_multi_aff *isl_set_lexmin_pw_multi_aff( + __isl_take isl_set *set); + __isl_give isl_pw_multi_aff *isl_set_lexmax_pw_multi_aff( + __isl_take isl_set *set); __isl_give isl_pw_multi_aff *isl_map_lexmin_pw_multi_aff( __isl_take isl_map *map); __isl_give isl_pw_multi_aff *isl_map_lexmax_pw_multi_aff( @@ -3069,7 +3249,7 @@ returning a basic set or relation. =head2 Lists Lists are defined over several element types, including -C, C, C, C, +C, C, C, C, C, C, C, C and C. Here we take lists of Cs as an example. Lists can be created, copied, modified and freed using the following functions. @@ -3096,6 +3276,11 @@ Lists can be created, copied, modified and freed using the following functions. __isl_give isl_set_list *isl_set_list_concat( __isl_take isl_set_list *list1, __isl_take isl_set_list *list2); + __isl_give isl_set_list *isl_set_list_sort( + __isl_take isl_set_list *list, + int (*cmp)(__isl_keep isl_set *a, + __isl_keep isl_set *b, void *user), + void *user); void *isl_set_list_free(__isl_take isl_set_list *list); C creates an empty list with a capacity for @@ -3112,6 +3297,18 @@ Lists can be inspected using the following functions. int isl_set_list_foreach(__isl_keep isl_set_list *list, int (*fn)(__isl_take isl_set *el, void *user), void *user); + int isl_set_list_foreach_scc(__isl_keep isl_set_list *list, + int (*follows)(__isl_keep isl_set *a, + __isl_keep isl_set *b, void *user), + void *follows_user + int (*fn)(__isl_take isl_set *el, void *user), + void *fn_user); + +The function C calls C on each of the +strongly connected components of the graph with as vertices the elements +of C and a directed edge from vertex C to vertex C +iff C returns C<1>. The callbacks C and C +should return C<-1> on error. Lists can be printed using @@ -3120,6 +3317,91 @@ Lists can be printed using __isl_take isl_printer *p, __isl_keep isl_set_list *list); +=head2 Multiple Values + +An C object represents a sequence of zero or more values, +living in a set space. + +An C can be constructed from an C +using the following function + + #include + __isl_give isl_multi_val *isl_multi_val_from_val_list( + __isl_take isl_space *space, + __isl_take isl_val_list *list); + +The zero multiple value (with value zero for each set dimension) +can be created using the following function. + + #include + __isl_give isl_multi_val *isl_multi_val_zero( + __isl_take isl_space *space); + +Multiple values can be copied and freed using + + #include + __isl_give isl_multi_val *isl_multi_val_copy( + __isl_keep isl_multi_val *mv); + void *isl_multi_val_free(__isl_take isl_multi_val *mv); + +They can be inspected using + + #include + isl_ctx *isl_multi_val_get_ctx( + __isl_keep isl_multi_val *mv); + unsigned isl_multi_val_dim(__isl_keep isl_multi_val *mv, + enum isl_dim_type type); + __isl_give isl_val *isl_multi_val_get_val( + __isl_keep isl_multi_val *mv, int pos); + const char *isl_multi_val_get_tuple_name( + __isl_keep isl_multi_val *mv, + enum isl_dim_type type); + +They can be modified using + + #include + __isl_give isl_multi_val *isl_multi_val_set_val( + __isl_take isl_multi_val *mv, int pos, + __isl_take isl_val *val); + __isl_give isl_multi_val *isl_multi_val_set_dim_name( + __isl_take isl_multi_val *mv, + enum isl_dim_type type, unsigned pos, const char *s); + __isl_give isl_multi_val *isl_multi_val_set_tuple_name( + __isl_take isl_multi_val *mv, + enum isl_dim_type type, const char *s); + __isl_give isl_multi_val *isl_multi_val_set_tuple_id( + __isl_take isl_multi_val *mv, + enum isl_dim_type type, __isl_take isl_id *id); + + __isl_give isl_multi_val *isl_multi_val_insert_dims( + __isl_take isl_multi_val *mv, + enum isl_dim_type type, unsigned first, unsigned n); + __isl_give isl_multi_val *isl_multi_val_add_dims( + __isl_take isl_multi_val *mv, + enum isl_dim_type type, unsigned n); + __isl_give isl_multi_val *isl_multi_val_drop_dims( + __isl_take isl_multi_val *mv, + enum isl_dim_type type, unsigned first, unsigned n); + +Operations include + + #include + __isl_give isl_multi_val *isl_multi_val_align_params( + __isl_take isl_multi_val *mv, + __isl_take isl_space *model); + __isl_give isl_multi_val *isl_multi_val_range_splice( + __isl_take isl_multi_val *mv1, unsigned pos, + __isl_take isl_multi_val *mv2); + __isl_give isl_multi_val *isl_multi_val_range_product( + __isl_take isl_multi_val *mv1, + __isl_take isl_multi_val *mv2); + __isl_give isl_multi_val *isl_multi_val_flat_range_product( + __isl_take isl_multi_val *mv1, + __isl_take isl_multi_aff *mv2); + __isl_give isl_multi_val *isl_multi_val_add_val( + __isl_take isl_multi_val *mv, + __isl_take isl_val *v); + =head2 Vectors Vectors can be created, copied and freed using the following functions. @@ -3164,7 +3446,7 @@ Matrices can be created, copied and freed using the following functions. __isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx, unsigned n_row, unsigned n_col); __isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat); - void isl_mat_free(__isl_take isl_mat *mat); + void *isl_mat_free(__isl_take isl_mat *mat); Note that the elements of a newly created matrix may have arbitrary values. The elements can be changed and inspected using the following functions. @@ -3884,15 +4166,44 @@ Operations include __isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add( __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2); + __isl_give isl_multi_aff *isl_multi_aff_sub( + __isl_take isl_multi_aff *ma1, + __isl_take isl_multi_aff *ma2); + __isl_give isl_pw_multi_aff *isl_pw_multi_aff_sub( + __isl_take isl_pw_multi_aff *pma1, + __isl_take isl_pw_multi_aff *pma2); + __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_sub( + __isl_take isl_union_pw_multi_aff *upma1, + __isl_take isl_union_pw_multi_aff *upma2); + +C subtracts the second argument from the first. + __isl_give isl_multi_aff *isl_multi_aff_scale( __isl_take isl_multi_aff *maff, isl_int f); + __isl_give isl_multi_aff *isl_multi_aff_scale_vec( + __isl_take isl_multi_aff *ma, + __isl_take isl_vec *v); + __isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_vec( + __isl_take isl_pw_multi_aff *pma, + __isl_take isl_vec *v); + __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_scale_vec( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_vec *v); + +C scales the first elements of C +by the corresponding elements of C. + __isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_params( __isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_domain( __isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_intersect_domain( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_union_set *uset); __isl_give isl_multi_aff *isl_multi_aff_lift( __isl_take isl_multi_aff *maff, __isl_give isl_local_space **ls); @@ -5086,6 +5397,9 @@ A band can be tiled using the following function. int isl_options_set_tile_scale_tile_loops(isl_ctx *ctx, int val); int isl_options_get_tile_scale_tile_loops(isl_ctx *ctx); + int isl_options_set_tile_shift_point_loops(isl_ctx *ctx, + int val); + int isl_options_get_tile_shift_point_loops(isl_ctx *ctx); The C function tiles the band using the given tile sizes inside its schedule. @@ -5093,6 +5407,15 @@ A new child band is created to represent the point loops and it is inserted between the modified band and its children. The C option specifies whether the tile loops iterators should be scaled by the tile sizes. +If the C option is set, then the point loops +are shifted to start at zero. + +A band can be split into two nested bands using the following function. + + int isl_band_split(__isl_keep isl_band *band, int pos); + +The resulting outer band contains the first C dimensions of C +while the inner band contains the remaining dimensions. A representation of the band can be printed using @@ -5657,6 +5980,9 @@ while printing the AST. int isl_options_set_ast_build_allow_else(isl_ctx *ctx, int val); int isl_options_get_ast_build_allow_else(isl_ctx *ctx); + int isl_options_set_ast_build_allow_or(isl_ctx *ctx, + int val); + int isl_options_get_ast_build_allow_or(isl_ctx *ctx); =over @@ -5755,6 +6081,11 @@ to scale down iterators of strided loops. This option specifies whether the AST generator is allowed to construct if statements with else branches. +=item * ast_build_allow_or + +This option specifies whether the AST generator is allowed +to construct if conditions with disjunctions. + =back =head3 Fine-grained Control over AST Generation