--- /dev/null
+package ofc.codegen
+
+class Comment(value: String) extends Statement {
+ def getValue = value
+}
--- /dev/null
+package ofc.codegen
+import ofc.UnimplementedException
+import scala.collection.mutable.ArrayBuffer
+
+class FortranGenerator {
+ val buffer = new ArrayBuffer[String]
+
+ def processStatement(stat: Statement) : String = {
+ stat match {
+ case (x : NullStatement) => ()
+ case (x : Comment) => addLine("!" + x.getValue)
+ case (x : BlockStatement) => processScope(x)
+ case (x : ProducerStatement) => processStatement(x.toConcrete)
+ case x => throw new UnimplementedException("Unknown statement type in FORTRAN generator: " + x.toString)
+ }
+
+ buffer.mkString("\n")
+ }
+
+ private def processScope(scope: ScopeStatement) {
+ for(stat <- scope.getStatements) {
+ processStatement(stat)
+ }
+ }
+
+ private def addLine(line: String) {
+ buffer += line
+ }
+}
package ofc.codegen
class ProducerStatement extends Statement {
- class VariableRange(symbol: Symbol, first: Expression[IntType], last: Expression[IntType])
- class Predicate
+ case class VariableRange(symbol: Symbol, first: Expression[IntType], last: Expression[IntType])
+ case class Predicate(expression: Expression[BoolType])
- var statement = new NullStatement
+ var statement = new Comment("Placeholder statement for consumer.")
var ranges : Seq[VariableRange] = Nil
var predicates : Seq[Predicate] = Nil
- var expressions : Map[Symbol, Expression[_]] = Map.empty
+ var expressions : Map[VarSymbol[_], Expression[_]] = Map.empty
def addExpression[T <: Type](name: String, expression: Expression[T]) : VarSymbol[T] = {
val symbol = new DeclaredVarSymbol[T](name)
ranges +:= new VariableRange(symbol, first, last)
symbol
}
+
+ def toConcrete = new Comment("Producer flattening unimplemented.")
}
def +=(stat: Statement) {
statements += stat
}
+
+ def getStatements : Seq[Statement] = statements.toSeq
}
class BlockStatement(initialStatements: Seq[Statement] = Nil) extends ScopeStatement(initialStatements) {
statements += op.getReaderFragment
statements += op.getSuffixFragment
}
+
+ val fortranGenerator = new FortranGenerator
+ val code = fortranGenerator.processStatement(statements)
+ println(code)
}
}
package ofc.generators.onetep
-import ofc.codegen.NullStatement
+import ofc.codegen.{NullStatement,Comment}
class SPAM3(name : String) extends Matrix {
override def toString = name
def getSpatialIndices = Nil
def getDiscreteIndices = Nil
- def getSuffixFragment = null
+ def getSuffixFragment = new Comment("Suffix of "+toString+".")
}