packages feed

feldspar-compiler-0.2: Feldspar/Compiler/Imperative/Representation.hs

{-# LANGUAGE TypeFamilies #-}

module Feldspar.Compiler.Imperative.Representation where

import Feldspar.Compiler.Imperative.Semantics

-- ===========================================================================
--  == Representation of imperative programs
-- ===========================================================================

-- ========================= [ Procedure ] ===================================

data (SemanticInfo t) => Procedure t = Procedure {
    procedureName        :: String,
    inParameters         :: [FormalParameter t],
    outParameters        :: [FormalParameter t],
    procedureBody        :: Block t,
    procedureSemInf :: ProcedureInfo t
} deriving (Eq,Show)

-- ========================= [ Block ] =======================================

data (SemanticInfo t) => Block t = Block {
    blockData   :: BlockData t,
    blockSemInf :: BlockInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => BlockData t = BlockData {
    blockDeclarations  :: [LocalDeclaration t],
    blockInstructions  :: Program t
} deriving (Eq,Show)

-- ========================= [ Program ] =====================================

data (SemanticInfo t) => Program t = Program {
    programConstruction :: ProgramConstruction t,
    programSemInf       :: ProgramInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => ProgramConstruction t =
      EmptyProgram (Empty t)
    | PrimitiveProgram (Primitive t)
    | SequenceProgram (Sequence t)
    | BranchProgram (Branch t)
    | SequentialLoopProgram (SequentialLoop t)
    | ParallelLoopProgram (ParallelLoop t)
    deriving (Eq,Show)

data (SemanticInfo t) => Empty t = Empty {
    emptySemInf :: EmptyInfo t
} deriving (Eq,Show)
    
data (SemanticInfo t) => Primitive t = Primitive {
    primitiveInstruction :: Instruction t,
    primitiveSemInf :: PrimitiveInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => Sequence t = Sequence {
    sequenceProgramList :: [Program t],
    sequenceSemInf :: SequenceInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => Branch t = Branch {
    branchData   :: BranchData t,
    branchSemInf :: BranchInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => BranchData t = BranchData {
    branchConditionVariable :: Variable t, -- ???
    thenBlock               :: Block t,
    elseBlock               :: Block t
} deriving (Eq, Show)

data (SemanticInfo t) => SequentialLoop t = SequentialLoop {
    sequentialLoopData   :: SequentialLoopData t,
    sequentialLoopSemInf :: SequentialLoopInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => SequentialLoopData t = SequentialLoopData {
    sequentialLoopCondition         :: Expression t,
    conditionCalculation            :: Block t, -- ???
    sequentialLoopCore              :: Block t
} deriving (Eq, Show)

data (SemanticInfo t) => ParallelLoop t = ParallelLoop {
    parallelLoopData   :: ParallelLoopData t,
    parallelLoopSemInf :: ParallelLoopInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => ParallelLoopData t = ParallelLoopData {
    parallelLoopConditionVariable :: Variable t,
    numberOfIterations            :: Expression t, -- ???
    parallelLoopStep              :: Int, -- ???
    parallelLoopCore              :: Block t
} deriving (Eq, Show)

-- ========================= [ FormalParameter ] =============================

data (SemanticInfo t) => FormalParameter t = FormalParameter {
    formalParameterVariable :: Variable t,
    formalParameterSemInf   :: FormalParameterInfo t
} deriving (Eq,Show)

-- ========================= [ LocalDeclaration ] ============================

data (SemanticInfo t) => LocalDeclaration t = LocalDeclaration {
    localDeclarationData   :: LocalDeclarationData t,
    localDeclarationSemInf :: LocalDeclarationInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => LocalDeclarationData t = LocalDeclarationData {
    localVariable          :: Variable t,
    localInitValue         :: Maybe (Expression t)
} deriving (Eq,Show)

-- ========================= [ Expression ] ==================================

data (SemanticInfo t) => Expression t =
      LeftValueExpression (LeftValueInExpression t)
    | ConstantExpression (Constant t)
    | FunctionCallExpression (FunctionCall t)
    deriving (Eq, Show)

data (SemanticInfo t) => LeftValueInExpression t = LeftValueInExpression {
    leftValueExpressionContents :: LeftValue t,
    leftValueExpressionSemInf   :: LeftValueExpressionInfo t
} deriving (Eq, Show)

data (SemanticInfo t) => FunctionCall t = FunctionCall {
    functionCallData   :: FunctionCallData t,
    functionCallSemInf :: FunctionCallInfo t 
} deriving (Eq, Show)

data (SemanticInfo t) => FunctionCallData t = FunctionCallData { 
    roleOfFunctionToCall             :: FunctionRole,
    typeOfFunctionToCall             :: Type,
    nameOfFunctionToCall             :: String,
    actualParametersOfFunctionToCall :: [Expression t] 
} deriving (Eq,Show)

-- ========================= [ LeftValue ] ===================================

data (SemanticInfo t) => LeftValue t =
      VariableLeftValue (VariableInLeftValue t)
    | ArrayElemReferenceLeftValue (ArrayElemReference t)
    deriving (Eq,Show)

data (SemanticInfo t) => VariableInLeftValue t = VariableInLeftValue {
    variableLeftValueContents :: Variable t,
    variableLeftValueSemInf :: VariableInLeftValueInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => ArrayElemReference t = ArrayElemReference {
    arrayElemReferenceData   :: ArrayElemReferenceData t,
    arrayElemReferenceSemInf :: ArrayElemReferenceInfo t 
} deriving (Eq,Show)

data (SemanticInfo t) => ArrayElemReferenceData t = ArrayElemReferenceData {
    arrayName  :: LeftValue t,
    arrayIndex :: Expression t
} deriving (Eq,Show)

-- ========================= [ Instruction ] =================================

data (SemanticInfo t) => Instruction t =
      AssignmentInstruction (Assignment t)
    | ProcedureCallInstruction (ProcedureCall t)
    deriving (Eq,Show)

data (SemanticInfo t) => Assignment t = Assignment {
    assignmentData   :: AssignmentData t,
    assignmentSemInf :: AssignmentInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => AssignmentData t = AssignmentData {
    assignmentLhs :: LeftValue t,
    assignmentRhs :: Expression t
} deriving (Eq,Show)

data (SemanticInfo t) => ProcedureCall t = ProcedureCall {
    procedureCallData   :: ProcedureCallData t,
    procedureCallSemInf :: ProcedureCallInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => ProcedureCallData t = ProcedureCallData {
    nameOfProcedureToCall             :: String,
    actualParametersOfProcedureToCall :: [ActualParameter t]
} deriving (Eq,Show)

-- ========================= [ ActualParameter ] =============================

data (SemanticInfo t) => ActualParameter t =
      InputActualParameter (InputActualParameterType t)
    | OutputActualParameter (OutputActualParameterType t)
    deriving (Eq,Show)

data (SemanticInfo t) => InputActualParameterType t = InputActualParameterType {
    inputActualParameterExpression :: Expression t,
    inputActualParameterSemInf :: InputActualParameterInfo t
} deriving (Eq,Show)

data (SemanticInfo t) => OutputActualParameterType t = OutputActualParameterType {
    outputActualParameterLeftValue :: LeftValue t,
    outputActualParameterSemInf :: OutputActualParameterInfo t
} deriving (Eq,Show)

-- ========================= [ Constant ] ====================================

data Constant t = IntConstant (IntConstantType t)
                | FloatConstant (FloatConstantType t)
                | BoolConstant (BoolConstantType t)
                | ArrayConstant (ArrayConstantType t)
    deriving (Eq,Show)
    
data (SemanticInfo t) => IntConstantType t = IntConstantType {
    intConstantValue  :: Int,
    intConstantSemInf :: IntConstantInfo t
} deriving (Eq, Show)

data (SemanticInfo t) => FloatConstantType t = FloatConstantType {
    floatConstantValue  :: Float,
    floatConstantSemInf :: FloatConstantInfo t
} deriving (Eq, Show)

data (SemanticInfo t) => BoolConstantType t = BoolConstantType {
    boolConstantValue  :: Bool,
    boolConstantSemInf :: BoolConstantInfo t
} deriving (Eq, Show)

data (SemanticInfo t) => ArrayConstantType t = ArrayConstantType {
    arrayConstantValue :: [Constant t],
    arrayConstantSemInf :: ArrayConstantInfo t
} deriving (Eq, Show)

-- ========================= [ Variable ] ====================================

data (SemanticInfo t) => Variable t = Variable {
    variableData   :: VariableData,
    variableSemInf :: VariableInfo t
} deriving (Eq,Show)

data VariableData = VariableData {
    variableRole   :: VariableRole,
    variableType   :: Type,
    variableName   :: String
} deriving (Eq,Show)

-- ========================= [ Basic structures ] ============================

data Length = Norm Int | Defined Int | Undefined  
    deriving (Eq,Show)

data Size = S8 | S16 | S32 | S64
    deriving (Eq,Show)

data Signedness = ImpSigned | ImpUnsigned
    deriving (Eq,Show)

data Type = BoolType | FloatType | Numeric Signedness Size | ImpArrayType Length Type
    deriving (Eq,Show)
    
data FunctionRole = SimpleFun | InfixOp | PrefixOp
    deriving (Eq,Show)

data VariableRole = Value {- input of main & local -} | FunOut {- output of main -}
    deriving (Eq,Show)