Corrected some problems caused by moving the direction specifiers up to the whole array (the array wasn't then being pulled up)
This commit is contained in:
parent
93af6b85a4
commit
14df1e09b7
|
@ -176,6 +176,7 @@ declareSizesArray = occamOnlyPass "Declare array-size arrays"
|
||||||
A.SubscriptField {} -> (Nothing, wv)
|
A.SubscriptField {} -> (Nothing, wv)
|
||||||
A.SubscriptFromFor _ _ _ for -> (Just for, snd $ findInnerVar v) -- Keep the outer most
|
A.SubscriptFromFor _ _ _ for -> (Just for, snd $ findInnerVar v) -- Keep the outer most
|
||||||
A.Subscript {} -> findInnerVar v
|
A.Subscript {} -> findInnerVar v
|
||||||
|
findInnerVar (A.DirectedVariable _ _ v) = findInnerVar v
|
||||||
findInnerVar v = (Nothing, v)
|
findInnerVar v = (Nothing, v)
|
||||||
|
|
||||||
-- | Generate the @_sizes@ array for a 'Retypes' expression.
|
-- | Generate the @_sizes@ array for a 'Retypes' expression.
|
||||||
|
@ -237,6 +238,7 @@ declareSizesArray = occamOnlyPass "Declare array-size arrays"
|
||||||
return (A.Variable m $ A.Name m $ A.nameName recordName ++ A.nameName fieldName ++ "_sizes")
|
return (A.Variable m $ A.Name m $ A.nameName recordName ++ A.nameName fieldName ++ "_sizes")
|
||||||
A.DirectedVariable _ _ (A.Variable _ srcN) -> return (A.Variable m
|
A.DirectedVariable _ _ (A.Variable _ srcN) -> return (A.Variable m
|
||||||
$ append_sizes srcN)
|
$ append_sizes srcN)
|
||||||
|
_ -> diePC m $ formatCode "Cannot handle variable % in abbrevVarSizes" innerV
|
||||||
-- Get the dimensions of the source variable:
|
-- Get the dimensions of the source variable:
|
||||||
innerVT <- astTypeOf innerV
|
innerVT <- astTypeOf innerV
|
||||||
srcDs <- case innerVT of
|
srcDs <- case innerVT of
|
||||||
|
|
|
@ -891,6 +891,13 @@ cgenArraySubscript check v es
|
||||||
genChunks = map genDim subs
|
genChunks = map genDim subs
|
||||||
--}}}
|
--}}}
|
||||||
|
|
||||||
|
countSubscripts :: A.Variable -> (Int, A.Variable)
|
||||||
|
countSubscripts (A.SubscriptedVariable _ (A.Subscript {}) v)
|
||||||
|
= let (n, v') = countSubscripts v in (1+n, v')
|
||||||
|
countSubscripts (A.SubscriptedVariable _ _ v) = countSubscripts v
|
||||||
|
countSubscripts (A.DirectedVariable _ _ v) = countSubscripts v
|
||||||
|
countSubscripts v@(A.Variable _ _) = (0, v)
|
||||||
|
|
||||||
--{{{ expressions
|
--{{{ expressions
|
||||||
cgenExpression :: A.Expression -> CGen ()
|
cgenExpression :: A.Expression -> CGen ()
|
||||||
cgenExpression (A.Monadic m op e) = call genMonadic m op e
|
cgenExpression (A.Monadic m op e) = call genMonadic m op e
|
||||||
|
@ -907,8 +914,10 @@ cgenExpression (A.SizeVariable m v)
|
||||||
A.Array (d:_) _ ->
|
A.Array (d:_) _ ->
|
||||||
case d of
|
case d of
|
||||||
A.Dimension n -> call genExpression n
|
A.Dimension n -> call genExpression n
|
||||||
A.UnknownDimension -> do call genVariable v
|
A.UnknownDimension ->
|
||||||
call genSizeSuffix "0"
|
let (n, v') = countSubscripts v
|
||||||
|
in do call genVariable v'
|
||||||
|
call genSizeSuffix (show n)
|
||||||
A.List _ ->
|
A.List _ ->
|
||||||
call genListSize v
|
call genListSize v
|
||||||
cgenExpression (A.Conversion m cm t e) = call genConversion m cm t e
|
cgenExpression (A.Conversion m cm t e) = call genConversion m cm t e
|
||||||
|
|
|
@ -636,8 +636,7 @@ cppintroduceSpec (A.Specification _ n (A.Is _ am t@(A.Array ds c@(A.ChanEnd {}))
|
||||||
tell [","]
|
tell [","]
|
||||||
genName n
|
genName n
|
||||||
tell [","]
|
tell [","]
|
||||||
call genVariableAM v am
|
call genExpression (A.SizeVariable m $ A.Variable m n)
|
||||||
call genSizeSuffix "0"
|
|
||||||
tell [");"]
|
tell [");"]
|
||||||
--For all other cases, use the C implementation:
|
--For all other cases, use the C implementation:
|
||||||
cppintroduceSpec n = cintroduceSpec n
|
cppintroduceSpec n = cintroduceSpec n
|
||||||
|
|
|
@ -451,8 +451,14 @@ pullUp pullUpArraysInsideRecords = pass "Pull up definitions"
|
||||||
= do t <- astTypeOf innerV
|
= do t <- astTypeOf innerV
|
||||||
case t of
|
case t of
|
||||||
A.Array ds (A.Chan attr innerT) ->
|
A.Array ds (A.Chan attr innerT) ->
|
||||||
do spec@(A.Specification _ n _) <- makeNonceIs "dir_array" m
|
do let ds' = [case d of
|
||||||
(A.Array ds $ A.ChanEnd dir attr innerT) A.Abbrev v
|
A.Dimension {} -> d
|
||||||
|
A.UnknownDimension -> A.Dimension $ A.SizeVariable m $
|
||||||
|
foldr (\n v -> A.SubscriptedVariable m (A.Subscript m A.CheckBoth
|
||||||
|
n) v) innerV (replicate i $ makeConstant m 0)
|
||||||
|
| (d, i) <- zip ds [0..]]
|
||||||
|
spec@(A.Specification _ n _) <- makeNonceIs "dir_array" m
|
||||||
|
(A.Array ds' $ A.ChanEnd dir attr innerT) A.Abbrev v
|
||||||
addPulled $ (m, Left spec)
|
addPulled $ (m, Left spec)
|
||||||
return $ A.Variable m n
|
return $ A.Variable m n
|
||||||
_ -> descend v
|
_ -> descend v
|
||||||
|
|
Loading…
Reference in New Issue
Block a user