diff --git a/backends/BackendPasses.hs b/backends/BackendPasses.hs index a68eebc..295408f 100644 --- a/backends/BackendPasses.hs +++ b/backends/BackendPasses.hs @@ -176,6 +176,7 @@ declareSizesArray = occamOnlyPass "Declare array-size arrays" A.SubscriptField {} -> (Nothing, wv) A.SubscriptFromFor _ _ _ for -> (Just for, snd $ findInnerVar v) -- Keep the outer most A.Subscript {} -> findInnerVar v + findInnerVar (A.DirectedVariable _ _ v) = findInnerVar v findInnerVar v = (Nothing, v) -- | 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") A.DirectedVariable _ _ (A.Variable _ srcN) -> return (A.Variable m $ append_sizes srcN) + _ -> diePC m $ formatCode "Cannot handle variable % in abbrevVarSizes" innerV -- Get the dimensions of the source variable: innerVT <- astTypeOf innerV srcDs <- case innerVT of diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index 5d70d44..741a447 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -891,6 +891,13 @@ cgenArraySubscript check v es 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 cgenExpression :: A.Expression -> CGen () cgenExpression (A.Monadic m op e) = call genMonadic m op e @@ -907,8 +914,10 @@ cgenExpression (A.SizeVariable m v) A.Array (d:_) _ -> case d of A.Dimension n -> call genExpression n - A.UnknownDimension -> do call genVariable v - call genSizeSuffix "0" + A.UnknownDimension -> + let (n, v') = countSubscripts v + in do call genVariable v' + call genSizeSuffix (show n) A.List _ -> call genListSize v cgenExpression (A.Conversion m cm t e) = call genConversion m cm t e diff --git a/backends/GenerateCPPCSP.hs b/backends/GenerateCPPCSP.hs index d909aba..70e0af0 100644 --- a/backends/GenerateCPPCSP.hs +++ b/backends/GenerateCPPCSP.hs @@ -636,8 +636,7 @@ cppintroduceSpec (A.Specification _ n (A.Is _ am t@(A.Array ds c@(A.ChanEnd {})) tell [","] genName n tell [","] - call genVariableAM v am - call genSizeSuffix "0" + call genExpression (A.SizeVariable m $ A.Variable m n) tell [");"] --For all other cases, use the C implementation: cppintroduceSpec n = cintroduceSpec n diff --git a/transformations/SimplifyExprs.hs b/transformations/SimplifyExprs.hs index fc1d139..1593ed6 100644 --- a/transformations/SimplifyExprs.hs +++ b/transformations/SimplifyExprs.hs @@ -451,8 +451,14 @@ pullUp pullUpArraysInsideRecords = pass "Pull up definitions" = do t <- astTypeOf innerV case t of A.Array ds (A.Chan attr innerT) -> - do spec@(A.Specification _ n _) <- makeNonceIs "dir_array" m - (A.Array ds $ A.ChanEnd dir attr innerT) A.Abbrev v + do let ds' = [case d of + 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) return $ A.Variable m n _ -> descend v