import json from isl import * class Scop: def __init__(self, filename): f = open(filename, 'r') self.json = json.load(f) return def __str__(self): return json.dumps(self.json, indent=2) def __repr__(self): return str(self) @property def statements(self): return self.json['statements'] class Transforms: """ Create a map that interchanges two dimensions 'A' and 'B' numberDimensions: The overall number of dimensions dimensionA: The dimension of dimension 'A' dimensionB: The dimension of dimension 'B' getInterchange(2, 0, 1): {[d0, d1] -> [d1, d0]} """ @staticmethod def getInterchange(numberDimensions, dimensionA, dimensionB): dims = ['d' + str(i) for i in range(numberDimensions)] dimString = ",".join(dims) changedDims = dims first = dims[dimensionA] second = dims[dimensionB] changedDims[dimensionA] = second changedDims[dimensionB] = first changedDimString = ",".join(changedDims) return Map("{[%s] -> [%s]}" % (dimString, changedDimString)) """ Create a map that strip mines one dimension numberDimensions: The overall number of dimensions stripMineDim: The dimension to strip mine factor: The strip mining factor getStripMine(2, 1, 64): {[d0, d1] -> [d0, o, d1] : o % 64 = 0 and o <= d1 <= d1 + 63} """ @staticmethod def getStripMine(numberDimensions, stripMineDim, factor): dims = ['d' + str(i) for i in range(numberDimensions)] dimString = ",".join(dims) changedDims = dims smd = dims[stripMineDim] changedDims[stripMineDim] = "o,%s" % smd changedDimString = ",".join(changedDims) string = "{[%s] -> [%s]: o %% %i = 0 and o <= %s <= o + %i}" % \ (dimString, changedDimString, factor, smd, factor - 1) return Map(string)