diff --git a/transformations/PassTest.hs b/transformations/PassTest.hs index 3a19607..d4f6d28 100644 --- a/transformations/PassTest.hs +++ b/transformations/PassTest.hs @@ -227,7 +227,8 @@ testTransformConstr0 = TestCase $ testPass "transformConstr0" exp transformConst orig = A.Spec m (A.Specification m (simpleName "arr") $ A.IsExpr m A.ValAbbrev t $ A.ExprConstr m $ - A.RepConstr m t (simpleName "x") (A.For m (intLiteral 0) (intLiteral 10)) + A.RepConstr m t (simpleName "x") (A.For m (intLiteral 0) (intLiteral 10) + (intLiteral 1)) (exprVariable "x")) skipP exp = nameAndStopCaringPattern "indexVar" "i" $ mkPattern exp' exp' = A.Spec m (A.Specification m (simpleName "arr") (A.Declaration m t)) $ @@ -236,7 +237,7 @@ testTransformConstr0 = TestCase $ testPass "transformConstr0" exp transformConst (A.Declaration m A.Int)) $ A.Several m [A.Only m $ A.Assign m [variable "i"] $ A.ExpressionList m [intLiteral 0], - A.Spec m (A.Specification m (simpleName "x") $ A.Rep m (A.For m (intLiteral 0) (intLiteral 10))) $ + A.Spec m (A.Specification m (simpleName "x") $ A.Rep m (A.For m (intLiteral 0) (intLiteral 10) (intLiteral 1))) $ A.Only m $ A.Seq m $ A.Several m [A.Only m $ A.Assign m [A.SubscriptedVariable m (A.Subscript m A.NoCheck $ @@ -586,7 +587,7 @@ testPullRepCounts = TestList ,forAllThree $ \blockType -> testOccamPassTransform "testPullRepCounts 5" (nameAndStopCaringPattern "nonce" "A") (blockType [decl' (simpleName "X") - (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (intLiteral 6))) + (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (intLiteral 6) (intLiteral 1))) A.Original A.NameUser [] ] `becomes` @@ -594,7 +595,7 @@ testPullRepCounts = TestList [decl' (simpleName "A") (A.IsExpr emptyMeta A.ValAbbrev A.Int $ intLiteral 6) A.ValAbbrev A.NameNonce [decl' (simpleName "X") - (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (exprVariable "A"))) + (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (exprVariable "A") (intLiteral 1))) A.Original A.NameUser [] ] ] @@ -604,10 +605,10 @@ testPullRepCounts = TestList (nameAndStopCaringPattern "nonce1" "A" . nameAndStopCaringPattern "nonce2" "B") (blockType [decl' (simpleName "X") - (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (intLiteral 6))) + (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (intLiteral 6) (intLiteral 1))) A.Original A.NameUser [decl' (simpleName "Y") - (A.Rep emptyMeta (A.For emptyMeta (intLiteral 1) (intLiteral 8))) + (A.Rep emptyMeta (A.For emptyMeta (intLiteral 1) (intLiteral 8) (intLiteral 2))) A.Original A.NameUser [] ] ] @@ -616,12 +617,13 @@ testPullRepCounts = TestList [decl' (simpleName "A") (A.IsExpr emptyMeta A.ValAbbrev A.Int $ intLiteral 6) A.ValAbbrev A.NameNonce [decl' (simpleName "X") - (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (exprVariable "A"))) + (A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (exprVariable "A") (intLiteral 1))) A.Original A.NameUser [decl' (simpleName "B") (A.IsExpr emptyMeta A.ValAbbrev A.Int $ intLiteral 8) A.ValAbbrev A.NameNonce [decl' (simpleName "Y") - (A.Rep emptyMeta (A.For emptyMeta (intLiteral 1) (exprVariable "B"))) + (A.Rep emptyMeta (A.For emptyMeta (intLiteral 1) (exprVariable "B") + (intLiteral 2))) A.Original A.NameUser [] ] @@ -642,7 +644,8 @@ testPullRepCounts = TestList (return ()) where code = (f $ A.Spec emptyMeta (A.Specification emptyMeta (simpleName - "i") $ A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (intLiteral 5))) $ A.Several emptyMeta []) + "i") $ A.Rep emptyMeta (A.For emptyMeta (intLiteral 0) (intLiteral 5) + (intLiteral 1))) $ A.Several emptyMeta []) testRemoveNesting :: Test diff --git a/transformations/SimplifyExprs.hs b/transformations/SimplifyExprs.hs index f258e3e..ead1251 100644 --- a/transformations/SimplifyExprs.hs +++ b/transformations/SimplifyExprs.hs @@ -159,6 +159,8 @@ expandArrayLiterals = pass "Expand array literals" -- Therefore, we only need to pull up the counts for SEQ, PAR and ALT -- -- TODO for simplification, we could avoid pulling up replication counts that are known to be constants +-- +-- TODO we should also pull up the step counts pullRepCounts :: Pass pullRepCounts = pass "Pull up replicator counts for SEQs, PARs and ALTs" (Prop.agg_namesDone ++ Prop.agg_typesDone) @@ -170,10 +172,10 @@ pullRepCounts = pass "Pull up replicator counts for SEQs, PARs and ALTs" where pullRepCount :: Data a => A.Structured a -> PassM (A.Structured a) pullRepCount (A.Spec m (A.Specification mspec n (A.Rep mrep (A.For mfor - from for))) scope) + from for step))) scope) = do t <- astTypeOf for spec@(A.Specification _ nonceName _) <- makeNonceIsExpr "rep_for" mspec t for - let newSpec = (A.Rep mrep (A.For mfor from (A.ExprVariable mspec $ A.Variable mspec nonceName))) + let newSpec = (A.Rep mrep (A.For mfor from (A.ExprVariable mspec $ A.Variable mspec nonceName) step)) modifyName n $ \nd -> nd { A.ndSpecType = newSpec } return $ A.Spec mspec spec $ A.Spec m (A.Specification mspec n newSpec) scope diff --git a/transformations/SimplifyProcs.hs b/transformations/SimplifyProcs.hs index d8df32f..9cd0a24 100644 --- a/transformations/SimplifyProcs.hs +++ b/transformations/SimplifyProcs.hs @@ -122,7 +122,7 @@ flattenAssign = pass "Flatten assignment" -- inside. do counter <- makeNonceCounter "i" m let zero = A.Literal m A.Int $ A.IntLiteral m "0" - let rep = A.For m zero (A.SizeVariable m srcV) + let rep = A.For m zero (A.SizeVariable m srcV) (makeConstant m 1) itemT <- trivialSubscriptType m t -- Don't need to check bounds, as we'll always be within bounds let sub = A.Subscript m A.NoCheck (A.ExprVariable m