1import json 2from isl import * 3 4class Scop: 5 def __init__(self, filename): 6 f = open(filename, 'r') 7 self.json = json.load(f) 8 return 9 10 def __str__(self): 11 return json.dumps(self.json, indent=2) 12 13 def __repr__(self): 14 return str(self) 15 16 @property 17 def statements(self): 18 return self.json['statements'] 19 20class Transforms: 21 """ 22 Create a map that interchanges two dimensions 'A' and 'B' 23 24 numberDimensions: The overall number of dimensions 25 dimensionA: The dimension of dimension 'A' 26 dimensionB: The dimension of dimension 'B' 27 28 getInterchange(2, 0, 1): 29 {[d0, d1] -> [d1, d0]} 30 """ 31 @staticmethod 32 def getInterchange(numberDimensions, dimensionA, dimensionB): 33 34 dims = ['d' + str(i) for i in range(numberDimensions)] 35 dimString = ",".join(dims) 36 37 changedDims = dims 38 first = dims[dimensionA] 39 second = dims[dimensionB] 40 changedDims[dimensionA] = second 41 changedDims[dimensionB] = first 42 changedDimString = ",".join(changedDims) 43 44 return Map("{[%s] -> [%s]}" % (dimString, changedDimString)) 45 46 """ 47 Create a map that strip mines one dimension 48 49 numberDimensions: The overall number of dimensions 50 stripMineDim: The dimension to strip mine 51 factor: The strip mining factor 52 53 getStripMine(2, 1, 64): 54 {[d0, d1] -> [d0, o, d1] : o % 64 = 0 and o <= d1 <= d1 + 63} 55 """ 56 @staticmethod 57 def getStripMine(numberDimensions, stripMineDim, factor): 58 59 dims = ['d' + str(i) for i in range(numberDimensions)] 60 dimString = ",".join(dims) 61 62 changedDims = dims 63 smd = dims[stripMineDim] 64 changedDims[stripMineDim] = "o,%s" % smd 65 changedDimString = ",".join(changedDims) 66 string = "{[%s] -> [%s]: o %% %i = 0 and o <= %s <= o + %i}" % \ 67 (dimString, changedDimString, factor, smd, factor - 1) 68 return Map(string) 69