From 9b96ea989918f7f1970f575d35ad43bb6c0f9a35 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Wed, 3 Oct 2007 16:55:48 +0000 Subject: [PATCH] Removed the C++CSP implementation of genVariable' by adding a new function (genDirectedVariable) that represents the only change from the C version (and added C and C++ version of genDirectedVariable accordingly) --- backends/GenerateC.hs | 8 ++++- backends/GenerateCPPCSP.hs | 73 ++++---------------------------------- 2 files changed, 13 insertions(+), 68 deletions(-) diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index 36baf64..c76e1ed 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -91,6 +91,7 @@ data GenOps = GenOps { genDecl :: GenOps -> A.AbbrevMode -> A.Type -> A.Name -> CGen (), genDeclType :: GenOps -> A.AbbrevMode -> A.Type -> CGen (), genDeclaration :: GenOps -> A.Type -> A.Name -> CGen (), + genDirectedVariable :: GenOps -> CGen () -> A.Direction -> CGen (), genDyadic :: GenOps -> Meta -> A.DyadicOp -> A.Expression -> A.Expression -> CGen (), genExpression :: GenOps -> A.Expression -> CGen (), genFlatArraySize :: GenOps -> [A.Dimension] -> CGen (), @@ -182,6 +183,7 @@ cgenOps = GenOps { genDecl = cgenDecl, genDeclType = cgenDeclType, genDeclaration = cgenDeclaration, + genDirectedVariable = cgenDirectedVariable, genDyadic = cgenDyadic, genExpression = cgenExpression, genFlatArraySize = cgenFlatArraySize, @@ -728,7 +730,7 @@ cgenVariable' ops checkValid v inner :: A.Variable -> CGen () inner (A.Variable _ n) = genName n - inner (A.DirectedVariable _ _ v) = inner v + inner (A.DirectedVariable _ dir v) = call genDirectedVariable ops (inner v) dir inner sv@(A.SubscriptedVariable _ (A.Subscript _ _) _) = do let (es, v) = collectSubs sv call genVariable ops v @@ -752,6 +754,10 @@ cgenVariable' ops checkValid v (es', v') = collectSubs v collectSubs v = ([], v) + +cgenDirectedVariable :: GenOps -> CGen () -> A.Direction -> CGen () +cgenDirectedVariable _ var _ = var + cgenArraySubscript :: GenOps -> Bool -> A.Variable -> [A.Expression] -> CGen () cgenArraySubscript ops checkValid v es = do t <- typeOfVariable v diff --git a/backends/GenerateCPPCSP.hs b/backends/GenerateCPPCSP.hs index ebe52ad..56944e5 100644 --- a/backends/GenerateCPPCSP.hs +++ b/backends/GenerateCPPCSP.hs @@ -102,6 +102,7 @@ cppgenOps = cgenOps { genArraySubscript = cppgenArraySubscript, genDeclType = cppgenDeclType, genDeclaration = cppgenDeclaration, + genDirectedVariable = cppgenDirectedVariable, genFlatArraySize = cppgenFlatArraySize, genForwardDeclaration = cppgenForwardDeclaration, genGetTime = cppgenGetTime, @@ -123,7 +124,6 @@ cppgenOps = cgenOps { genType = cppgenType, genUnfoldedExpression = cppgenUnfoldedExpression, genUnfoldedVariable = cppgenUnfoldedVariable, - genVariable' = cppgenVariable', genWait = cppgenWait, getScalarType = cppgetScalarType, introduceSpec = cppintroduceSpec, @@ -1271,69 +1271,8 @@ cppgenDeclType ops am t A.Record _ -> tell [" *"] _ -> when (am == A.Abbrev) $ tell [" *"] - - --- | This function was changed deep inside -- the addition of .access() in the "inner" sub-function -cppgenVariable' :: GenOps -> Bool -> A.Variable -> CGen () -cppgenVariable' ops checkValid v - = do am <- accessAbbrevMode v - t <- typeOfVariable v - let isSub = case v of - A.Variable _ _ -> False - A.SubscriptedVariable _ _ _ -> True - A.DirectedVariable _ _ _ -> False - - let prefix = case (am, t) of - (_, A.Array _ _) -> "" - (A.Original, A.Chan {}) -> if isSub then "" else "&" - (A.Abbrev, A.Chan {}) -> "" - (A.Original, A.Record _) -> "&" - (A.Abbrev, A.Record _) -> "" - (A.Abbrev, _) -> "*" - _ -> "" - - when (prefix /= "") $ tell ["(", prefix] - inner v - when (prefix /= "") $ tell [")"] - where - -- | Find the effective abbreviation mode for the variable we're looking at. - -- This differs from abbrevModeOfVariable in that it will return Original - -- for array and record elements (because when we're generating C, we can - -- treat c->x as if it's just x). - accessAbbrevMode :: A.Variable -> CGen A.AbbrevMode - accessAbbrevMode (A.Variable _ n) = abbrevModeOfName n - accessAbbrevMode (A.DirectedVariable _ _ v) = accessAbbrevMode v - accessAbbrevMode (A.SubscriptedVariable _ sub v) - = do am <- accessAbbrevMode v - return $ case (am, sub) of - (_, A.Subscript _ _) -> A.Original - (_, A.SubscriptField _ _) -> A.Original - _ -> am - - inner :: A.Variable -> CGen () - inner (A.Variable _ n) = genName n - inner (A.DirectedVariable _ A.DirInput v) = tell ["(("] >> inner v >> tell [")->reader())"] - inner (A.DirectedVariable _ A.DirOutput v) = tell ["(("] >> inner v >> tell [")->writer())"] - inner sv@(A.SubscriptedVariable _ (A.Subscript _ _) _) - = do let (es, v) = collectSubs sv - call genVariable ops v - call genArraySubscript ops checkValid v es - inner (A.SubscriptedVariable _ (A.SubscriptField m n) v) - = do call genVariable ops v - tell ["->"] - genName n - inner (A.SubscriptedVariable m (A.SubscriptFromFor m' start _) v) - = inner (A.SubscriptedVariable m (A.Subscript m' start) v) - inner (A.SubscriptedVariable m (A.SubscriptFrom m' start) v) - = inner (A.SubscriptedVariable m (A.Subscript m' start) v) - inner (A.SubscriptedVariable m (A.SubscriptFor m' _) v) - = inner (A.SubscriptedVariable m (A.Subscript m' (makeConstant m' 0)) v) - - -- | Collect all the plain subscripts on a variable, so we can combine them. - collectSubs :: A.Variable -> ([A.Expression], A.Variable) - collectSubs (A.SubscriptedVariable _ (A.Subscript _ e) v) - = (es' ++ [e], v') - where - (es', v') = collectSubs v - collectSubs v = ([], v) - +-- | Changed because C++CSP has channel-ends as concepts (whereas CCSP does not) +cppgenDirectedVariable :: GenOps -> CGen () -> A.Direction -> CGen () +cppgenDirectedVariable ops v A.DirInput = tell ["(("] >> v >> tell [")->reader())"] +cppgenDirectedVariable ops v A.DirOutput = tell ["(("] >> v >> tell [")->writer())"] +cppgenDirectedVariable ops v dir = call genMissing ops $ "Cannot direct variable to direction: " ++ show dir