--- /dev/null
+package ofc.codegen
+
+object BinaryOperator {
+ sealed abstract class Operator
+ case object Add extends Operator
+ case object Sub extends Operator
+ case object Mul extends Operator
+ case object Div extends Operator
+ case object Mod extends Operator
+}
+
+class BinaryOperator(op: BinaryOperator.Operator, left: Expression, right: Expression) extends Expression
package ofc.codegen
class Expression {
- def %(field: FieldSymbol) : Expression = new FieldAccess(this, field)
+ 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)
+ def +(rhs: Expression) : Expression = new BinaryOperator(BinaryOperator.Add, this, rhs)
+ def -(rhs: Expression) : Expression = new BinaryOperator(BinaryOperator.Sub, this, rhs)
+ def *(rhs: Expression) : Expression = new BinaryOperator(BinaryOperator.Mul, this, rhs)
+ def /(rhs: Expression) : Expression = new BinaryOperator(BinaryOperator.Div, this, rhs)
+ def %(rhs: Expression) : Expression = new BinaryOperator(BinaryOperator.Mod, this, rhs)
}
// Variable references
val data = NamedUnboundVarSymbol(dataName)
val pubCell = NamedUnboundVarSymbol("pub_cell")
- val numSpheres = basis % FieldSymbol("num");
- 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)
+ val numSpheres = basis~>FieldSymbol("num");
+ 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 getSuffixFragment = {
val producer = new ProducerStatement
val sphereIndex = producer.addIteration("sphere_index", numSpheres)
- val numPPDs = (basis % FieldSymbol("n_ppds_sphere"))(sphereIndex)
+ val numPPDs = (basis~>FieldSymbol("n_ppds_sphere"))(sphereIndex)
val ppdIndex = producer.addIteration("ppd_index", numPPDs)
- val ppdGlobalCount = (basis % FieldSymbol("ppd_list"))(ppdIndex, new IntegerLiteral(1))
+ val ppdGlobalCount = (basis~>FieldSymbol("ppd_list"))(ppdIndex, new IntegerLiteral(1)) - new IntegerLiteral(1)
- // We need to calculate the integer co-ordinates of the PPD
+ // We need to calculate the integer co-ordinates of the PPD (0-based)
+ val a3pos = ppdGlobalCount / (cellWidthInPPDs(0)*cellWidthInPPDs(1))
+ val a2pos = (ppdGlobalCount % (cellWidthInPPDs(0)*cellWidthInPPDs(1)))/cellWidthInPPDs(0)
+ val a1pos = ppdGlobalCount % cellWidthInPPDs(0)
//val ppdRanges = for(dim <- 0 to 2) yield producer.addIteration("point"+(dim+1), ppdWidths(dim))
- val tightbox = basis % FieldSymbol("tight_boxes")
+ val tightbox = basis~>FieldSymbol("tight_boxes")
producer
}