Added a pass to remove unneeded directions, i.e. c! where c is already an output end
This commit is contained in:
parent
c6959ac854
commit
cc70438c1b
|
@ -30,6 +30,7 @@ import Metadata
|
||||||
import Pass
|
import Pass
|
||||||
import PrettyShow
|
import PrettyShow
|
||||||
import qualified Properties as Prop
|
import qualified Properties as Prop
|
||||||
|
import ShowCode
|
||||||
import Traversal
|
import Traversal
|
||||||
import Types
|
import Types
|
||||||
import Utils
|
import Utils
|
||||||
|
@ -37,6 +38,7 @@ import Utils
|
||||||
squashArrays :: [Pass]
|
squashArrays :: [Pass]
|
||||||
squashArrays =
|
squashArrays =
|
||||||
[ removeDirections
|
[ removeDirections
|
||||||
|
, removeUnneededDirections
|
||||||
, simplifySlices
|
, simplifySlices
|
||||||
, declareSizesArray
|
, declareSizesArray
|
||||||
, addSizesFormalParameters
|
, addSizesFormalParameters
|
||||||
|
@ -60,6 +62,32 @@ removeDirections
|
||||||
doVariable (A.DirectedVariable _ _ v) = v
|
doVariable (A.DirectedVariable _ _ v) = v
|
||||||
doVariable v = v
|
doVariable v = v
|
||||||
|
|
||||||
|
-- | Remove variable directions that are superfluous. This prevents confusing
|
||||||
|
-- later passes, where the user has written something like:
|
||||||
|
-- []CHAN INT da! IS ...:
|
||||||
|
-- foo(da!)
|
||||||
|
--
|
||||||
|
-- The second direction specifier is unneeded, and will confuse passes such as
|
||||||
|
-- those adding sizes parameters (which looks for plain variables, since directed
|
||||||
|
-- arrays should already have been pulled up).
|
||||||
|
removeUnneededDirections :: Pass
|
||||||
|
removeUnneededDirections
|
||||||
|
= occamOnlyPass "Remove unneeded variable directions"
|
||||||
|
prereq
|
||||||
|
[]
|
||||||
|
(applyDepthM doVariable)
|
||||||
|
where
|
||||||
|
doVariable :: Transform (A.Variable)
|
||||||
|
doVariable whole@(A.DirectedVariable m dir v)
|
||||||
|
= do t <- astTypeOf v
|
||||||
|
case t of
|
||||||
|
A.Chan {} -> return whole
|
||||||
|
A.Array _ (A.Chan {}) -> return whole
|
||||||
|
A.ChanEnd chanDir _ _ | dir == chanDir -> return v
|
||||||
|
A.Array _ (A.ChanEnd chanDir _ _) | dir == chanDir -> return v
|
||||||
|
_ -> diePC m $ formatCode "Direction applied to non-channel type: %" t
|
||||||
|
doVariable v = return v
|
||||||
|
|
||||||
transformWaitFor :: Pass
|
transformWaitFor :: Pass
|
||||||
transformWaitFor = cOnlyPass "Transform wait for guards into wait until guards"
|
transformWaitFor = cOnlyPass "Transform wait for guards into wait until guards"
|
||||||
[]
|
[]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user