predicates +:= new Predicate(condition)
}
- def merge(statement: ProducerStatement) {
- ranges ++= statement.ranges
- predicates ++= statement.predicates
- expressions ++= statement.expressions
+ def merge(statement: ProducerStatement) : ProducerStatement = {
+ val result = new ProducerStatement
+ result.ranges = ranges ++ statement.ranges
+ result.predicates = predicates ++ statement.predicates
+ result.expressions = expressions ++ statement.expressions
+ result
}
def toConcrete : Statement = {
def getOperands = List(rhs)
def getSpatialIndices = Nil
def getDiscreteIndices = Nil
- def getPrefixFragment = new ProducerStatement
- def getSuffixFragment = new ProducerStatement
- def getBodyFragment = new ProducerStatement
+ def getProducer(ancestors: Map[IterationSpace, ProducerStatement]) = ancestors.get(rhs).get
def getDataValue = new FloatLiteral(0.0)
}
// TODO: Until we can handle multi-operand nodes
assert(space.getOperands.size < 2)
- val result = new ProducerStatement
- result.merge(space.getBodyFragment)
- result.merge(space.getPrefixFragment)
- result.merge(space.getSuffixFragment)
-
+ var operandProducers : Map[IterationSpace, ProducerStatement] = Map.empty
for(operand <- space.getOperands) {
- val opStatement = buildStatement(operand)
+ val opProducer = buildStatement(operand)
for(discreteIndex <- operand.getDiscreteIndices) indexBindings.getBindingIndex(discreteIndex) match {
case Some(bindingIndex) => {
val symbol = indexSymbols.get(bindingIndex).get
- val newData = opStatement.addPredicate(symbol |==| discreteIndex.getValue)
+ val newData = opProducer.addPredicate(symbol |==| discreteIndex.getValue)
}
case _ => ()
}
for(spatialIndex <- operand.getSpatialIndices) indexBindings.getBindingIndex(spatialIndex) match {
case Some(bindingIndex) => {
val symbol = indexSymbols.get(bindingIndex).get
- val newData = opStatement.addPredicate(symbol |==| spatialIndex.getValue)
+ val newData = opProducer.addPredicate(symbol |==| spatialIndex.getValue)
}
case _ => ()
}
- result.merge(opStatement)
+ operandProducers += operand -> opProducer
}
- result
+
+ space.getProducer(operandProducers)
}
def generateCode(space: IterationSpace) {
+++ /dev/null
-package ofc.generators.onetep
-import ofc.codegen.NullStatement
-
-class DataSpaceIndexBinding(operand: DataSpace) extends DataSpace {
- def getSpatialIndices = operand.getSpatialIndices
- def getDiscreteIndices = Nil
- def getDataValue = operand.getDataValue
- def getSuffixFragment = operand.getSuffixFragment
-}
val operands = getOperands
operands.toSet ++ operands.flatMap(_.getDependencies)
}
-
- def getBodyFragment : ProducerStatement
- def getPrefixFragment : ProducerStatement
- def getSuffixFragment : ProducerStatement
+ def getProducer(ancestors: Map[IterationSpace, ProducerStatement]) : ProducerStatement
}
trait DataSpace extends IterationSpace {
def getOperands = Nil
- def getPrefixFragment = new ProducerStatement
- def getBodyFragment = new ProducerStatement
+ def getProducer(ancestors: Map[IterationSpace, ProducerStatement]) = this.getProducer
+ def getProducer : ProducerStatement
}
trait Matrix extends DataSpace
+++ /dev/null
-package ofc.generators.onetep
-import ofc.codegen.NullStatement
-
-class IterationSpaceIndexBinding(operand: IterationSpace) extends IterationSpace {
- def getOperands = operand.getOperands
- def getSpatialIndices = operand.getSpatialIndices
- def getDiscreteIndices = Nil
- def getDataValue = operand.getDataValue
- def getBodyFragment = operand.getBodyFragment
- def getSuffixFragment = operand.getSuffixFragment
- def getPrefixFragment = operand.getPrefixFragment
-}
spatialIndices: Seq[SpatialIndex], data: Expression[FloatType],
producer: ProducerStatement) extends FunctionSet {
- def getSuffixFragment = producer
+ def getProducer = producer
def getDiscreteIndices = discreteIndices
def getSpatialIndices = spatialIndices
def getDataValue = data
def getSpatialIndices = Nil
def getDiscreteIndices = Nil
def getDataValue = new FloatLiteral(0.0)
- def getSuffixFragment = new ProducerStatement
+ def getProducer = new ProducerStatement
}
spatialIndices: Seq[SpatialIndex], producer: ProducerStatement) extends IterationSpace {
def getOperands = List(op)
def getDiscreteIndices = Nil
- def getPrefixFragment = new ProducerStatement
- def getSuffixFragment = new ProducerStatement
def getDataValue = op.getDataValue
- def getBodyFragment = producer
+ def getProducer(ancestors: Map[IterationSpace, ProducerStatement]) = producer merge ancestors.get(op).get
def getSpatialIndices = spatialIndices
}