def %(field: FieldSymbol) : Expression = new FieldAccess(this, field)
def readAt(index: List[Expression]) : Expression = new ArrayRead(this, index)
def apply(index: Expression*) : Expression = this.readAt(index.toList)
-
- implicit def fromInt(value: Int) : Expression = new IntegerLiteral(value)
}
// Variable references
+++ /dev/null
-package ofc.codegen
-
-class IterationTemplate(statement: Statement) {
-}
--- /dev/null
+package ofc.codegen
+
+class ProducerStatement extends Statement {
+ class VariableRange(symbol: Symbol, count: Expression)
+ class Predicate
+
+ var statement = new NullStatement
+ var ranges : List[VariableRange] = List.empty
+ var predicates : List[Predicate] = List.empty
+ var expressions : Map[Symbol, Expression] = Map.empty
+
+ def addExpression(name: String, expression: Expression) : VarSymbol = {
+ val symbol = new DeclaredVarSymbol(name)
+ expressions += symbol -> expression
+ symbol
+ }
+
+ def addIteration(name: String, count: Expression) : VarSymbol = {
+ val symbol = new DeclaredVarSymbol(name)
+ ranges +:= new VariableRange(symbol, count)
+ symbol
+ }
+}
package ofc.codegen
+import scala.collection.mutable.ArrayBuffer
+
+class ScopeStatement(initialStatements: List[Statement]) extends Statement {
+
+ val statements = initialStatements.toBuffer
-class ScopeStatement(var statements: List[Statement]) extends Statement {
def this() = this(List.empty)
- def +=(stat: Statement) = statements += stat
+ def +=(stat: Statement) {
+ statements += stat
+ }
}
package ofc.generators.onetep
-import ofc.codegen.IterationTemplate
+import ofc.codegen.{Statement,NullStatement}
/*
object IterationSpace {
val operands = getOperands
operands.toSet ++ operands.flatMap(_.getDependencies)
}
- def getReader : IterationTemplate
+ def getReaderFragment : Statement
+ def getSuffixFragment : Statement
}
trait DataSpace extends IterationSpace {
def getOperands = Nil
+ def getReaderFragment = new NullStatement
}
trait Matrix extends DataSpace
val pubCell = NamedUnboundVarSymbol("pub_cell")
val numSpheres = basis % FieldSymbol("num");
- val ppdWidths = for(dim <- 1 to 3) yield pubCell % FieldSymbol("n_ppds_a"+dim)
+ val ppdWidths = for(dim <- 1 to 3) yield pubCell % FieldSymbol("n_pt"+dim)
+ val cellWidthInPPDs = for(dim <- 1 to 3) yield pubCell % FieldSymbol("n_ppds_a"+dim)
- def getReader = {
- var sphereIndex = new IterationSymbol("sphere_index", numSpheres)
+ def getSuffixFragment = {
+ val producer = new ProducerStatement
+ val sphereIndex = producer.addIteration("sphere_index", numSpheres)
val numPPDs = (basis % FieldSymbol("n_ppds_sphere"))(sphereIndex)
- val ppdIndex = new IterationSymbol("ppd_index", numPPDs)
- val ppdRanges = for(dim <- 1 to 3) yield new IterationSymbol("point"+dim, ppdWidths(dim))
- new IterationTemplate(sphereLoop)
+ val ppdIndex = producer.addIteration("ppd_index", numPPDs)
+ val ppdGlobalCount = (basis % FieldSymbol("ppd_list"))(ppdIndex, new IntegerLiteral(1))
+
+ // We need to calculate the integer co-ordinates of the PPD
+
+ //val ppdRanges = for(dim <- 0 to 2) yield producer.addIteration("point"+(dim+1), ppdWidths(dim))
+ val tightbox = basis % FieldSymbol("tight_boxes")
+
+ producer
}
def getDiscreteIndices = List.empty