Added a genArrayStoreName function to GenOps and implemented it for both C and C++

This commit is contained in:
Neil Brown 2007-10-06 11:30:03 +00:00
parent 24b3975cf8
commit c521187cd2
2 changed files with 12 additions and 4 deletions

View File

@ -81,6 +81,8 @@ data GenOps = GenOps {
genArraySizesLiteral :: GenOps -> [A.Dimension] -> CGen (), genArraySizesLiteral :: GenOps -> [A.Dimension] -> CGen (),
-- | Writes out the size of the _sizes array, in square brackets. -- | Writes out the size of the _sizes array, in square brackets.
genArraySizesSize :: GenOps -> [A.Dimension] -> CGen (), genArraySizesSize :: GenOps -> [A.Dimension] -> CGen (),
-- | Writes out the actual data storage array name.
genArrayStoreName :: GenOps -> A.Name -> CGen(),
-- | Generates an array subscript for the given variable (with error checking if the Bool is True), using the given expression list as subscripts -- | Generates an array subscript for the given variable (with error checking if the Bool is True), using the given expression list as subscripts
genArraySubscript :: GenOps -> Bool -> A.Variable -> [A.Expression] -> CGen (), genArraySubscript :: GenOps -> Bool -> A.Variable -> [A.Expression] -> CGen (),
genAssert :: GenOps -> Meta -> A.Expression -> CGen (), genAssert :: GenOps -> Meta -> A.Expression -> CGen (),
@ -184,6 +186,7 @@ cgenOps = GenOps {
genArraySize = cgenArraySize, genArraySize = cgenArraySize,
genArraySizesLiteral = cgenArraySizesLiteral, genArraySizesLiteral = cgenArraySizesLiteral,
genArraySizesSize = cgenArraySizesSize, genArraySizesSize = cgenArraySizesSize,
genArrayStoreName = const genName,
genArraySubscript = cgenArraySubscript, genArraySubscript = cgenArraySubscript,
genAssert = cgenAssert, genAssert = cgenAssert,
genAssign = cgenAssign, genAssign = cgenAssign,
@ -1327,10 +1330,11 @@ cintroduceSpec ops (A.Specification _ n (A.IsExpr _ am t e))
rhs rhs
tell [";\n"] tell [";\n"]
rhsSizes n rhsSizes n
cintroduceSpec ops (A.Specification _ n (A.IsChannelArray _ t cs)) cintroduceSpec ops (A.Specification _ n (A.IsChannelArray _ (A.Array _ c) cs))
= do tell ["Channel *"] = do call genType ops c
genName n tell ["*"]
tell ["[] = {"] call genArrayStoreName ops n
tell ["[]={"]
seqComma (map (call genVariable ops) cs) seqComma (map (call genVariable ops) cs)
tell ["};\n"] tell ["};\n"]
call declareArraySizes ops [A.Dimension $ length cs] n call declareArraySizes ops [A.Dimension $ length cs] n

View File

@ -97,6 +97,7 @@ cppgenOps = cgenOps {
genActual = cppgenActual, genActual = cppgenActual,
genActuals = cppgenActuals, genActuals = cppgenActuals,
genAlt = cppgenAlt, genAlt = cppgenAlt,
genArrayStoreName = cppgenArrayStoreName,
genArraySubscript = cppgenArraySubscript, genArraySubscript = cppgenArraySubscript,
genDeclType = cppgenDeclType, genDeclType = cppgenDeclType,
genDeclaration = cppgenDeclaration, genDeclaration = cppgenDeclaration,
@ -719,6 +720,9 @@ cppremoveSpec ops (A.Specification m n (A.Declaration _ t))
cppremoveSpec _ _ = return () cppremoveSpec _ _ = return ()
cppgenArrayStoreName :: GenOps -> A.Name -> CGen()
cppgenArrayStoreName ops n = genName n >> tell ["_actual"]
-- FIXME: This could be used elsewhere (and work in any monad) -- FIXME: This could be used elsewhere (and work in any monad)
-- | A helper function that maps a function and calls sequence on the resulting [CGen()] -- | A helper function that maps a function and calls sequence on the resulting [CGen()]
cgmap :: (t -> CGen()) -> [t] -> CGen() cgmap :: (t -> CGen()) -> [t] -> CGen()