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)

This commit is contained in:
Neil Brown 2007-10-03 16:55:48 +00:00
parent 4111dd3cb7
commit 9b96ea9899
2 changed files with 13 additions and 68 deletions

View File

@ -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

View File

@ -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