@@ -20,13 +20,13 @@ module Clash.Normalize where
2020import qualified Control.Concurrent.Async.Lifted as Async
2121import Control.Concurrent.MVar.Lifted (MVar )
2222import qualified Control.Concurrent.MVar.Lifted as MVar
23- import Control.Concurrent.Supply (Supply )
23+ import Control.Concurrent.Supply (Supply , splitSupply )
2424import Control.Exception (throw )
2525import qualified Control.Lens as Lens
26- import Control.Monad (when , unless )
26+ import Control.Monad (when )
2727import qualified Control.Monad.IO.Class as Monad (liftIO )
2828import Control.Monad.State.Strict (State )
29- import Data.Bifunctor (first , second )
29+ import Data.Bifunctor (second )
3030import Data.Default (def )
3131import Data.Either (lefts ,partitionEithers )
3232import Data.Foldable (traverse_ )
@@ -71,7 +71,7 @@ import Clash.Core.Var (Id, varName, varType)
7171import Clash.Core.VarEnv
7272 (VarEnv , VarSet , elemVarSet , eltsVarEnv , emptyInScopeSet , emptyVarEnv , emptyVarSet ,
7373 extendVarEnv , extendVarSet , lookupVarEnv , mapVarEnv , mapMaybeVarEnv ,
74- mkVarEnv , mkVarSet , notElemVarEnv , notElemVarSet , nullVarEnv )
74+ mkVarEnv , mkVarSet , notElemVarEnv , notElemVarSet , nullVarEnv , unionVarEnv )
7575import Clash.Debug (traceIf )
7676import Clash.Driver.Types
7777 (BindingMap , Binding (.. ), DebugOpts (.. ), ClashEnv (.. ))
@@ -85,7 +85,7 @@ import Clash.Normalize.Types
8585import Clash.Normalize.Util
8686import Clash.Rewrite.Combinators ((>->) ,(!->) ,repeatR ,topdownR )
8787import Clash.Rewrite.Types
88- (RewriteEnv (.. ), RewriteState (.. ), bindings , debugOpts , extra ,
88+ (RewriteEnv (.. ), RewriteState (.. ), bindings , debugOpts , extra , uniqSupply ,
8989 tcCache , topEntities , newInlineStrategy , ioLock )
9090import Clash.Rewrite.Util
9191 (apply , isUntranslatableType , runRewriteSession )
@@ -133,7 +133,7 @@ runNormalization env supply globals typeTrans peEval eval rcsMap lock entities s
133133 rwState <- RewriteState
134134 <$> MVar. newMVar mempty
135135 <*> MVar. newMVar globals
136- <*> MVar. newMVar supply
136+ <*> pure supply
137137 <*> MVar. newMVar HashMap. empty
138138 <*> MVar. newMVar 0
139139 <*> MVar. newMVar (mempty , 0 )
@@ -151,20 +151,28 @@ runNormalization env supply globals typeTrans peEval eval rcsMap lock entities s
151151 , _topEntities = mkVarSet entities
152152 }
153153
154+ supplies :: Int -> Supply -> [Supply ]
155+ supplies 0 _ = []
156+ supplies n s = let (s0', s1') = splitSupply s in s0' : supplies (n- 1 ) s1'
157+
154158normalize :: [Id ] -> NormalizeSession BindingMap
155159normalize tops = do
156160 q <- Monad. liftIO MS. newQ
157161 traverse_ (Monad. liftIO . MS. pushL q) tops
158162 binds <- MVar. newMVar (emptyVarSet, [] )
163+ uniq0 <- Lens. use uniqSupply
164+ let ss = supplies (length tops) uniq0
159165 -- one thread per top-level binding
160- Async. replicateConcurrently_ ( length tops) ( normalizeStep q binds)
166+ Async. mapConcurrently_ ( normalizeStep q binds) ss
161167 mkVarEnv . snd <$> MVar. readMVar binds
162168
163169normalizeStep
164170 :: MS. LinkedQueue Id
165171 -> MVar (VarSet , [(Id , Binding Term )])
172+ -> Supply
166173 -> NormalizeSession ()
167- normalizeStep q binds = do
174+ normalizeStep q binds s = do
175+ uniqSupply Lens. .= s
168176 res <- Monad. liftIO $ MS. tryPopR q
169177 case res of
170178 Just id' -> do
@@ -177,7 +185,8 @@ normalizeStep q binds = do
177185 MVar. modifyMVar_ binds (pure . second (pair: ))
178186 else
179187 MVar. putMVar binds (bound, pairs)
180- normalizeStep q binds
188+ nextS <- Lens. use uniqSupply
189+ normalizeStep q binds nextS
181190 Nothing -> pure ()
182191
183192normalize' :: Id -> MS. LinkedQueue Id -> NormalizeSession (Id , Binding Term )
0 commit comments