def generateCode : String = {
val code = new StringBuilder()
declarations = base.collectDeclarations(nameManager)
- code append declarations.mkString("\n")
+ code append declarations.mkString("\n") + "\n\n"
val generationVisitor = new GenerationVisitor
base.accept(generationVisitor)
}
def visitFragment(fragment: Fragment) {
+ fragment match {
+ case (c: ConsumerFragment) =>
+ case (p: ProducerFragment) => code append "!"+p.generate(nameManager)+"\n"
+ case (t: TransformFragment) =>
+ }
}
def getCode = code.mkString
class ConsumerFragment(parent: IterationSpace, dependencies: Set[Fragment]) extends Fragment {
def getAllFragments = Set(this)
def getDependencies = dependencies
- def collectDeclarations(nameManager: NameManager) = Set[String]()
+ def collectDeclarations(nameManager: NameManager) = parent.getIndices.flatMap(_.getDeclarations(nameManager))
def accept(visitor: LoopTreeVisitor) = visitor.visitFragment(this)
override def toString = "Consumer: " + parent.toString
}
class ProducerFragment(parent: IterationSpace, dependencies: Set[Fragment]) extends Fragment {
def getAllFragments = Set(this)
def getDependencies = dependencies
- def collectDeclarations(nameManager: NameManager) = Set[String]()
+ def collectDeclarations(nameManager: NameManager) = parent.getIndices.flatMap(_.getDeclarations(nameManager))
def accept(visitor: LoopTreeVisitor) = visitor.visitFragment(this)
+ def generate(nameManager: NameManager) = parent.getProducerGenerator.get.generate(nameManager)
override def toString = "Producer: " + parent.toString
}
class TransformFragment(parent: IterationSpace, dependencies: Set[Fragment]) extends Fragment {
def getAllFragments = Set(this)
def getDependencies = dependencies
- def collectDeclarations(nameManager: NameManager) = Set[String]()
+ def collectDeclarations(nameManager: NameManager) = parent.getIndices.flatMap(_.getDeclarations(nameManager))
def accept(visitor: LoopTreeVisitor) = visitor.visitFragment(this)
override def toString = "Transform: " + parent.toString
}
class PPDIndex(parent: PPDFunctionSet) extends DiscreteIndex {
var denseIndexNames : List[String] = Nil
+ var startNames : List[String] = Nil
+ var finishNames : List[String] = Nil
+ var offsetNames : List[String] = Nil
+ var ppdPoint : String = ""
def getName = "ppd_index"
+ def getPPDPoint = ppdPoint
+ def getStartNames = startNames
+ def getFinishNames = finishNames
+ def getOffsetNames = offsetNames
def getDependencies = Set[Index](parent.getSphereIndex)
def getDensePPDIndices = denseIndexNames
- //TODO: def getDenseWidth = parent.getSphereIndex.getSphere + "%n_ppds_sphere"
def getDenseWidth(names: NameManager) = parent.basis+"%max_n_ppds_sphere"
def generateIterationHeader(names: NameManager) = {
- val initDense = "call basis_find_ppd_in_neighbour(" + denseIndexNames.mkString(",") + ", &\n" +
+ val findPPD = "call basis_find_ppd_in_neighbour(" + denseIndexNames.mkString(",") + ", &\n" +
parent.getSphere(names) + "%ppd_list(1," + names(this) + "), &\n" +
parent.getSphere(names) + "%ppd_list(2," + names(this) + "), &\n" +
"pub_cell%n_ppds_a1, pub_cell%n_ppds_a2, pub_cell%n_ppds_a3)"
+ val computeRanges = for (dim <- 1 to 2) yield {
+ val tb = parent.getTightbox(names)
+
+ "call basis_lims_1d_in_ppd_in_tight("+startNames(dim)+", "+finishNames(dim)+", "+offsetNames(dim)+", &\n" +
+ denseIndexNames(dim)+", "+tb+"%start_ppds2, "+tb+"%finish_ppds2, &\n" +
+ tb+"%start_pts2, "+tb+"%finish_pts2, pub_cell%n_pt"+dim+")"
+ }
+
val loopDeclaration = "do "+names(this)+"=1,"+parent.getSphere(names)+"%n_ppds_sphere"
- initDense + "\n" + loopDeclaration
+ val ppdOffsetCalc = ppdPoint + " = " + parent.getSphere(names)+"%offset + ("+names(this)+"-1)*pub_cell%n_pts &\n"+
+ "+ ("+startNames(2)+"-1)*pub_cell%n_pt2*pub_cell%n_pt1 &\n"+
+ "+ ("+startNames(1)+"-1)*pub_cell%n_pt1 + ("+startNames(0)+"-1)"
+
+ (List(findPPD) ++ computeRanges ++ List(loopDeclaration) ++ List(ppdOffsetCalc)).mkString("\n")
}
def generateIterationFooter(names: NameManager) = "end do"
def getDeclarations(names: NameManager) = {
denseIndexNames = (for (dim <- 0 to 2) yield names.newIdentifier("derived_ppd_position_"+dim)).toList
- denseIndexNames.map(x => "integer :: " + x) ++ List("integer :: "+names(this))
+ startNames = (for (dim <- 0 to 2) yield names.newIdentifier("tightbox_start_"+dim)).toList
+ finishNames = (for (dim <- 0 to 2) yield names.newIdentifier("tightbox_finish_"+dim)).toList
+ offsetNames = (for (dim <- 0 to 2) yield names.newIdentifier("tightbox_offset_"+dim)).toList
+ ppdPoint = names.newIdentifier("fa_point")
+ (denseIndexNames++finishNames++offsetNames++Some(ppdPoint)).map(x => "integer :: " + x) ++ List("integer :: "+names(this))
}
}
class IntraPPDIndex(parent: PPDFunctionSet, dimension: Int) extends SpatialIndex {
+ var tbPoint : String = ""
+
def getName = "intra_ppd_index_" + dimension
- def getDependencies = Set[Index](parent.getPPDIndex)
+ private def getPPDIndex = parent.getPPDIndex
+ def getDependencies = {
+ val parentIndex = if (dimension < parent.getSpatialIndices.size-1)
+ Some(parent.getSpatialIndices(dimension+1))
+ else
+ None
+
+ Set[Index](getPPDIndex) ++ parentIndex
+ }
def getDenseWidth(names: NameManager) = "pub_cell%total_pt"+(dimension+1)
- def generateIterationHeader(names: NameManager) = "do "+names(this)+"=1,"+"pub_cell%n_pt"+(dimension+1)
- def generateIterationFooter(names: NameManager) = "end do"
- def getDeclarations(names: NameManager) = List("integer :: "+names(this))
+ def generateIterationHeader(names: NameManager) = {
+ val findPoint = tbPoint + " = " +
+ names(this) + " - " + getPPDIndex.getStartNames(dimension) + " + " +
+ getPPDIndex.getOffsetNames(dimension) + " + 1"
+
+ val header = "do "+names(this)+"="+getPPDIndex.getStartNames(dimension)+","+getPPDIndex.getFinishNames(dimension)
+
+ List(findPoint, header).mkString("\n")
+ }
+
+ def generateIterationFooter(names: NameManager) = {
+ val incPoint = if (dimension == 0) Some(getPPDIndex.ppdPoint + " = " + getPPDIndex.ppdPoint + " + 1") else None
+ val jumpOffset = "pub_cell%n_pt"+(dimension+1)+"-" +
+ getPPDIndex.getFinishNames(dimension)+"+"+
+ getPPDIndex.getStartNames(dimension)+"-1"
+ val jumpPoint = (List(getPPDIndex.ppdPoint + " = " + getPPDIndex.ppdPoint + " + (" + jumpOffset +")") ++
+ (for (dim <- 0 until dimension) yield "pub_cell%n_pt"+(dim+1))).mkString("*")
+ val endLoop = "end do"
+
+ (incPoint ++ List(endLoop, jumpPoint)).mkString("\n")
+ }
+
+ def getDeclarations(names: NameManager) = {
+ tbPoint = names.newIdentifier("tb_pt"+(dimension+1))
+ List("integer :: "+names(this), "integer :: "+tbPoint)
+ }
override def getDensePosition(names: NameManager) =
- parent.getPPDIndex.getDensePPDIndices(dimension) + "*pub_cell%n_pt"+(dimension+1) + " + " + names(this)
+ tbPoint
}
val ppdIndex = new PPDIndex(this)
def getPPDIndex = ppdIndex
def getSphereIndex = sphereIndex
def getSphere(names: NameManager) = basis + "%spheres("+names(getSphereIndex)+")"
+ def getTightbox(names: NameManager) = basis + "%tight_boxes("+names(getSphereIndex)+")"
def getNumSpheres(names: NameManager) = {
// TODO: This number is dependent on the parallel distribution
def getProducerGenerator = Some(new ProducerGenerator {
def generate(names: NameManager) = {
- val offset = getSphere(names)+"%offset + &\n" +
- "("+names(getPPDIndex)+"-1)*pub_cell%n_pts - 1 + &\n" +
- "(" + names(spatialIndices(2)) + "-1)*pub_cell%n_pt2*pub_cell%n_pt1 + &\n" +
- "(" + names(spatialIndices(1)) + "-1)*pub_cell%n_pt1 + &\n" +
- names(spatialIndices(0))
-
- data+"("+offset+")"
+ data+"("+getPPDIndex.getPPDPoint+")"
}
})
}