]> git.unchartedbackwaters.co.uk Git - francis/ofc.git/commitdiff
Add skeleton for Fortran generation.
authorFrancis Russell <francis@unchartedbackwaters.co.uk>
Thu, 5 Apr 2012 18:01:02 +0000 (19:01 +0100)
committerFrancis Russell <francis@unchartedbackwaters.co.uk>
Thu, 5 Apr 2012 18:01:02 +0000 (19:01 +0100)
src/ofc/codegen/Comment.scala [new file with mode: 0644]
src/ofc/codegen/FortranGenerator.scala [new file with mode: 0644]
src/ofc/codegen/ProducerStatement.scala
src/ofc/codegen/ScopeStatement.scala
src/ofc/generators/onetep/CodeGenerator.scala
src/ofc/generators/onetep/SPAM3.scala

diff --git a/src/ofc/codegen/Comment.scala b/src/ofc/codegen/Comment.scala
new file mode 100644 (file)
index 0000000..56f4f1a
--- /dev/null
@@ -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 (file)
index 0000000..69a9aec
--- /dev/null
@@ -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
+  }
+}
index e3b3c72d136dec9be033b7d730e03a91754383a2..35687bb8901a7f8887c748f2e0f684be6670d9d3 100644 (file)
@@ -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.")
 }
index 1614c186b4ab3a4913fade34ce24ed3f384e108c..b44b8a4f735a08bef1f6124e9f5debb62d763e3b 100644 (file)
@@ -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) {
index d164fd95f97e5409d553a14dcbeb4e4fed16ee5c..23f24ca064d5af307cbda365d8aed69eb64a305a 100644 (file)
@@ -67,5 +67,9 @@ class CodeGenerator {
       statements += op.getReaderFragment
       statements += op.getSuffixFragment
     }
+
+    val fortranGenerator = new FortranGenerator
+    val code = fortranGenerator.processStatement(statements)
+    println(code)
   }
 }
index 81988227d084b15ab55f2a5f17b27181ebdc9852..a8a2856515972fda884af6fc2843f945c8f3ce4d 100644 (file)
@@ -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+".")
 }