diff --git a/RainPasses.hs b/RainPasses.hs index 51229f1..a61e313 100644 --- a/RainPasses.hs +++ b/RainPasses.hs @@ -19,22 +19,27 @@ rainPasses = runPasses passes [ ("Convert seqeach/pareach loops into classic replicated SEQ/PAR",transformEach) ] ---TODO test this pass and then tidy it up transformEach :: Data t => t -> PassM t transformEach = everywhereM (mkM transformEach') where transformEach' :: A.Structured -> PassM A.Structured transformEach' (A.Rep m (A.ForEach m' loopVar loopExp) s) = do (spec,var) <- case loopExp of - (A.ExprVariable _ v) -> return (\x -> x,v) + (A.ExprVariable _ v) -> return (id,v) _ -> do t <- typeOfExpression loopExp spec@(A.Specification _ n' _) <- makeNonceIsExpr "loopVar" m t loopExp - return (\x -> A.Spec m spec x,A.Variable m n') + return (A.Spec m spec,A.Variable m n') --spec is a function A.Structured -> A.Structured, var is an A.Variable loopVarType <- typeOfName loopVar loopIndex <- makeNonce "loopIndex" let newRep = A.For m' (simpleName loopIndex) (intLiteral 0) (A.SizeVariable m' var) - let s' = A.Spec m' (A.Specification m' loopVar (A.Is m' A.Abbrev loopVarType (A.SubscriptedVariable m' (A.Subscript m' (A.ExprVariable m' (variable loopIndex))) var) )) s - return (spec (A.Rep m newRep s')) + let s' = A.Spec m' + (A.Specification m' loopVar + (A.Is m' A.Abbrev loopVarType + (A.SubscriptedVariable m' (A.Subscript m' (A.ExprVariable m' (variable loopIndex))) var) + ) + ) + s + return (spec (A.Rep m newRep s')) transformEach' s = return s