Added a new pass to turn all array slices into the full FromFor form
This commit is contained in:
parent
5c43172e46
commit
35b1ffdc51
|
@ -36,9 +36,10 @@ import Utils
|
||||||
|
|
||||||
squashArrays :: [Pass]
|
squashArrays :: [Pass]
|
||||||
squashArrays = makePassesDep
|
squashArrays = makePassesDep
|
||||||
[ ("Declare array-size arrays", declareSizesArray, prereq, [])
|
[ ("Declare array-size arrays", declareSizesArray, prereq ++ [Prop.slicesSimplified], [Prop.arraySizesDeclared])
|
||||||
, ("Add array-size arrays to PROC headers", addSizesFormalParameters, prereq, [])
|
, ("Add array-size arrays to PROC headers", addSizesFormalParameters, prereq ++ [Prop.arraySizesDeclared], [])
|
||||||
, ("Add array-size arrays to PROC calls", addSizesActualParameters, prereq, [])
|
, ("Add array-size arrays to PROC calls", addSizesActualParameters, prereq ++ [Prop.arraySizesDeclared], [])
|
||||||
|
, ("Simplify array slices", simplifySlices, prereq, [Prop.slicesSimplified])
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
prereq = Prop.agg_namesDone ++ Prop.agg_typesDone ++ Prop.agg_functionsGone ++ [Prop.subscriptsPulledUp, Prop.arrayLiteralsExpanded]
|
prereq = Prop.agg_namesDone ++ Prop.agg_typesDone ++ Prop.agg_functionsGone ++ [Prop.subscriptsPulledUp, Prop.arrayLiteralsExpanded]
|
||||||
|
@ -116,8 +117,6 @@ declareSizesArray = doGeneric `ext1M` doStructured
|
||||||
findInnerVar wv@(A.SubscriptedVariable m sub v) = case sub of
|
findInnerVar wv@(A.SubscriptedVariable m sub v) = case sub of
|
||||||
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.SubscriptFor _ for -> (Just for, snd $ findInnerVar v)
|
|
||||||
A.SubscriptFrom _ from -> (Just $ A.Dyadic m A.Subtr (A.SizeVariable m v) from, snd $ findInnerVar v)
|
|
||||||
A.Subscript {} -> findInnerVar v
|
A.Subscript {} -> findInnerVar v
|
||||||
findInnerVar v = (Nothing, v)
|
findInnerVar v = (Nothing, v)
|
||||||
|
|
||||||
|
@ -170,7 +169,7 @@ declareSizesArray = doGeneric `ext1M` doStructured
|
||||||
(A.Array srcDs _) <- typeOfVariable innerV
|
(A.Array srcDs _) <- typeOfVariable innerV
|
||||||
-- Calculate the correct subscript into the source _sizes variable to get to the dimensions for the destination:
|
-- Calculate the correct subscript into the source _sizes variable to get to the dimensions for the destination:
|
||||||
let sizeDiff = length srcDs - length ds
|
let sizeDiff = length srcDs - length ds
|
||||||
subSrcSizeVar = A.SubscriptedVariable m (A.SubscriptFrom m $ makeConstant m sizeDiff) varSrcSizes
|
subSrcSizeVar = A.SubscriptedVariable m (A.SubscriptFromFor m (makeConstant m sizeDiff) (makeConstant m $ length ds)) varSrcSizes
|
||||||
sizeSpecType = case sliceSize of
|
sizeSpecType = case sliceSize of
|
||||||
Just exp -> let subDims = [A.SubscriptedVariable m (A.Subscript m A.NoCheck $ makeConstant m n) varSrcSizes | n <- [1 .. (length srcDs - 1)]] in
|
Just exp -> let subDims = [A.SubscriptedVariable m (A.Subscript m A.NoCheck $ makeConstant m n) varSrcSizes | n <- [1 .. (length srcDs - 1)]] in
|
||||||
A.IsExpr m A.ValAbbrev (A.Array [A.Dimension $ length ds] A.Int) $
|
A.IsExpr m A.ValAbbrev (A.Array [A.Dimension $ length ds] A.Int) $
|
||||||
|
@ -308,7 +307,26 @@ addSizesActualParameters = doGeneric `extM` doProcess
|
||||||
A.Array {} -> dieP (findMeta a) "Untransformed actual parameter of type array: "
|
A.Array {} -> dieP (findMeta a) "Untransformed actual parameter of type array: "
|
||||||
_ -> return [a]
|
_ -> return [a]
|
||||||
|
|
||||||
-- | Flattens all multi-dimensional arrays into one-dimensional arrays, transforming all indexes
|
-- | Transforms all slices into the FromFor form.
|
||||||
-- as appropriate.
|
simplifySlices :: Data t => t -> PassM t
|
||||||
flattenArrays :: Data t => t -> PassM t
|
simplifySlices = doGeneric `extM` doVariable
|
||||||
flattenArrays = return -- TODO
|
where
|
||||||
|
doGeneric :: Data t => t -> PassM t
|
||||||
|
doGeneric = makeGeneric simplifySlices
|
||||||
|
|
||||||
|
-- We recurse into the subscripts in case they contain subscripts:
|
||||||
|
doVariable :: A.Variable -> PassM A.Variable
|
||||||
|
doVariable (A.SubscriptedVariable m (A.SubscriptFor m' for) v)
|
||||||
|
= do for' <- doGeneric for
|
||||||
|
v' <- doGeneric v
|
||||||
|
return (A.SubscriptedVariable m (A.SubscriptFromFor m' (makeConstant m' 0) for') v')
|
||||||
|
doVariable (A.SubscriptedVariable m (A.SubscriptFrom m' from) v)
|
||||||
|
= do v' <- doGeneric v
|
||||||
|
A.Array (d:_) _ <- typeOfVariable v'
|
||||||
|
limit <- case d of
|
||||||
|
A.Dimension n -> return $ makeConstant m' n
|
||||||
|
A.UnknownDimension -> return $ A.SizeVariable m' v'
|
||||||
|
from' <- doGeneric from
|
||||||
|
return (A.SubscriptedVariable m (A.SubscriptFromFor m' from' (A.Dyadic m A.Subtr limit from')) v')
|
||||||
|
-- We must recurse, to handle nested variables, and variables inside subscripts!
|
||||||
|
doVariable v = doGeneric v
|
||||||
|
|
|
@ -23,6 +23,7 @@ module Properties
|
||||||
, afterRemoved
|
, afterRemoved
|
||||||
, allChansToAnyOrProtocol
|
, allChansToAnyOrProtocol
|
||||||
, arrayLiteralsExpanded
|
, arrayLiteralsExpanded
|
||||||
|
, arraySizesDeclared
|
||||||
, assignFlattened
|
, assignFlattened
|
||||||
, assignParRemoved
|
, assignParRemoved
|
||||||
, constantsFolded
|
, constantsFolded
|
||||||
|
@ -49,6 +50,7 @@ module Properties
|
||||||
, rainParDeclarationsPulledUp
|
, rainParDeclarationsPulledUp
|
||||||
, rangeTransformed
|
, rangeTransformed
|
||||||
, seqInputsFlattened
|
, seqInputsFlattened
|
||||||
|
, slicesSimplified
|
||||||
, subscriptsPulledUp
|
, subscriptsPulledUp
|
||||||
, typesResolvedInAST
|
, typesResolvedInAST
|
||||||
, typesResolvedInState
|
, typesResolvedInState
|
||||||
|
@ -337,3 +339,15 @@ seqInputsFlattened = Property "seqInputsFlattened" $ checkNull "seqInputsFlatten
|
||||||
findMultipleInputs :: A.InputMode -> Bool
|
findMultipleInputs :: A.InputMode -> Bool
|
||||||
findMultipleInputs (A.InputSimple _ (_:_:_)) = True
|
findMultipleInputs (A.InputSimple _ (_:_:_)) = True
|
||||||
findMultipleInputs _ = False
|
findMultipleInputs _ = False
|
||||||
|
|
||||||
|
arraySizesDeclared :: Property
|
||||||
|
arraySizesDeclared = Property "arraySizesDeclared" nocheck
|
||||||
|
|
||||||
|
slicesSimplified :: Property
|
||||||
|
slicesSimplified = Property "slicesSimplified" $
|
||||||
|
checkNull "slicesSimplified" . listify findJustFromOrFor
|
||||||
|
where
|
||||||
|
findJustFromOrFor :: A.Subscript -> Bool
|
||||||
|
findJustFromOrFor (A.SubscriptFrom {}) = True
|
||||||
|
findJustFromOrFor (A.SubscriptFor {}) = True
|
||||||
|
findJustFromOrFor _ = False
|
||||||
|
|
Loading…
Reference in New Issue
Block a user