]> git.unchartedbackwaters.co.uk Git - francis/ofc.git/commitdiff
Start work on different composition strategy. producer
authorFrancis Russell <francis@unchartedbackwaters.co.uk>
Tue, 17 Apr 2012 17:53:57 +0000 (18:53 +0100)
committerFrancis Russell <francis@unchartedbackwaters.co.uk>
Tue, 17 Apr 2012 17:53:57 +0000 (18:53 +0100)
src/ofc/codegen/ProducerStatement.scala
src/ofc/generators/onetep/Assignment.scala
src/ofc/generators/onetep/CodeGenerator.scala
src/ofc/generators/onetep/DataSpaceIndexBinding.scala [deleted file]
src/ofc/generators/onetep/IterationSpace.scala
src/ofc/generators/onetep/IterationSpaceIndexBinding.scala [deleted file]
src/ofc/generators/onetep/PPDFunctionSet.scala
src/ofc/generators/onetep/SPAM3.scala
src/ofc/generators/onetep/SpatialRestriction.scala

index 9bd9bb472f36fd24faa238a265314df1b52ac1b1..485781f4e89102a685d763d71a61eff38bdc486b 100644 (file)
@@ -104,10 +104,12 @@ class ProducerStatement extends Statement {
     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 = {
index 90d432b6947fa4ed1e6b202787d4dd32520f1149..36414b8d6ec8c4ef5ab340be093c57fe4985ce45 100644 (file)
@@ -6,8 +6,6 @@ class Assignment(indexBindings: IndexBindings, lhs: DataSpace, rhs: IterationSpa
   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)
 }
index bd88eae89d03351b86e460463b37a425c4a83607..4d6737e2e1c0fa2adda1cfb69ad1f7f5c514b24e 100644 (file)
@@ -59,18 +59,14 @@ class CodeGenerator(indexBindings: IndexBindings) {
     // 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 _ => ()
       }
@@ -78,14 +74,15 @@ class CodeGenerator(indexBindings: IndexBindings) {
       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) {
diff --git a/src/ofc/generators/onetep/DataSpaceIndexBinding.scala b/src/ofc/generators/onetep/DataSpaceIndexBinding.scala
deleted file mode 100644 (file)
index ce74c84..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-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
-}
index 1770e75ee0de0b9a57ec8e8ff36ca56f1da73a84..d159245cb62d34052192e22890260821c68c940e 100644 (file)
@@ -27,16 +27,13 @@ trait IterationSpace {
     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
diff --git a/src/ofc/generators/onetep/IterationSpaceIndexBinding.scala b/src/ofc/generators/onetep/IterationSpaceIndexBinding.scala
deleted file mode 100644 (file)
index 94e11a1..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-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
-}
index 1ecd583dd011b6c83e3caa74c99a628e95c040bc..60d39188514d6ffbbd2e56c2f33790f86fdb3af6 100644 (file)
@@ -100,7 +100,7 @@ class PPDFunctionSet private(discreteIndices: Seq[DiscreteIndex],
   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
index c22b35324e89105d912aad57e556b74307394073..6c5042817af2de5428432619b7e116b36b7f8bfc 100644 (file)
@@ -8,5 +8,5 @@ class SPAM3(name : String) extends Matrix {
   def getSpatialIndices = Nil
   def getDiscreteIndices = Nil
   def getDataValue = new FloatLiteral(0.0)
-  def getSuffixFragment = new ProducerStatement
+  def getProducer = new ProducerStatement
 }
index 65e74f49537d3b1e0666fc50dffec594d3a9d1a7..48093456399fa8b605e52466daa08dbabfcd05e2 100644 (file)
@@ -47,10 +47,8 @@ class SpatialRestriction private(op: IterationSpace,
   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
 }