, ValueType(..)
, Expression(..)
, Assignment(..)
- , DiagonalOperator(..)
- , OperatorExpr(..)
, OFL2
, buildSecondLevel
) where
RealType |
ComplexType |
IntegerType |
- Psinc Integer |
- PsincReciprocal Integer
+ Psinc Integer |
+ PsincReciprocal Integer |
+ RealFunction |
+ ComplexFunction
deriving Show
-data Expression =
+data Expression =
IndexedIdentifier String [String] |
- Upsample |
- Downsample |
- Apply DiagonalOperator Expression |
- Product Expression Expression |
- InnerProduct Expression Expression
- deriving Show
-
-data Assignment =
- Assign Expression Expression
- deriving Show
-
-data DiagonalOperator =
- PositionOperator OperatorExpr |
- MomentumOperator OperatorExpr
- deriving Show
-
-data OperatorExpr =
+ ToMomentum Expression |
+ ToPosition Expression |
+ Upsample Expression |
+ Downsample Expression |
+ Integrate Expression |
ConstReal Double |
+ ConstInteger Integer |
ConstComplex (Complex Double) |
- ConstInteger Integer |
- Negate OperatorExpr |
LatticeComponent String |
- Multiply OperatorExpr OperatorExpr |
- Sum OperatorExpr String |
- Power OperatorExpr OperatorExpr
+ Negate Expression |
+ Sum Expression String |
+ Add Expression Expression |
+ Sub Expression Expression |
+ Mul Expression Expression |
+ Div Expression Expression |
+ Pow Expression Expression
deriving Show
+data Assignment =
+ Assign Expression Expression
+ deriving Show
+
data OFL2 = OFL2 {
symbols :: SymbolTable,
assignments :: [Assignment],
}
buildSecondLevel :: OFL -> OFL2
-buildSecondLevel ofl =
- emptyOFL2 {
+buildSecondLevel ofl = completeOFL2
+ where
+ completeOFL2 = partialOFL2 {
+ assignments = map (buildAssignment ofl partialOFL2) (TopLevel.getAssignments ofl)
+ }
+ partialOFL2 = emptyOFL2 {
symbols = buildSymbolTable ofl,
targetMappings = TopLevel.getTargetMappings ofl,
outputFunction = TopLevel.getOutputFunction ofl
fortranToValueType TM.FunctionBasis = error "ONETEP function basis cannot be mapped to value types."
fortranToValueType TM.Integer = IntegerType
fortranToValueType (TM.Array t _) = fortranToValueType t
+
+buildAssignment :: OFL -> OFL2 -> TopLevel.Assignment -> Assignment
+buildAssignment ofl ofl2 (TopLevel.Assign lhs rhs) =
+ Assign (buildExpression' lhs) (buildExpression' rhs)
+ where
+ buildExpression' = buildExpression ofl ofl2
+
+buildExpression :: OFL -> OFL2 -> TopLevel.Expression -> Expression
+buildExpression _ _ (TopLevel.IndexedIdentifier name indices) = IndexedIdentifier name indices
+buildExpression _ _ (TopLevel.ConstReal r) = ConstReal r
+buildExpression _ _ (TopLevel.ConstInteger i) = ConstInteger i
+buildExpression ofl ofl2 (TopLevel.Negate e) = Negate $ buildExpression ofl ofl2 e
+buildExpression ofl ofl2 (TopLevel.Integrate e) = Integrate $ buildExpression ofl ofl2 e
+buildExpression ofl ofl2 (TopLevel.Sum e index) = Sum (buildExpression ofl ofl2 e) index
+buildExpression ofl ofl2 (TopLevel.Multiply e1 e2) = Mul (buildExpression ofl ofl2 e1) (buildExpression ofl ofl2 e2)
+buildExpression ofl ofl2 (TopLevel.Divide e1 e2) = Div (buildExpression ofl ofl2 e1) (buildExpression ofl ofl2 e2)
+buildExpression ofl ofl2 (TopLevel.Add e1 e2) = Add (buildExpression ofl ofl2 e1) (buildExpression ofl ofl2 e2)
+buildExpression ofl ofl2 (TopLevel.Sub e1 e2) = Sub (buildExpression ofl ofl2 e1) (buildExpression ofl ofl2 e2)
+buildExpression ofl ofl2 (TopLevel.Power e1 e2) = Pow (buildExpression ofl ofl2 e1) (buildExpression ofl ofl2 e2)
+buildExpression _ _ (TopLevel.PositionComponent i) = LatticeComponent i
+buildExpression ofl ofl2 (TopLevel.SpatialDerivative e index n) = Mul operator $ ToMomentum (buildExpression ofl ofl2 e)
+ where
+ operator = Pow derivative (ConstInteger n)
+ derivative = Mul (LatticeComponent index) (ConstComplex $ 0.0 :+ (-1.0))