From: Francis Russell Date: Thu, 5 Apr 2012 18:01:02 +0000 (+0100) Subject: Add skeleton for Fortran generation. X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=05915b9344bf6e2e30d4f39c819fe99dac65c543;p=francis%2Fofc.git Add skeleton for Fortran generation. --- diff --git a/src/ofc/codegen/Comment.scala b/src/ofc/codegen/Comment.scala new file mode 100644 index 0000000..56f4f1a --- /dev/null +++ b/src/ofc/codegen/Comment.scala @@ -0,0 +1,5 @@ +package ofc.codegen + +class Comment(value: String) extends Statement { + def getValue = value +} diff --git a/src/ofc/codegen/FortranGenerator.scala b/src/ofc/codegen/FortranGenerator.scala new file mode 100644 index 0000000..69a9aec --- /dev/null +++ b/src/ofc/codegen/FortranGenerator.scala @@ -0,0 +1,29 @@ +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 + } +} diff --git a/src/ofc/codegen/ProducerStatement.scala b/src/ofc/codegen/ProducerStatement.scala index e3b3c72..35687bb 100644 --- a/src/ofc/codegen/ProducerStatement.scala +++ b/src/ofc/codegen/ProducerStatement.scala @@ -1,13 +1,13 @@ 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) @@ -20,4 +20,6 @@ class ProducerStatement extends Statement { ranges +:= new VariableRange(symbol, first, last) symbol } + + def toConcrete = new Comment("Producer flattening unimplemented.") } diff --git a/src/ofc/codegen/ScopeStatement.scala b/src/ofc/codegen/ScopeStatement.scala index 1614c18..b44b8a4 100644 --- a/src/ofc/codegen/ScopeStatement.scala +++ b/src/ofc/codegen/ScopeStatement.scala @@ -7,6 +7,8 @@ abstract class ScopeStatement(initialStatements: Seq[Statement] = Nil) extends S def +=(stat: Statement) { statements += stat } + + def getStatements : Seq[Statement] = statements.toSeq } class BlockStatement(initialStatements: Seq[Statement] = Nil) extends ScopeStatement(initialStatements) { diff --git a/src/ofc/generators/onetep/CodeGenerator.scala b/src/ofc/generators/onetep/CodeGenerator.scala index d164fd9..23f24ca 100644 --- a/src/ofc/generators/onetep/CodeGenerator.scala +++ b/src/ofc/generators/onetep/CodeGenerator.scala @@ -67,5 +67,9 @@ class CodeGenerator { statements += op.getReaderFragment statements += op.getSuffixFragment } + + val fortranGenerator = new FortranGenerator + val code = fortranGenerator.processStatement(statements) + println(code) } } diff --git a/src/ofc/generators/onetep/SPAM3.scala b/src/ofc/generators/onetep/SPAM3.scala index 8198822..a8a2856 100644 --- a/src/ofc/generators/onetep/SPAM3.scala +++ b/src/ofc/generators/onetep/SPAM3.scala @@ -1,5 +1,5 @@ package ofc.generators.onetep -import ofc.codegen.NullStatement +import ofc.codegen.{NullStatement,Comment} class SPAM3(name : String) extends Matrix { override def toString = name @@ -7,5 +7,5 @@ class SPAM3(name : String) extends Matrix { def getSpatialIndices = Nil def getDiscreteIndices = Nil - def getSuffixFragment = null + def getSuffixFragment = new Comment("Suffix of "+toString+".") }