From d21025ed51944d882765881c639875377fe86f53 Mon Sep 17 00:00:00 2001 From: Francis Russell Date: Thu, 29 Mar 2012 20:13:37 +0100 Subject: [PATCH] Work on expression representation. --- src/ofc/codegen/ArrayRange.scala | 9 ++++++++ src/ofc/codegen/Expression.scala | 21 +++++++++++++++++- src/ofc/codegen/LoopRange.scala | 4 ---- src/ofc/codegen/Record.scala | 3 --- src/ofc/codegen/Symbol.scala | 22 +++++++++++++++++-- src/ofc/codegen/Type.scala | 3 --- .../generators/onetep/PPDFunctionSet.scala | 14 ++++++++++-- 7 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 src/ofc/codegen/ArrayRange.scala delete mode 100644 src/ofc/codegen/LoopRange.scala delete mode 100644 src/ofc/codegen/Record.scala delete mode 100644 src/ofc/codegen/Type.scala diff --git a/src/ofc/codegen/ArrayRange.scala b/src/ofc/codegen/ArrayRange.scala new file mode 100644 index 0000000..070e394 --- /dev/null +++ b/src/ofc/codegen/ArrayRange.scala @@ -0,0 +1,9 @@ +package ofc.codegen + +class ArrayRange private(name: String, count: Expression, statements: List[Statement]) extends Statement { + val index = UniqueUnboundVarSymbol(name) + + def getIndex = index + def this(name: String, start: Expression, count: Expression) = this(name, start, count, List.empty) + def +(stat: Statement) = new ArrayRange(name, start, count, statements :+ stat) +} diff --git a/src/ofc/codegen/Expression.scala b/src/ofc/codegen/Expression.scala index ab49031..3036318 100644 --- a/src/ofc/codegen/Expression.scala +++ b/src/ofc/codegen/Expression.scala @@ -1,3 +1,22 @@ package ofc.codegen -trait Expression +class Expression { + 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 +class VarRef(symbol: VarSymbol) extends Expression + +// Struct and array accesses +class FieldAccess(expression: Expression, field: FieldSymbol) extends Expression +class ArrayRead(expression: Expression, index: List[Expression]) extends Expression + +// Literals +class IntegerLiteral(value: Int) extends Expression +object IntegerLiteral { + implicit def fromInt(value: Int) : Expression = new IntegerLiteral(value) +} diff --git a/src/ofc/codegen/LoopRange.scala b/src/ofc/codegen/LoopRange.scala deleted file mode 100644 index 985b09e..0000000 --- a/src/ofc/codegen/LoopRange.scala +++ /dev/null @@ -1,4 +0,0 @@ -package ofc.codegen - -class LoopRange(index: VariableSymbol, start: Expression, count: Expression, statement: Statement) extends Statement { -} diff --git a/src/ofc/codegen/Record.scala b/src/ofc/codegen/Record.scala deleted file mode 100644 index c8341a1..0000000 --- a/src/ofc/codegen/Record.scala +++ /dev/null @@ -1,3 +0,0 @@ -package ofc.codegen - -class RecordType extends Type diff --git a/src/ofc/codegen/Symbol.scala b/src/ofc/codegen/Symbol.scala index 5993e19..af5fedb 100644 --- a/src/ofc/codegen/Symbol.scala +++ b/src/ofc/codegen/Symbol.scala @@ -1,4 +1,22 @@ package ofc.codegen -class Symbol(name: String) -class VariableSymbol(name: String) extends Symbol(name) +trait Symbol { + def getName : String +} + +case class FieldSymbol(name: String) extends Symbol { + def getName = name +} + +abstract class VarSymbol(name: String) extends Symbol { + def getName = name +} + +object VarSymbol { + implicit def toRef(symbol: VarSymbol) = new VarRef(symbol) +} + +case class DeclaredVarSymbol(name: String) extends VarSymbol(name) +abstract class UnboundVarSymbol(name: String) extends VarSymbol(name) +case class NamedUnboundVarSymbol(name: String) extends UnboundVarSymbol(name) +case class UniqueUnboundVarSymbol(name: String) extends UnboundVarSymbol(name) diff --git a/src/ofc/codegen/Type.scala b/src/ofc/codegen/Type.scala deleted file mode 100644 index 0094ef0..0000000 --- a/src/ofc/codegen/Type.scala +++ /dev/null @@ -1,3 +0,0 @@ -package ofc.codegen - -trait Type diff --git a/src/ofc/generators/onetep/PPDFunctionSet.scala b/src/ofc/generators/onetep/PPDFunctionSet.scala index 37a771d..7d90eba 100644 --- a/src/ofc/generators/onetep/PPDFunctionSet.scala +++ b/src/ofc/generators/onetep/PPDFunctionSet.scala @@ -1,10 +1,20 @@ package ofc.generators.onetep import ofc.codegen._ -class PPDFunctionSet(val basis : String, data : String) extends FunctionSet { +class PPDFunctionSet(val basisName: String, dataName: String) extends FunctionSet { + val basis = NamedUnboundVarSymbol(basisName) + val data = NamedUnboundVarSymbol(dataName) + val numSpheres = basis % FieldSymbol("num"); + def getReader = { - new IterationTemplate(new NullStatement()) + var sphereLoop = new ArrayRange("sphere_index", 1, numSpheres) + val sphereIndex = sphereLoop.getIndex + + var numPPDs = (basis % FieldSymbol("n_ppds_sphere"))(sphereIndex) + var ppdLoop = new ArrayRange("ppd_index", 1, numPPDs) + new IterationTemplate(sphereLoop) } + def getDiscreteIndices = List.empty def getSpatialIndices = List.empty /* -- 2.47.3