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:
parent
4111dd3cb7
commit
9b96ea9899
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user