brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.3 KiB · c5d92ae Raw
588 lines · python
1from ctypes import *2 3isl = cdll.LoadLibrary("libisl.so")4 5 6class Context:7    defaultInstance = None8    instances = {}9 10    def __init__(self):11        ptr = isl.isl_ctx_alloc()12        self.ptr = ptr13        Context.instances[ptr] = self14 15    def __del__(self):16        isl.isl_ctx_free(self)17 18    def from_param(self):19        return self.ptr20 21    @staticmethod22    def from_ptr(ptr):23        return Context.instances[ptr]24 25    @staticmethod26    def getDefaultInstance():27        if Context.defaultInstance is None:28            Context.defaultInstance = Context()29 30        return Context.defaultInstance31 32 33class IslObject:34    def __init__(self, string="", ctx=None, ptr=None):35        self.initialize_isl_methods()36        if ptr is not None:37            self.ptr = ptr38            self.ctx = self.get_isl_method("get_ctx")(self)39            return40 41        if ctx is None:42            ctx = Context.getDefaultInstance()43 44        self.ctx = ctx45        self.ptr = self.get_isl_method("read_from_str")(ctx, string, -1)46 47    def __del__(self):48        self.get_isl_method("free")(self)49 50    def from_param(self):51        return self.ptr52 53    @property54    def context(self):55        return self.ctx56 57    def __repr__(self):58        p = Printer(self.ctx)59        self.to_printer(p)60        return p.getString()61 62    def __str__(self):63        p = Printer(self.ctx)64        self.to_printer(p)65        return p.getString()66 67    @staticmethod68    def isl_name():69        return "No isl name available"70 71    def initialize_isl_methods(self):72        if hasattr(self.__class__, "initialized"):73            return74 75        self.__class__.initialized = True76        self.get_isl_method("read_from_str").argtypes = [Context, c_char_p, c_int]77        self.get_isl_method("copy").argtypes = [self.__class__]78        self.get_isl_method("copy").restype = c_int79        self.get_isl_method("free").argtypes = [self.__class__]80        self.get_isl_method("get_ctx").argtypes = [self.__class__]81        self.get_isl_method("get_ctx").restype = Context.from_ptr82        getattr(isl, "isl_printer_print_" + self.isl_name()).argtypes = [83            Printer,84            self.__class__,85        ]86 87    def get_isl_method(self, name):88        return getattr(isl, "isl_" + self.isl_name() + "_" + name)89 90    def to_printer(self, printer):91        getattr(isl, "isl_printer_print_" + self.isl_name())(printer, self)92 93 94class BSet(IslObject):95    @staticmethod96    def from_ptr(ptr):97        if not ptr:98            return99        return BSet(ptr=ptr)100 101    @staticmethod102    def isl_name():103        return "basic_set"104 105 106class Set(IslObject):107    @staticmethod108    def from_ptr(ptr):109        if not ptr:110            return111        return Set(ptr=ptr)112 113    @staticmethod114    def isl_name():115        return "set"116 117 118class USet(IslObject):119    @staticmethod120    def from_ptr(ptr):121        if not ptr:122            return123        return USet(ptr=ptr)124 125    @staticmethod126    def isl_name():127        return "union_set"128 129 130class BMap(IslObject):131    @staticmethod132    def from_ptr(ptr):133        if not ptr:134            return135        return BMap(ptr=ptr)136 137    def __mul__(self, set):138        return self.intersect_domain(set)139 140    @staticmethod141    def isl_name():142        return "basic_map"143 144 145class Map(IslObject):146    @staticmethod147    def from_ptr(ptr):148        if not ptr:149            return150        return Map(ptr=ptr)151 152    def __mul__(self, set):153        return self.intersect_domain(set)154 155    @staticmethod156    def isl_name():157        return "map"158 159    @staticmethod160    def lex_lt(dim):161        dim = isl.isl_dim_copy(dim)162        return isl.isl_map_lex_lt(dim)163 164    @staticmethod165    def lex_le(dim):166        dim = isl.isl_dim_copy(dim)167        return isl.isl_map_lex_le(dim)168 169    @staticmethod170    def lex_gt(dim):171        dim = isl.isl_dim_copy(dim)172        return isl.isl_map_lex_gt(dim)173 174    @staticmethod175    def lex_ge(dim):176        dim = isl.isl_dim_copy(dim)177        return isl.isl_map_lex_ge(dim)178 179 180class UMap(IslObject):181    @staticmethod182    def from_ptr(ptr):183        if not ptr:184            return185        return UMap(ptr=ptr)186 187    @staticmethod188    def isl_name():189        return "union_map"190 191 192class Dim(IslObject):193    @staticmethod194    def from_ptr(ptr):195        if not ptr:196            return197        return Dim(ptr=ptr)198 199    @staticmethod200    def isl_name():201        return "dim"202 203    def initialize_isl_methods(self):204        if hasattr(self.__class__, "initialized"):205            return206 207        self.__class__.initialized = True208        self.get_isl_method("copy").argtypes = [self.__class__]209        self.get_isl_method("copy").restype = c_int210        self.get_isl_method("free").argtypes = [self.__class__]211        self.get_isl_method("get_ctx").argtypes = [self.__class__]212        self.get_isl_method("get_ctx").restype = Context.from_ptr213 214    def __repr__(self):215        return str(self)216 217    def __str__(self):218 219        dimParam = isl.isl_dim_size(self, 1)220        dimIn = isl.isl_dim_size(self, 2)221        dimOut = isl.isl_dim_size(self, 3)222 223        if dimIn:224            return "<dim In:%s, Out:%s, Param:%s>" % (dimIn, dimOut, dimParam)225 226        return "<dim Set:%s, Param:%s>" % (dimOut, dimParam)227 228 229class Printer:230    FORMAT_ISL = 0231    FORMAT_POLYLIB = 1232    FORMAT_POLYLIB_CONSTRAINTS = 2233    FORMAT_OMEGA = 3234    FORMAT_C = 4235    FORMAT_LATEX = 5236    FORMAT_EXT_POLYLIB = 6237 238    def __init__(self, ctx=None):239        if ctx is None:240            ctx = Context.getDefaultInstance()241 242        self.ctx = ctx243        self.ptr = isl.isl_printer_to_str(ctx)244 245    def setFormat(self, format):246        self.ptr = isl.isl_printer_set_output_format(self, format)247 248    def from_param(self):249        return self.ptr250 251    def __del__(self):252        isl.isl_printer_free(self)253 254    def getString(self):255        return isl.isl_printer_get_str(self)256 257 258functions = [259    # Unary properties260    ("is_empty", BSet, [BSet], c_int),261    ("is_empty", Set, [Set], c_int),262    ("is_empty", USet, [USet], c_int),263    ("is_empty", BMap, [BMap], c_int),264    ("is_empty", Map, [Map], c_int),265    ("is_empty", UMap, [UMap], c_int),266    #         ("is_universe", Set, [Set], c_int),267    #         ("is_universe", Map, [Map], c_int),268    ("is_single_valued", Map, [Map], c_int),269    ("is_bijective", Map, [Map], c_int),270    ("is_wrapping", BSet, [BSet], c_int),271    ("is_wrapping", Set, [Set], c_int),272    # Binary properties273    ("is_equal", BSet, [BSet, BSet], c_int),274    ("is_equal", Set, [Set, Set], c_int),275    ("is_equal", USet, [USet, USet], c_int),276    ("is_equal", BMap, [BMap, BMap], c_int),277    ("is_equal", Map, [Map, Map], c_int),278    ("is_equal", UMap, [UMap, UMap], c_int),279    # is_disjoint missing280    # ("is_subset", BSet, [BSet, BSet], c_int),281    ("is_subset", Set, [Set, Set], c_int),282    ("is_subset", USet, [USet, USet], c_int),283    ("is_subset", BMap, [BMap, BMap], c_int),284    ("is_subset", Map, [Map, Map], c_int),285    ("is_subset", UMap, [UMap, UMap], c_int),286    # ("is_strict_subset", BSet, [BSet, BSet], c_int),287    ("is_strict_subset", Set, [Set, Set], c_int),288    ("is_strict_subset", USet, [USet, USet], c_int),289    ("is_strict_subset", BMap, [BMap, BMap], c_int),290    ("is_strict_subset", Map, [Map, Map], c_int),291    ("is_strict_subset", UMap, [UMap, UMap], c_int),292    # Unary Operations293    ("complement", Set, [Set], Set),294    ("reverse", BMap, [BMap], BMap),295    ("reverse", Map, [Map], Map),296    ("reverse", UMap, [UMap], UMap),297    # Projection missing298    ("range", BMap, [BMap], BSet),299    ("range", Map, [Map], Set),300    ("range", UMap, [UMap], USet),301    ("domain", BMap, [BMap], BSet),302    ("domain", Map, [Map], Set),303    ("domain", UMap, [UMap], USet),304    ("identity", Set, [Set], Map),305    ("identity", USet, [USet], UMap),306    ("deltas", BMap, [BMap], BSet),307    ("deltas", Map, [Map], Set),308    ("deltas", UMap, [UMap], USet),309    ("coalesce", Set, [Set], Set),310    ("coalesce", USet, [USet], USet),311    ("coalesce", Map, [Map], Map),312    ("coalesce", UMap, [UMap], UMap),313    ("detect_equalities", BSet, [BSet], BSet),314    ("detect_equalities", Set, [Set], Set),315    ("detect_equalities", USet, [USet], USet),316    ("detect_equalities", BMap, [BMap], BMap),317    ("detect_equalities", Map, [Map], Map),318    ("detect_equalities", UMap, [UMap], UMap),319    ("convex_hull", Set, [Set], Set),320    ("convex_hull", Map, [Map], Map),321    ("simple_hull", Set, [Set], Set),322    ("simple_hull", Map, [Map], Map),323    ("affine_hull", BSet, [BSet], BSet),324    ("affine_hull", Set, [Set], BSet),325    ("affine_hull", USet, [USet], USet),326    ("affine_hull", BMap, [BMap], BMap),327    ("affine_hull", Map, [Map], BMap),328    ("affine_hull", UMap, [UMap], UMap),329    ("polyhedral_hull", Set, [Set], Set),330    ("polyhedral_hull", USet, [USet], USet),331    ("polyhedral_hull", Map, [Map], Map),332    ("polyhedral_hull", UMap, [UMap], UMap),333    # Power missing334    # Transitive closure missing335    # Reaching path lengths missing336    ("wrap", BMap, [BMap], BSet),337    ("wrap", Map, [Map], Set),338    ("wrap", UMap, [UMap], USet),339    ("unwrap", BSet, [BMap], BMap),340    ("unwrap", Set, [Map], Map),341    ("unwrap", USet, [UMap], UMap),342    ("flatten", Set, [Set], Set),343    ("flatten", Map, [Map], Map),344    ("flatten_map", Set, [Set], Map),345    # Dimension manipulation missing346    # Binary Operations347    ("intersect", BSet, [BSet, BSet], BSet),348    ("intersect", Set, [Set, Set], Set),349    ("intersect", USet, [USet, USet], USet),350    ("intersect", BMap, [BMap, BMap], BMap),351    ("intersect", Map, [Map, Map], Map),352    ("intersect", UMap, [UMap, UMap], UMap),353    ("intersect_domain", BMap, [BMap, BSet], BMap),354    ("intersect_domain", Map, [Map, Set], Map),355    ("intersect_domain", UMap, [UMap, USet], UMap),356    ("intersect_range", BMap, [BMap, BSet], BMap),357    ("intersect_range", Map, [Map, Set], Map),358    ("intersect_range", UMap, [UMap, USet], UMap),359    ("union", BSet, [BSet, BSet], Set),360    ("union", Set, [Set, Set], Set),361    ("union", USet, [USet, USet], USet),362    ("union", BMap, [BMap, BMap], Map),363    ("union", Map, [Map, Map], Map),364    ("union", UMap, [UMap, UMap], UMap),365    ("subtract", Set, [Set, Set], Set),366    ("subtract", Map, [Map, Map], Map),367    ("subtract", USet, [USet, USet], USet),368    ("subtract", UMap, [UMap, UMap], UMap),369    ("apply", BSet, [BSet, BMap], BSet),370    ("apply", Set, [Set, Map], Set),371    ("apply", USet, [USet, UMap], USet),372    ("apply_domain", BMap, [BMap, BMap], BMap),373    ("apply_domain", Map, [Map, Map], Map),374    ("apply_domain", UMap, [UMap, UMap], UMap),375    ("apply_range", BMap, [BMap, BMap], BMap),376    ("apply_range", Map, [Map, Map], Map),377    ("apply_range", UMap, [UMap, UMap], UMap),378    ("gist", BSet, [BSet, BSet], BSet),379    ("gist", Set, [Set, Set], Set),380    ("gist", USet, [USet, USet], USet),381    ("gist", BMap, [BMap, BMap], BMap),382    ("gist", Map, [Map, Map], Map),383    ("gist", UMap, [UMap, UMap], UMap),384    # Lexicographic Optimizations385    # partial_lexmin missing386    ("lexmin", BSet, [BSet], BSet),387    ("lexmin", Set, [Set], Set),388    ("lexmin", USet, [USet], USet),389    ("lexmin", BMap, [BMap], BMap),390    ("lexmin", Map, [Map], Map),391    ("lexmin", UMap, [UMap], UMap),392    ("lexmax", BSet, [BSet], BSet),393    ("lexmax", Set, [Set], Set),394    ("lexmax", USet, [USet], USet),395    ("lexmax", BMap, [BMap], BMap),396    ("lexmax", Map, [Map], Map),397    ("lexmax", UMap, [UMap], UMap),398    # Undocumented399    ("lex_lt_union_set", USet, [USet, USet], UMap),400    ("lex_le_union_set", USet, [USet, USet], UMap),401    ("lex_gt_union_set", USet, [USet, USet], UMap),402    ("lex_ge_union_set", USet, [USet, USet], UMap),403]404keep_functions = [405    # Unary properties406    ("get_dim", BSet, [BSet], Dim),407    ("get_dim", Set, [Set], Dim),408    ("get_dim", USet, [USet], Dim),409    ("get_dim", BMap, [BMap], Dim),410    ("get_dim", Map, [Map], Dim),411    ("get_dim", UMap, [UMap], Dim),412]413 414 415def addIslFunction(object, name):416    functionName = "isl_" + object.isl_name() + "_" + name417    islFunction = getattr(isl, functionName)418    if len(islFunction.argtypes) == 1:419        f = lambda a: islFunctionOneOp(islFunction, a)420    elif len(islFunction.argtypes) == 2:421        f = lambda a, b: islFunctionTwoOp(islFunction, a, b)422    object.__dict__[name] = f423 424 425def islFunctionOneOp(islFunction, ops):426    ops = getattr(isl, "isl_" + ops.isl_name() + "_copy")(ops)427    return islFunction(ops)428 429 430def islFunctionTwoOp(islFunction, opOne, opTwo):431    opOne = getattr(isl, "isl_" + opOne.isl_name() + "_copy")(opOne)432    opTwo = getattr(isl, "isl_" + opTwo.isl_name() + "_copy")(opTwo)433    return islFunction(opOne, opTwo)434 435 436for (operation, base, operands, ret) in functions:437    functionName = "isl_" + base.isl_name() + "_" + operation438    islFunction = getattr(isl, functionName)439    if len(operands) == 1:440        islFunction.argtypes = [c_int]441    elif len(operands) == 2:442        islFunction.argtypes = [c_int, c_int]443 444    if ret == c_int:445        islFunction.restype = ret446    else:447        islFunction.restype = ret.from_ptr448 449    addIslFunction(base, operation)450 451 452def addIslFunctionKeep(object, name):453    functionName = "isl_" + object.isl_name() + "_" + name454    islFunction = getattr(isl, functionName)455    if len(islFunction.argtypes) == 1:456        f = lambda a: islFunctionOneOpKeep(islFunction, a)457    elif len(islFunction.argtypes) == 2:458        f = lambda a, b: islFunctionTwoOpKeep(islFunction, a, b)459    object.__dict__[name] = f460 461 462def islFunctionOneOpKeep(islFunction, ops):463    return islFunction(ops)464 465 466def islFunctionTwoOpKeep(islFunction, opOne, opTwo):467    return islFunction(opOne, opTwo)468 469 470for (operation, base, operands, ret) in keep_functions:471    functionName = "isl_" + base.isl_name() + "_" + operation472    islFunction = getattr(isl, functionName)473    if len(operands) == 1:474        islFunction.argtypes = [c_int]475    elif len(operands) == 2:476        islFunction.argtypes = [c_int, c_int]477 478    if ret == c_int:479        islFunction.restype = ret480    else:481        islFunction.restype = ret.from_ptr482 483    addIslFunctionKeep(base, operation)484 485isl.isl_ctx_free.argtypes = [Context]486isl.isl_basic_set_read_from_str.argtypes = [Context, c_char_p, c_int]487isl.isl_set_read_from_str.argtypes = [Context, c_char_p, c_int]488isl.isl_basic_set_copy.argtypes = [BSet]489isl.isl_basic_set_copy.restype = c_int490isl.isl_set_copy.argtypes = [Set]491isl.isl_set_copy.restype = c_int492isl.isl_set_copy.argtypes = [Set]493isl.isl_set_copy.restype = c_int494isl.isl_set_free.argtypes = [Set]495isl.isl_basic_set_get_ctx.argtypes = [BSet]496isl.isl_basic_set_get_ctx.restype = Context.from_ptr497isl.isl_set_get_ctx.argtypes = [Set]498isl.isl_set_get_ctx.restype = Context.from_ptr499isl.isl_basic_set_get_dim.argtypes = [BSet]500isl.isl_basic_set_get_dim.restype = Dim.from_ptr501isl.isl_set_get_dim.argtypes = [Set]502isl.isl_set_get_dim.restype = Dim.from_ptr503isl.isl_union_set_get_dim.argtypes = [USet]504isl.isl_union_set_get_dim.restype = Dim.from_ptr505 506isl.isl_basic_map_read_from_str.argtypes = [Context, c_char_p, c_int]507isl.isl_map_read_from_str.argtypes = [Context, c_char_p, c_int]508isl.isl_basic_map_free.argtypes = [BMap]509isl.isl_map_free.argtypes = [Map]510isl.isl_basic_map_copy.argtypes = [BMap]511isl.isl_basic_map_copy.restype = c_int512isl.isl_map_copy.argtypes = [Map]513isl.isl_map_copy.restype = c_int514isl.isl_map_get_ctx.argtypes = [Map]515isl.isl_basic_map_get_ctx.argtypes = [BMap]516isl.isl_basic_map_get_ctx.restype = Context.from_ptr517isl.isl_map_get_ctx.argtypes = [Map]518isl.isl_map_get_ctx.restype = Context.from_ptr519isl.isl_basic_map_get_dim.argtypes = [BMap]520isl.isl_basic_map_get_dim.restype = Dim.from_ptr521isl.isl_map_get_dim.argtypes = [Map]522isl.isl_map_get_dim.restype = Dim.from_ptr523isl.isl_union_map_get_dim.argtypes = [UMap]524isl.isl_union_map_get_dim.restype = Dim.from_ptr525isl.isl_printer_free.argtypes = [Printer]526isl.isl_printer_to_str.argtypes = [Context]527isl.isl_printer_print_basic_set.argtypes = [Printer, BSet]528isl.isl_printer_print_set.argtypes = [Printer, Set]529isl.isl_printer_print_basic_map.argtypes = [Printer, BMap]530isl.isl_printer_print_map.argtypes = [Printer, Map]531isl.isl_printer_get_str.argtypes = [Printer]532isl.isl_printer_get_str.restype = c_char_p533isl.isl_printer_set_output_format.argtypes = [Printer, c_int]534isl.isl_printer_set_output_format.restype = c_int535isl.isl_dim_size.argtypes = [Dim, c_int]536isl.isl_dim_size.restype = c_int537 538isl.isl_map_lex_lt.argtypes = [c_int]539isl.isl_map_lex_lt.restype = Map.from_ptr540isl.isl_map_lex_le.argtypes = [c_int]541isl.isl_map_lex_le.restype = Map.from_ptr542isl.isl_map_lex_gt.argtypes = [c_int]543isl.isl_map_lex_gt.restype = Map.from_ptr544isl.isl_map_lex_ge.argtypes = [c_int]545isl.isl_map_lex_ge.restype = Map.from_ptr546 547isl.isl_union_map_compute_flow.argtypes = [548    c_int,549    c_int,550    c_int,551    c_int,552    c_void_p,553    c_void_p,554    c_void_p,555    c_void_p,556]557 558 559def dependences(sink, must_source, may_source, schedule):560    sink = getattr(isl, "isl_" + sink.isl_name() + "_copy")(sink)561    must_source = getattr(isl, "isl_" + must_source.isl_name() + "_copy")(must_source)562    may_source = getattr(isl, "isl_" + may_source.isl_name() + "_copy")(may_source)563    schedule = getattr(isl, "isl_" + schedule.isl_name() + "_copy")(schedule)564    must_dep = c_int()565    may_dep = c_int()566    must_no_source = c_int()567    may_no_source = c_int()568    isl.isl_union_map_compute_flow(569        sink,570        must_source,571        may_source,572        schedule,573        byref(must_dep),574        byref(may_dep),575        byref(must_no_source),576        byref(may_no_source),577    )578 579    return (580        UMap.from_ptr(must_dep),581        UMap.from_ptr(may_dep),582        USet.from_ptr(must_no_source),583        USet.from_ptr(may_no_source),584    )585 586 587__all__ = ["Set", "Map", "Printer", "Context"]588