• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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