isl使用方法

isl是一個用於多面體模型調度實現的c/c++庫。通過isl,我們可以對模型進行自動的調度,循環優化等。

isl內部對象介紹


1.isl_ctx對象的創建(初始化):

整數集和關係的所有操作都在的上下文中發生isl_ctx。給定isl_ctx只能在單個線程中使用。一個函數的所有參數都必須在同一上下文中分配。當前沒有功能可用於將對象從一個移動isl_ctx到另一個isl_ctx。這意味着當前無法安全地將對象從一個線程移動到另一個線程,除非整個線程isl_ctx都移動了。

一個isl_ctx可以使用分配isl_ctx_alloc和使用中解脫出來isl_ctx_free。在isl_ctx釋放之前,應釋放內分配的所有對象isl_ctx。

isl_ctx 對象就像一根一樣把上下文關係(對象)連接起來。

isl_ctx *isl_ctx_alloc();
void isl_ctx_free(isl_ctx *ctx);

測試:

isl_ctx *isl = isl_ctx_alloc(); // 創建對象
cout << isl << endl;
isl_ctx_free(isl); // 釋放

輸出是一個地址值,可以看出來該指針指向一個對象。

同時,我們還可以爲 isl_ctx 對象指定低級 op 數量的範圍(bound)。例如:

void isl_ctx_set_max_operations(isl_ctx *ctx,
        unsigned long max_operations);
unsigned long isl_ctx_get_max_operations(isl_ctx *ctx);
void isl_ctx_reset_operations(isl_ctx *ctx);

上面說了ctx相當於線將各種對象連接起來,那麼我們還可以通過上下文對象來得到ctx:

#include <isl/val.h>
isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val);
isl_ctx *isl_multi_val_get_ctx(
        __isl_keep isl_multi_val *mv);

#include <isl/id.h>
isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id);
isl_ctx *isl_multi_id_get_ctx(
        __isl_keep isl_multi_id *mi);

#include <isl/local_space.h>
isl_ctx *isl_local_space_get_ctx(
        __isl_keep isl_local_space *ls);

#include <isl/set.h>
isl_ctx *isl_set_list_get_ctx(
        __isl_keep isl_set_list *list);

#include <isl/aff.h>
isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
isl_ctx *isl_multi_aff_get_ctx(
        __isl_keep isl_multi_aff *maff);
isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pa);
isl_ctx *isl_pw_multi_aff_get_ctx(
        __isl_keep isl_pw_multi_aff *pma);
isl_ctx *isl_multi_pw_aff_get_ctx(
        __isl_keep isl_multi_pw_aff *mpa);
isl_ctx *isl_union_pw_aff_get_ctx(
        __isl_keep isl_union_pw_aff *upa);
isl_ctx *isl_union_pw_multi_aff_get_ctx(
        __isl_keep isl_union_pw_multi_aff *upma);
isl_ctx *isl_multi_union_pw_aff_get_ctx(
        __isl_keep isl_multi_union_pw_aff *mupa);

#include <isl/id_to_ast_expr.h>
isl_ctx *isl_id_to_ast_expr_get_ctx(
        __isl_keep isl_id_to_ast_expr *id2expr);

#include <isl/point.h>
isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);

#include <isl/vec.h>
isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec);

#include <isl/mat.h>
isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);

#include <isl/vertices.h>
isl_ctx *isl_vertices_get_ctx(
        __isl_keep isl_vertices *vertices);
isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);

#include <isl/flow.h>
isl_ctx *isl_restriction_get_ctx(
        __isl_keep isl_restriction *restr);
isl_ctx *isl_union_access_info_get_ctx(
        __isl_keep isl_union_access_info *access);
isl_ctx *isl_union_flow_get_ctx(
        __isl_keep isl_union_flow *flow);

#include <isl/schedule.h>
isl_ctx *isl_schedule_get_ctx(
        __isl_keep isl_schedule *sched);
isl_ctx *isl_schedule_constraints_get_ctx(
        __isl_keep isl_schedule_constraints *sc);

#include <isl/schedule_node.h>
isl_ctx *isl_schedule_node_get_ctx(
        __isl_keep isl_schedule_node *node);

#include <isl/ast_build.h>
isl_ctx *isl_ast_build_get_ctx(
        __isl_keep isl_ast_build *build);

#include <isl/ast.h>
isl_ctx *isl_ast_expr_get_ctx(
        __isl_keep isl_ast_expr *expr);
isl_ctx *isl_ast_node_get_ctx(
        __isl_keep isl_ast_node *node);

#include <isl/stride_info.h>
isl_ctx *isl_stride_info_get_ctx(
        __isl_keep isl_stride_info *si);

#include <isl/fixed_box.h>
isl_ctx *isl_fixed_box_get_ctx(
        __isl_keep isl_fixed_box *box);

2.返回的結果

isl isl_size對返回非負值(通常是數字或位置)的函數使用特殊的返回類型。除了常規的非負返回值外,isl_size_error還可能返回一個特殊的(負)值,表明出錯。

isl對於返回布爾值或原則上不返回任何值的函數,它也使用兩種特殊的返回類型。特別是,該isl_bool類型具有三個可能的值:(isl_bool_true一個正整數),表示true或yes;isl_bool_false(整數值零),表示false或no;和isl_bool_error(負整數值),表示出了點問題。在上定義了以下操作isl_bool。該函數isl_bool_not可以被用於否定的isl_bool,其中的否定isl_bool_error是isl_bool_error一次。該函數isl_bool_ok將整數轉換爲isl_bool。任何非零值的收益率isl_bool_true和零收益率isl_bool_false。

  • bool
int a = 0;
isl_bool result = isl_bool_ok(a);
cout << result << endl;

輸出結果爲0

3.isl_val對象

一個 isl_val 對象表示整數值有理值或三個特殊值之一,即無窮大,負無窮大和正無窮大。可以使用以下功能創建一些預定義的值:

#include <isl/val.h>
__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_negone(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);

測試:

isl_val * val = isl_val_zero(isl);
cout << val << endl;

輸出:

0x93c6080

可以使用以下函數創建特定的整數值:

#include <isl/val.h>
__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);
__isl_give isl_val *isl_val_int_from_chunks(isl_ctx *ctx,
        size_t n, size_t size, const void *chunks);

一個isl_val可以使用下面的函數來修改

#include <isl/val.h>
__isl_give isl_val *isl_val_set_si(__isl_take isl_val *v,
        long i);

可以使用以下功能複製釋放 isl_val 。

#include <isl/val.h>
__isl_give isl_val *isl_val_copy(__isl_keep isl_val *v);
__isl_null isl_val *isl_val_free(__isl_take isl_val *v);

對於這樣的數值對象我們還可以對其進行一元運算、二元運算等,具體運算函數可以參考文檔。

3.集合(set)與關係或映射(map)

isl使用六種類型的代表集合和關係的對象,isl_basic_set,isl_basic_map,isl_set,isl_map,isl_union_set和isl_union_map(這些其實都是對象)。isl_basic_set和isl_basic_map分別代表可仿射約束的集合和關係,而isl_set和isl_map分別代表isl_basic_sets和isl_basic_maps 的並集。但是,所有isl_basic_sets或isl_basic_maps都必須居住在同一空間中。isl_union_sets和isl_union_maps表示isl_sets或isl_maps在不同空間中的並集,如果空間的維數和/或名稱不同,則它們被認爲是不同的(請參見“空間”)。集和關係(映射)之間的區別在於,set具有一組變量,而map具有兩組變量,即輸入變量和輸出變量。

4.錯誤處理

isl在觸發運行時錯誤時,支持不同的反應方式。例如,如果isl_map_intersect用兩個具有不兼容空間的映射調用諸如之類的函數,則會出現運行時錯誤。有三種對錯誤做出反應的方式:警告,繼續或中止。

默認行爲是警告。在這種模式下,isl打印警告,將最後一個錯誤存儲在相應isl_ctx的錯誤中,觸發錯誤的函數將返回一個值,指示發生了某些錯誤。如果函數返回指針,則該值爲NULL。在返回一個功能的情況下isl_size,isl_bool或者isl_stat,這個值isl_size_error,isl_bool_error或isl_stat_error。錯誤不會破壞內部狀態,因此可以繼續使用isl。isl還提供了讀取上一個錯誤的功能,包括特定的錯誤消息,發生錯誤的isl源文件和行號,以及重置有關上一個錯誤的所有信息。最後的錯誤僅用於提供信息。它的存在不會改變的行爲isl。因此,重新設置錯誤並不需要繼續使用isl,而只是爲了觀察新的錯誤。

5.isl_id對象

標識符用於識別單個維度和維度元組。它們由一個可選的名稱和一個可選的用戶指針(代表該id對象標識哪個對象)組成。但是,名稱和用戶指針不能都爲NULL。具有相同名稱但指針值不同的標識符被認爲是不同的。同樣,具有不同名稱但指針值相同的標識符也被認爲是不同的。相同的標識符使用相同的對象表示。因此,可以使用==運算符測試成對的標識符是否相等。可以使用以下功能構造,複製,釋放,檢查和打印標識符。

#include <isl/id.h>
__isl_give isl_id *isl_id_alloc(isl_ctx *ctx,
        __isl_keep const char *name, void *user);
__isl_give isl_id *isl_id_set_free_user(
        __isl_take isl_id *id,
        void (*free_user)(void *user));
__isl_give isl_id *isl_id_copy(isl_id *id);
__isl_null isl_id *isl_id_free(__isl_take isl_id *id);

void *isl_id_get_user(__isl_keep isl_id *id);
__isl_keep const char *isl_id_get_name(__isl_keep isl_id *id);

__isl_give isl_printer *isl_printer_print_id(
        __isl_take isl_printer *p, __isl_keep isl_id *id);

使用示例:

isl_set *sum = isl_set_sum(set, set2); // 表示對set、set2這兩個集合對象進行加法
isl_id *ids = isl_id_alloc(ctx, "sum", sum);// 定義一個id指向sum
char *str_id = isl_id_to_str(ids);
printf("id:%s\n", str_id);

最後輸出如下,代表一個地址值:

id:sum@0x993a9e0

6.isl_space對象

每當從頭開始創建新的set,map或類似對象時,都需要使用來指定其所處的空間isl_space
每個空間包含零個或多個參數,以及零個,一個或兩個元組的 set 或輸入/輸出維。參數和尺寸由isl_dim_type和標識。類型isl_dim_param是指參數,類型isl_dim_set是指設置維(對於具有單個元組的空間)和類型isl_dim_in,而類型isl_dim_out是指輸入和輸出維(對於具有兩個元組的空間)。局部空間也包含類型的尺寸isl_dim_div。注意,參數僅由其在給定對象中的位置來標識。在不同的對象之間,參數(通常)由其名稱或標識符標識。只有未命名的參數才能通過它們在對象之間的位置來標識。不建議使用未命名的參數。

對space的基本操作如下:

#include <isl/space.h>
__isl_give isl_space *isl_space_unit(isl_ctx *ctx);
__isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
        unsigned nparam, unsigned n_in, unsigned n_out);//帶進帶出的專用於map
__isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx,
        unsigned nparam);
__isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
        unsigned nparam, unsigned dim);
__isl_give isl_space *isl_space_copy(__isl_keep isl_space *space);
__isl_null isl_space *isl_space_free(__isl_take isl_space *space);

需要使用isl_space_unit或創建用於創建參數域的空間isl_space_params_alloc。對於其他集合,需要使用來創建空間isl_space_set_alloc,而對於關係而言,需要使用來創建空間isl_space_alloc。使用的isl_space_params_alloc,isl_space_set_alloc並且isl_space_alloc因爲它們允許引進未命名參數是不鼓勵。

要檢查給定空間是集合空間還是映射空間,還是參數空間,請使用以下函數:

#include <isl/space.h>
isl_bool isl_space_is_params(__isl_keep isl_space *space);
isl_bool isl_space_is_set(__isl_keep isl_space *space);
isl_bool isl_space_is_map(__isl_keep isl_space *space);

創建與其他對象位於同一空間的對象通常很有用。這可以通過基於原始對象的空間來創建新對象(請參見“創建新的集合和關係”或“函數”)來完成。

創建和一個多面體對象相同space的space:

#include <isl/polynomial.h>
isl_space *isl_qpolynomial_get_domain_space(isl_qpolynomial *qp);
isl_space *isl_qpolynomial_get_space(isl_qpolynomial *qp);
isl_space *isl_qpolynomial_fold_get_domain_space(
        __isl_keep isl_qpolynomial_fold *fold);
__isl_give isl_space *isl_qpolynomial_fold_get_space(
        __isl_keep isl_qpolynomial_fold *fold);
__isl_give isl_space *isl_pw_qpolynomial_get_domain_space(
        __isl_keep isl_pw_qpolynomial *pwqp);
__isl_give isl_space *isl_pw_qpolynomial_get_space(
        __isl_keep isl_pw_qpolynomial *pwqp);
__isl_give isl_space *isl_pw_qpolynomial_fold_get_domain_space(
        __isl_keep isl_pw_qpolynomial_fold *pwf);
__isl_give isl_space *isl_pw_qpolynomial_fold_get_space(
        __isl_keep isl_pw_qpolynomial_fold *pwf);
__isl_give isl_space *isl_union_pw_qpolynomial_get_space(
        __isl_keep isl_union_pw_qpolynomial *upwqp);
__isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
        __isl_keep isl_union_pw_qpolynomial_fold *upwf);

可以使用以下功能將其他參數添加到空間。

#include <isl/space.h>
__isl_give isl_space *isl_space_add_param_id(
        __isl_take isl_space *space,
        __isl_take isl_id *id);

相反,可以使用以下函數從空格中刪除所有參數。

#include <isl/space.h>
__isl_give isl_space *isl_space_drop_all_params(
        __isl_take isl_space *space);

isl基本操作


1.create set & map

  • Empty sets and relations
    可以看出來。set和map的創建時憑藉於space的。
__isl_give isl_basic_set *isl_basic_set_empty(
        __isl_take isl_space *space);//創建一個空的set空間
__isl_give isl_basic_map *isl_basic_map_empty(
        __isl_take isl_space *space);
__isl_give isl_set *isl_set_empty(
        __isl_take isl_space *space);
__isl_give isl_map *isl_map_empty(
        __isl_take isl_space *space);
__isl_give isl_union_set *isl_union_set_empty(
        __isl_take isl_space *space);
__isl_give isl_union_map *isl_union_map_empty(
        __isl_take isl_space *space);
  • Universe sets and relations
_isl_give isl_basic_set *isl_basic_set_universe(
        __isl_take isl_space *space);
__isl_give isl_basic_map *isl_basic_map_universe(
        __isl_take isl_space *space);
__isl_give isl_set *isl_set_universe(
        __isl_take isl_space *space);
__isl_give isl_map *isl_map_universe(
        __isl_take isl_space *space);
__isl_give isl_union_set *isl_union_set_universe(
        __isl_take isl_union_set *uset);
__isl_give isl_union_map *isl_union_map_universe(
        __isl_take isl_union_map *umap);
  • Identity relations
__isl_give isl_basic_map *isl_basic_map_identity(
        __isl_take isl_space *space);
__isl_give isl_map *isl_map_identity(
        __isl_take isl_space *space);

可以使用以下功能將基本集合或關係轉換爲集合或關係:

__isl_give isl_set *isl_set_from_basic_set(
        __isl_take isl_basic_set *bset);
__isl_give isl_map *isl_map_from_basic_map(
        __isl_take isl_basic_map *bmap);

例如,要創建一個包含10到42之間的偶數整數的集合,可以使用以下代碼。

isl_space *space;
isl_local_space *ls;
isl_constraint *c;
isl_basic_set *bset;

space = isl_space_set_alloc(ctx, 0, 2);
bset = isl_basic_set_universe(isl_space_copy(space));
ls = isl_local_space_from_space(space);

c = isl_constraint_alloc_equality(isl_local_space_copy(ls));
c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
c = isl_constraint_set_coefficient_si(c, isl_dim_set, 1, 2);
bset = isl_basic_set_add_constraint(bset, c);

c = isl_constraint_alloc_inequality(isl_local_space_copy(ls));
c = isl_constraint_set_constant_si(c, -10);
c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, 1);
bset = isl_basic_set_add_constraint(bset, c);

c = isl_constraint_alloc_inequality(ls);
c = isl_constraint_set_constant_si(c, 42);
c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
bset = isl_basic_set_add_constraint(bset, c);

bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);

或者:

isl_basic_set *bset;
bset = isl_basic_set_read_from_str(ctx,
        "{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");

整體程序如下:

int main()
{
	isl_ctx *ctx = isl_ctx_alloc();
	isl_basic_set *bset;
	bset = isl_basic_set_read_from_str(ctx, "{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");
	const char *out = isl_basic_set_to_str(bset);
	cout << out << endl;
	return 0;
}

最終輸出:

{ [i] : (i) mod 2 = 0 and 10 <= i <= 42 }

這便是一個最簡單的調度編寫,這種語法表示 i 是一個循環變量,接下來我們看一下,如何能從字符串創建相應的 set、map 等對象。

2.Input & output

對於集合和關係,isl支持其自己的輸入/輸出格式,該格式類似於該Omega格式,但PolyLib在某些情況下還支持該格式。對於其他對象類型,通常僅isl支持一種格式。

輸入

例如從輸入格式創建一個basic_set對象:

#include <stdio.h>
#include <isl/ctx.h>
#include <isl/set.h>
using namespace std;

int main()
{
	isl_ctx *ctx = isl_ctx_alloc();//create a ctx object
	isl_basic_set *bset;
	bset = isl_basic_set_read_from_str(ctx, "[n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and i - 10 a <= 6) }");
	//表示 i % 10 <= 6
	char *out = isl_basic_set_to_str(bset);
	printf("%s\n", out);
	isl_basic_set_free(bset);
	isl_ctx_free(ctx);
	return 0;
}

輸出結果:

n -> { [i] : 0 <= i <= n and 10*floor((3 + i)/10) <= i }

floor表示向下取整,可以看到isl幫我們把這樣的循環變量進行了一些微調。

我們還可以使用以下的函數來從特定的輸入格式創建相應對象:

#include <isl/id.h>
__isl_give isl_id *isl_id_read_from_str(isl_ctx *ctx,
        const char *str);//創建id對象
__isl_give isl_multi_id *isl_multi_id_read_from_str(
        isl_ctx *ctx, const char *str);

#include <isl/val.h>
__isl_give isl_val *isl_val_read_from_str(isl_ctx *ctx,
        const char *str);//創建一個val對象
__isl_give isl_multi_val *isl_multi_val_read_from_str(
        isl_ctx *ctx, const char *str);

#include <isl/set.h>
__isl_give isl_basic_set *isl_basic_set_read_from_file(
        isl_ctx *ctx, FILE *input);
__isl_give isl_basic_set *isl_basic_set_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
        FILE *input);
__isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
        const char *str);

#include <isl/map.h>
__isl_give isl_basic_map *isl_basic_map_read_from_file(
        isl_ctx *ctx, FILE *input);
__isl_give isl_basic_map *isl_basic_map_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_map *isl_map_read_from_file(
        isl_ctx *ctx, FILE *input);
__isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
        const char *str);

#include <isl/union_set.h>
__isl_give isl_union_set *isl_union_set_read_from_file(
        isl_ctx *ctx, FILE *input);
__isl_give isl_union_set *isl_union_set_read_from_str(
        isl_ctx *ctx, const char *str);

#include <isl/union_map.h>
__isl_give isl_union_map *isl_union_map_read_from_file(
        isl_ctx *ctx, FILE *input);
__isl_give isl_union_map *isl_union_map_read_from_str(
        isl_ctx *ctx, const char *str);

#include <isl/aff.h>
__isl_give isl_aff *isl_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_multi_aff *isl_multi_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_pw_aff *isl_pw_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_multi_pw_aff *isl_multi_pw_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_union_pw_aff *
isl_union_pw_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_union_pw_multi_aff *
isl_union_pw_multi_aff_read_from_str(
        isl_ctx *ctx, const char *str);
__isl_give isl_multi_union_pw_aff *
isl_multi_union_pw_aff_read_from_str(
        isl_ctx *ctx, const char *str);

#include <isl/polynomial.h>
__isl_give isl_union_pw_qpolynomial *
isl_union_pw_qpolynomial_read_from_str(
        isl_ctx *ctx, const char *str);
輸出

在可以打印任何內容之前,需要先創建一個isl_printer對象:

__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
        FILE *file);
__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
__isl_null isl_printer *isl_printer_free(
        __isl_take isl_printer *printer);

isl_printer_to_file打印到給定的文件,同時isl_printer_to_str打印到可以使用以下函數提取的字符串。

#include <isl/printer.h>
__isl_give char *isl_printer_get_str(
        __isl_keep isl_printer *printer);

還是剛纔的程序,我們繼續用isl_printer對象來輸出:

int main()
{
	isl_ctx *ctx = isl_ctx_alloc();//create a ctx object
	isl_basic_set *bset;
	bset = isl_basic_set_read_from_str(ctx, "[n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and i - 10 a <= 6) }");
	char *out = isl_basic_set_to_str(bset);
	printf("%s\n", out);
	
	isl_printer *p = isl_printer_to_str(ctx);
	p =  isl_printer_print_basic_set(p, bset); //表示輸出basic_set
	
	char *out2 = isl_printer_get_str(p);
	printf("%s", out2);
	
	isl_printer_free(p);
	isl_basic_set_free(bset);
	isl_ctx_free(ctx);
	
	return 0;
}

輸出結果爲兩行一樣的循環變量約束:

n -> { [i] : 0 <= i <= n and 10*floor((3 + i)/10) <= i }
n -> { [i] : 0 <= i <= n and 10*floor((3 + i)/10) <= i }

另外,可以使用以下函數直接獲取字符串表示形式,該函數始終以isl格式打印:

#include <isl/space.h>
__isl_give char *isl_space_to_str(
        __isl_keep isl_space *space);

#include <isl/val.h>
__isl_give char *isl_val_to_str(__isl_keep isl_val *v);
__isl_give char *isl_multi_val_to_str(
        __isl_keep isl_multi_val *mv);

#include <isl/set.h>
__isl_give char *isl_basic_set_to_str(
        __isl_keep isl_basic_set *bset);
__isl_give char *isl_set_to_str(
        __isl_keep isl_set *set);

#include <isl/union_set.h>
__isl_give char *isl_union_set_to_str(
        __isl_keep isl_union_set *uset);

#include <isl/map.h>
__isl_give char *isl_basic_map_to_str(
        __isl_keep isl_basic_map *bmap);
__isl_give char *isl_map_to_str(
        __isl_keep isl_map *map);

#include <isl/union_map.h>
__isl_give char *isl_union_map_to_str(
        __isl_keep isl_union_map *umap);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章