| from ctypes import * |
| |
| isl = cdll.LoadLibrary("libisl.so") |
| |
| class Context: |
| defaultInstance = None |
| instances = {} |
| |
| def __init__(self): |
| ptr = isl.isl_ctx_alloc() |
| self.ptr = ptr |
| Context.instances[ptr] = self |
| |
| def __del__(self): |
| isl.isl_ctx_free(self) |
| |
| def from_param(self): |
| return self.ptr |
| |
| @staticmethod |
| def from_ptr(ptr): |
| return Context.instances[ptr] |
| |
| @staticmethod |
| def getDefaultInstance(): |
| if Context.defaultInstance == None: |
| Context.defaultInstance = Context() |
| |
| return Context.defaultInstance |
| |
| class IslObject: |
| def __init__(self, string = "", ctx = None, ptr = None): |
| self.initialize_isl_methods() |
| if ptr != None: |
| self.ptr = ptr |
| self.ctx = self.get_isl_method("get_ctx")(self) |
| return |
| |
| if ctx == None: |
| ctx = Context.getDefaultInstance() |
| |
| self.ctx = ctx |
| self.ptr = self.get_isl_method("read_from_str")(ctx, string, -1) |
| |
| def __del__(self): |
| self.get_isl_method("free")(self) |
| |
| def from_param(self): |
| return self.ptr |
| |
| @property |
| def context(self): |
| return self.ctx |
| |
| def __repr__(self): |
| p = Printer(self.ctx) |
| self.to_printer(p) |
| return p.getString(); |
| |
| def __str__(self): |
| p = Printer(self.ctx) |
| self.to_printer(p) |
| return p.getString(); |
| |
| @staticmethod |
| def isl_name(): |
| return "No isl name available" |
| |
| def initialize_isl_methods(self): |
| if hasattr(self.__class__, "initialized"): |
| return |
| |
| self.__class__.initalized = True |
| self.get_isl_method("read_from_str").argtypes = [Context, c_char_p, c_int] |
| self.get_isl_method("copy").argtypes = [self.__class__] |
| self.get_isl_method("copy").restype = c_int |
| self.get_isl_method("free").argtypes = [self.__class__] |
| self.get_isl_method("get_ctx").argtypes = [self.__class__] |
| self.get_isl_method("get_ctx").restype = Context.from_ptr |
| getattr(isl, "isl_printer_print_" + self.isl_name()).argtypes = [Printer, self.__class__] |
| |
| def get_isl_method(self, name): |
| return getattr(isl, "isl_" + self.isl_name() + "_" + name) |
| |
| def to_printer(self, printer): |
| getattr(isl, "isl_printer_print_" + self.isl_name())(printer, self) |
| |
| class BSet(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return BSet(ptr = ptr) |
| |
| @staticmethod |
| def isl_name(): |
| return "basic_set" |
| |
| class Set(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return Set(ptr = ptr) |
| |
| @staticmethod |
| def isl_name(): |
| return "set" |
| |
| class USet(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return USet(ptr = ptr) |
| |
| @staticmethod |
| def isl_name(): |
| return "union_set" |
| |
| |
| class BMap(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return BMap(ptr = ptr) |
| |
| def __mul__(self, set): |
| return self.intersect_domain(set) |
| |
| @staticmethod |
| def isl_name(): |
| return "basic_map" |
| |
| class Map(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return Map(ptr = ptr) |
| |
| def __mul__(self, set): |
| return self.intersect_domain(set) |
| |
| @staticmethod |
| def isl_name(): |
| return "map" |
| |
| @staticmethod |
| def lex_lt(dim): |
| dim = isl.isl_dim_copy(dim) |
| return isl.isl_map_lex_lt(dim) |
| |
| @staticmethod |
| def lex_le(dim): |
| dim = isl.isl_dim_copy(dim) |
| return isl.isl_map_lex_le(dim) |
| |
| @staticmethod |
| def lex_gt(dim): |
| dim = isl.isl_dim_copy(dim) |
| return isl.isl_map_lex_gt(dim) |
| |
| @staticmethod |
| def lex_ge(dim): |
| dim = isl.isl_dim_copy(dim) |
| return isl.isl_map_lex_ge(dim) |
| |
| class UMap(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return UMap(ptr = ptr) |
| |
| @staticmethod |
| def isl_name(): |
| return "union_map" |
| |
| class Dim(IslObject): |
| @staticmethod |
| def from_ptr(ptr): |
| if not ptr: |
| return |
| return Dim(ptr = ptr) |
| |
| @staticmethod |
| def isl_name(): |
| return "dim" |
| |
| def initialize_isl_methods(self): |
| if hasattr(self.__class__, "initialized"): |
| return |
| |
| self.__class__.initalized = True |
| self.get_isl_method("copy").argtypes = [self.__class__] |
| self.get_isl_method("copy").restype = c_int |
| self.get_isl_method("free").argtypes = [self.__class__] |
| self.get_isl_method("get_ctx").argtypes = [self.__class__] |
| self.get_isl_method("get_ctx").restype = Context.from_ptr |
| |
| def __repr__(self): |
| return str(self) |
| |
| def __str__(self): |
| |
| dimParam = isl.isl_dim_size(self, 1) |
| dimIn = isl.isl_dim_size(self, 2) |
| dimOut = isl.isl_dim_size(self, 3) |
| |
| if dimIn: |
| return "<dim In:%s, Out:%s, Param:%s>" % (dimIn, dimOut, dimParam) |
| |
| return "<dim Set:%s, Param:%s>" % (dimOut, dimParam) |
| |
| class Printer: |
| FORMAT_ISL = 0 |
| FORMAT_POLYLIB = 1 |
| FORMAT_POLYLIB_CONSTRAINTS = 2 |
| FORMAT_OMEGA = 3 |
| FORMAT_C = 4 |
| FORMAT_LATEX = 5 |
| FORMAT_EXT_POLYLIB = 6 |
| |
| def __init__(self, ctx = None): |
| if ctx == None: |
| ctx = Context.getDefaultInstance() |
| |
| self.ctx = ctx |
| self.ptr = isl.isl_printer_to_str(ctx) |
| |
| def setFormat(self, format): |
| self.ptr = isl.isl_printer_set_output_format(self, format); |
| |
| def from_param(self): |
| return self.ptr |
| |
| def __del__(self): |
| isl.isl_printer_free(self) |
| |
| def getString(self): |
| return isl.isl_printer_get_str(self) |
| |
| functions = [ |
| # Unary properties |
| ("is_empty", BSet, [BSet], c_int), |
| ("is_empty", Set, [Set], c_int), |
| ("is_empty", USet, [USet], c_int), |
| ("is_empty", BMap, [BMap], c_int), |
| ("is_empty", Map, [Map], c_int), |
| ("is_empty", UMap, [UMap], c_int), |
| |
| # ("is_universe", Set, [Set], c_int), |
| # ("is_universe", Map, [Map], c_int), |
| |
| ("is_single_valued", Map, [Map], c_int), |
| |
| ("is_bijective", Map, [Map], c_int), |
| |
| ("is_wrapping", BSet, [BSet], c_int), |
| ("is_wrapping", Set, [Set], c_int), |
| |
| # Binary properties |
| ("is_equal", BSet, [BSet, BSet], c_int), |
| ("is_equal", Set, [Set, Set], c_int), |
| ("is_equal", USet, [USet, USet], c_int), |
| ("is_equal", BMap, [BMap, BMap], c_int), |
| ("is_equal", Map, [Map, Map], c_int), |
| ("is_equal", UMap, [UMap, UMap], c_int), |
| |
| # is_disjoint missing |
| |
| # ("is_subset", BSet, [BSet, BSet], c_int), |
| ("is_subset", Set, [Set, Set], c_int), |
| ("is_subset", USet, [USet, USet], c_int), |
| ("is_subset", BMap, [BMap, BMap], c_int), |
| ("is_subset", Map, [Map, Map], c_int), |
| ("is_subset", UMap, [UMap, UMap], c_int), |
| #("is_strict_subset", BSet, [BSet, BSet], c_int), |
| ("is_strict_subset", Set, [Set, Set], c_int), |
| ("is_strict_subset", USet, [USet, USet], c_int), |
| ("is_strict_subset", BMap, [BMap, BMap], c_int), |
| ("is_strict_subset", Map, [Map, Map], c_int), |
| ("is_strict_subset", UMap, [UMap, UMap], c_int), |
| |
| # Unary Operations |
| ("complement", Set, [Set], Set), |
| ("reverse", BMap, [BMap], BMap), |
| ("reverse", Map, [Map], Map), |
| ("reverse", UMap, [UMap], UMap), |
| |
| # Projection missing |
| ("range", BMap, [BMap], BSet), |
| ("range", Map, [Map], Set), |
| ("range", UMap, [UMap], USet), |
| ("domain", BMap, [BMap], BSet), |
| ("domain", Map, [Map], Set), |
| ("domain", UMap, [UMap], USet), |
| |
| ("identity", Set, [Set], Map), |
| ("identity", USet, [USet], UMap), |
| |
| ("deltas", BMap, [BMap], BSet), |
| ("deltas", Map, [Map], Set), |
| ("deltas", UMap, [UMap], USet), |
| |
| ("coalesce", Set, [Set], Set), |
| ("coalesce", USet, [USet], USet), |
| ("coalesce", Map, [Map], Map), |
| ("coalesce", UMap, [UMap], UMap), |
| |
| ("detect_equalities", BSet, [BSet], BSet), |
| ("detect_equalities", Set, [Set], Set), |
| ("detect_equalities", USet, [USet], USet), |
| ("detect_equalities", BMap, [BMap], BMap), |
| ("detect_equalities", Map, [Map], Map), |
| ("detect_equalities", UMap, [UMap], UMap), |
| |
| ("convex_hull", Set, [Set], Set), |
| ("convex_hull", Map, [Map], Map), |
| |
| ("simple_hull", Set, [Set], Set), |
| ("simple_hull", Map, [Map], Map), |
| |
| ("affine_hull", BSet, [BSet], BSet), |
| ("affine_hull", Set, [Set], BSet), |
| ("affine_hull", USet, [USet], USet), |
| ("affine_hull", BMap, [BMap], BMap), |
| ("affine_hull", Map, [Map], BMap), |
| ("affine_hull", UMap, [UMap], UMap), |
| |
| ("polyhedral_hull", Set, [Set], Set), |
| ("polyhedral_hull", USet, [USet], USet), |
| ("polyhedral_hull", Map, [Map], Map), |
| ("polyhedral_hull", UMap, [UMap], UMap), |
| |
| # Power missing |
| # Transitive closure missing |
| # Reaching path lengths missing |
| |
| ("wrap", BMap, [BMap], BSet), |
| ("wrap", Map, [Map], Set), |
| ("wrap", UMap, [UMap], USet), |
| ("unwrap", BSet, [BMap], BMap), |
| ("unwrap", Set, [Map], Map), |
| ("unwrap", USet, [UMap], UMap), |
| |
| ("flatten", Set, [Set], Set), |
| ("flatten", Map, [Map], Map), |
| ("flatten_map", Set, [Set], Map), |
| |
| # Dimension manipulation missing |
| |
| # Binary Operations |
| ("intersect", BSet, [BSet, BSet], BSet), |
| ("intersect", Set, [Set, Set], Set), |
| ("intersect", USet, [USet, USet], USet), |
| ("intersect", BMap, [BMap, BMap], BMap), |
| ("intersect", Map, [Map, Map], Map), |
| ("intersect", UMap, [UMap, UMap], UMap), |
| ("intersect_domain", BMap, [BMap, BSet], BMap), |
| ("intersect_domain", Map, [Map, Set], Map), |
| ("intersect_domain", UMap, [UMap, USet], UMap), |
| ("intersect_range", BMap, [BMap, BSet], BMap), |
| ("intersect_range", Map, [Map, Set], Map), |
| ("intersect_range", UMap, [UMap, USet], UMap), |
| |
| ("union", BSet, [BSet, BSet], Set), |
| ("union", Set, [Set, Set], Set), |
| ("union", USet, [USet, USet], USet), |
| ("union", BMap, [BMap, BMap], Map), |
| ("union", Map, [Map, Map], Map), |
| ("union", UMap, [UMap, UMap], UMap), |
| |
| ("subtract", Set, [Set, Set], Set), |
| ("subtract", Map, [Map, Map], Map), |
| ("subtract", USet, [USet, USet], USet), |
| ("subtract", UMap, [UMap, UMap], UMap), |
| |
| ("apply", BSet, [BSet, BMap], BSet), |
| ("apply", Set, [Set, Map], Set), |
| ("apply", USet, [USet, UMap], USet), |
| ("apply_domain", BMap, [BMap, BMap], BMap), |
| ("apply_domain", Map, [Map, Map], Map), |
| ("apply_domain", UMap, [UMap, UMap], UMap), |
| ("apply_range", BMap, [BMap, BMap], BMap), |
| ("apply_range", Map, [Map, Map], Map), |
| ("apply_range", UMap, [UMap, UMap], UMap), |
| |
| ("gist", BSet, [BSet, BSet], BSet), |
| ("gist", Set, [Set, Set], Set), |
| ("gist", USet, [USet, USet], USet), |
| ("gist", BMap, [BMap, BMap], BMap), |
| ("gist", Map, [Map, Map], Map), |
| ("gist", UMap, [UMap, UMap], UMap), |
| |
| # Lexicographic Optimizations |
| # partial_lexmin missing |
| ("lexmin", BSet, [BSet], BSet), |
| ("lexmin", Set, [Set], Set), |
| ("lexmin", USet, [USet], USet), |
| ("lexmin", BMap, [BMap], BMap), |
| ("lexmin", Map, [Map], Map), |
| ("lexmin", UMap, [UMap], UMap), |
| |
| ("lexmax", BSet, [BSet], BSet), |
| ("lexmax", Set, [Set], Set), |
| ("lexmax", USet, [USet], USet), |
| ("lexmax", BMap, [BMap], BMap), |
| ("lexmax", Map, [Map], Map), |
| ("lexmax", UMap, [UMap], UMap), |
| |
| # Undocumented |
| ("lex_lt_union_set", USet, [USet, USet], UMap), |
| ("lex_le_union_set", USet, [USet, USet], UMap), |
| ("lex_gt_union_set", USet, [USet, USet], UMap), |
| ("lex_ge_union_set", USet, [USet, USet], UMap), |
| |
| ] |
| keep_functions = [ |
| # Unary properties |
| ("get_dim", BSet, [BSet], Dim), |
| ("get_dim", Set, [Set], Dim), |
| ("get_dim", USet, [USet], Dim), |
| ("get_dim", BMap, [BMap], Dim), |
| ("get_dim", Map, [Map], Dim), |
| ("get_dim", UMap, [UMap], Dim) |
| ] |
| |
| def addIslFunction(object, name): |
| functionName = "isl_" + object.isl_name() + "_" + name |
| islFunction = getattr(isl, functionName) |
| if len(islFunction.argtypes) == 1: |
| f = lambda a: islFunctionOneOp(islFunction, a) |
| elif len(islFunction.argtypes) == 2: |
| f = lambda a, b: islFunctionTwoOp(islFunction, a, b) |
| object.__dict__[name] = f |
| |
| |
| def islFunctionOneOp(islFunction, ops): |
| ops = getattr(isl, "isl_" + ops.isl_name() + "_copy")(ops) |
| return islFunction(ops) |
| |
| def islFunctionTwoOp(islFunction, opOne, opTwo): |
| opOne = getattr(isl, "isl_" + opOne.isl_name() + "_copy")(opOne) |
| opTwo = getattr(isl, "isl_" + opTwo.isl_name() + "_copy")(opTwo) |
| return islFunction(opOne, opTwo) |
| |
| for (operation, base, operands, ret) in functions: |
| functionName = "isl_" + base.isl_name() + "_" + operation |
| islFunction = getattr(isl, functionName) |
| if len(operands) == 1: |
| islFunction.argtypes = [c_int] |
| elif len(operands) == 2: |
| islFunction.argtypes = [c_int, c_int] |
| |
| if ret == c_int: |
| islFunction.restype = ret |
| else: |
| islFunction.restype = ret.from_ptr |
| |
| addIslFunction(base, operation) |
| |
| def addIslFunctionKeep(object, name): |
| functionName = "isl_" + object.isl_name() + "_" + name |
| islFunction = getattr(isl, functionName) |
| if len(islFunction.argtypes) == 1: |
| f = lambda a: islFunctionOneOpKeep(islFunction, a) |
| elif len(islFunction.argtypes) == 2: |
| f = lambda a, b: islFunctionTwoOpKeep(islFunction, a, b) |
| object.__dict__[name] = f |
| |
| def islFunctionOneOpKeep(islFunction, ops): |
| return islFunction(ops) |
| |
| def islFunctionTwoOpKeep(islFunction, opOne, opTwo): |
| return islFunction(opOne, opTwo) |
| |
| for (operation, base, operands, ret) in keep_functions: |
| functionName = "isl_" + base.isl_name() + "_" + operation |
| islFunction = getattr(isl, functionName) |
| if len(operands) == 1: |
| islFunction.argtypes = [c_int] |
| elif len(operands) == 2: |
| islFunction.argtypes = [c_int, c_int] |
| |
| if ret == c_int: |
| islFunction.restype = ret |
| else: |
| islFunction.restype = ret.from_ptr |
| |
| addIslFunctionKeep(base, operation) |
| |
| isl.isl_ctx_free.argtypes = [Context] |
| isl.isl_basic_set_read_from_str.argtypes = [Context, c_char_p, c_int] |
| isl.isl_set_read_from_str.argtypes = [Context, c_char_p, c_int] |
| isl.isl_basic_set_copy.argtypes = [BSet] |
| isl.isl_basic_set_copy.restype = c_int |
| isl.isl_set_copy.argtypes = [Set] |
| isl.isl_set_copy.restype = c_int |
| isl.isl_set_copy.argtypes = [Set] |
| isl.isl_set_copy.restype = c_int |
| isl.isl_set_free.argtypes = [Set] |
| isl.isl_basic_set_get_ctx.argtypes = [BSet] |
| isl.isl_basic_set_get_ctx.restype = Context.from_ptr |
| isl.isl_set_get_ctx.argtypes = [Set] |
| isl.isl_set_get_ctx.restype = Context.from_ptr |
| isl.isl_basic_set_get_dim.argtypes = [BSet] |
| isl.isl_basic_set_get_dim.restype = Dim.from_ptr |
| isl.isl_set_get_dim.argtypes = [Set] |
| isl.isl_set_get_dim.restype = Dim.from_ptr |
| isl.isl_union_set_get_dim.argtypes = [USet] |
| isl.isl_union_set_get_dim.restype = Dim.from_ptr |
| |
| isl.isl_basic_map_read_from_str.argtypes = [Context, c_char_p, c_int] |
| isl.isl_map_read_from_str.argtypes = [Context, c_char_p, c_int] |
| isl.isl_basic_map_free.argtypes = [BMap] |
| isl.isl_map_free.argtypes = [Map] |
| isl.isl_basic_map_copy.argtypes = [BMap] |
| isl.isl_basic_map_copy.restype = c_int |
| isl.isl_map_copy.argtypes = [Map] |
| isl.isl_map_copy.restype = c_int |
| isl.isl_map_get_ctx.argtypes = [Map] |
| isl.isl_basic_map_get_ctx.argtypes = [BMap] |
| isl.isl_basic_map_get_ctx.restype = Context.from_ptr |
| isl.isl_map_get_ctx.argtypes = [Map] |
| isl.isl_map_get_ctx.restype = Context.from_ptr |
| isl.isl_basic_map_get_dim.argtypes = [BMap] |
| isl.isl_basic_map_get_dim.restype = Dim.from_ptr |
| isl.isl_map_get_dim.argtypes = [Map] |
| isl.isl_map_get_dim.restype = Dim.from_ptr |
| isl.isl_union_map_get_dim.argtypes = [UMap] |
| isl.isl_union_map_get_dim.restype = Dim.from_ptr |
| isl.isl_printer_free.argtypes = [Printer] |
| isl.isl_printer_to_str.argtypes = [Context] |
| isl.isl_printer_print_basic_set.argtypes = [Printer, BSet] |
| isl.isl_printer_print_set.argtypes = [Printer, Set] |
| isl.isl_printer_print_basic_map.argtypes = [Printer, BMap] |
| isl.isl_printer_print_map.argtypes = [Printer, Map] |
| isl.isl_printer_get_str.argtypes = [Printer] |
| isl.isl_printer_get_str.restype = c_char_p |
| isl.isl_printer_set_output_format.argtypes = [Printer, c_int] |
| isl.isl_printer_set_output_format.restype = c_int |
| isl.isl_dim_size.argtypes = [Dim, c_int] |
| isl.isl_dim_size.restype = c_int |
| |
| isl.isl_map_lex_lt.argtypes = [c_int] |
| isl.isl_map_lex_lt.restype = Map.from_ptr |
| isl.isl_map_lex_le.argtypes = [c_int] |
| isl.isl_map_lex_le.restype = Map.from_ptr |
| isl.isl_map_lex_gt.argtypes = [c_int] |
| isl.isl_map_lex_gt.restype = Map.from_ptr |
| isl.isl_map_lex_ge.argtypes = [c_int] |
| isl.isl_map_lex_ge.restype = Map.from_ptr |
| |
| isl.isl_union_map_compute_flow.argtypes = [c_int, c_int, c_int, c_int, c_void_p, |
| c_void_p, c_void_p, c_void_p] |
| |
| def dependences(sink, must_source, may_source, schedule): |
| sink = getattr(isl, "isl_" + sink.isl_name() + "_copy")(sink) |
| must_source = getattr(isl, "isl_" + must_source.isl_name() + "_copy")(must_source) |
| may_source = getattr(isl, "isl_" + may_source.isl_name() + "_copy")(may_source) |
| schedule = getattr(isl, "isl_" + schedule.isl_name() + "_copy")(schedule) |
| must_dep = c_int() |
| may_dep = c_int() |
| must_no_source = c_int() |
| may_no_source = c_int() |
| isl.isl_union_map_compute_flow(sink, must_source, may_source, schedule, \ |
| byref(must_dep), byref(may_dep), |
| byref(must_no_source), |
| byref(may_no_source)) |
| |
| return (UMap.from_ptr(must_dep), UMap.from_ptr(may_dep), \ |
| USet.from_ptr(must_no_source), USet.from_ptr(may_no_source)) |
| |
| |
| __all__ = ['Set', 'Map', 'Printer', 'Context'] |