@@ -20,13 +20,13 @@ module Clash.Normalize where
20
20
import qualified Control.Concurrent.Async.Lifted as Async
21
21
import Control.Concurrent.MVar.Lifted (MVar )
22
22
import qualified Control.Concurrent.MVar.Lifted as MVar
23
- import Control.Concurrent.Supply (Supply )
23
+ import Control.Concurrent.Supply (Supply , splitSupply )
24
24
import Control.Exception (throw )
25
25
import qualified Control.Lens as Lens
26
- import Control.Monad (when , unless )
26
+ import Control.Monad (when )
27
27
import qualified Control.Monad.IO.Class as Monad (liftIO )
28
28
import Control.Monad.State.Strict (State )
29
- import Data.Bifunctor (first , second )
29
+ import Data.Bifunctor (second )
30
30
import Data.Default (def )
31
31
import Data.Either (lefts ,partitionEithers )
32
32
import Data.Foldable (traverse_ )
@@ -71,7 +71,7 @@ import Clash.Core.Var (Id, varName, varType)
71
71
import Clash.Core.VarEnv
72
72
(VarEnv , VarSet , elemVarSet , eltsVarEnv , emptyInScopeSet , emptyVarEnv , emptyVarSet ,
73
73
extendVarEnv , extendVarSet , lookupVarEnv , mapVarEnv , mapMaybeVarEnv ,
74
- mkVarEnv , mkVarSet , notElemVarEnv , notElemVarSet , nullVarEnv )
74
+ mkVarEnv , mkVarSet , notElemVarEnv , notElemVarSet , nullVarEnv , unionVarEnv )
75
75
import Clash.Debug (traceIf )
76
76
import Clash.Driver.Types
77
77
(BindingMap , Binding (.. ), DebugOpts (.. ), ClashEnv (.. ))
@@ -85,7 +85,7 @@ import Clash.Normalize.Types
85
85
import Clash.Normalize.Util
86
86
import Clash.Rewrite.Combinators ((>->) ,(!->) ,repeatR ,topdownR )
87
87
import Clash.Rewrite.Types
88
- (RewriteEnv (.. ), RewriteState (.. ), bindings , debugOpts , extra ,
88
+ (RewriteEnv (.. ), RewriteState (.. ), bindings , debugOpts , extra , uniqSupply ,
89
89
tcCache , topEntities , newInlineStrategy , ioLock )
90
90
import Clash.Rewrite.Util
91
91
(apply , isUntranslatableType , runRewriteSession )
@@ -133,7 +133,7 @@ runNormalization env supply globals typeTrans peEval eval rcsMap lock entities s
133
133
rwState <- RewriteState
134
134
<$> MVar. newMVar mempty
135
135
<*> MVar. newMVar globals
136
- <*> MVar. newMVar supply
136
+ <*> pure supply
137
137
<*> MVar. newMVar HashMap. empty
138
138
<*> MVar. newMVar 0
139
139
<*> MVar. newMVar (mempty , 0 )
@@ -151,20 +151,28 @@ runNormalization env supply globals typeTrans peEval eval rcsMap lock entities s
151
151
, _topEntities = mkVarSet entities
152
152
}
153
153
154
+ supplies :: Int -> Supply -> [Supply ]
155
+ supplies 0 _ = []
156
+ supplies n s = let (s0', s1') = splitSupply s in s0' : supplies (n- 1 ) s1'
157
+
154
158
normalize :: [Id ] -> NormalizeSession BindingMap
155
159
normalize tops = do
156
160
q <- Monad. liftIO MS. newQ
157
161
traverse_ (Monad. liftIO . MS. pushL q) tops
158
162
binds <- MVar. newMVar (emptyVarSet, [] )
163
+ uniq0 <- Lens. use uniqSupply
164
+ let ss = supplies (length tops) uniq0
159
165
-- one thread per top-level binding
160
- Async. replicateConcurrently_ ( length tops) ( normalizeStep q binds)
166
+ Async. mapConcurrently_ ( normalizeStep q binds) ss
161
167
mkVarEnv . snd <$> MVar. readMVar binds
162
168
163
169
normalizeStep
164
170
:: MS. LinkedQueue Id
165
171
-> MVar (VarSet , [(Id , Binding Term )])
172
+ -> Supply
166
173
-> NormalizeSession ()
167
- normalizeStep q binds = do
174
+ normalizeStep q binds s = do
175
+ uniqSupply Lens. .= s
168
176
res <- Monad. liftIO $ MS. tryPopR q
169
177
case res of
170
178
Just id' -> do
@@ -177,7 +185,8 @@ normalizeStep q binds = do
177
185
MVar. modifyMVar_ binds (pure . second (pair: ))
178
186
else
179
187
MVar. putMVar binds (bound, pairs)
180
- normalizeStep q binds
188
+ nextS <- Lens. use uniqSupply
189
+ normalizeStep q binds nextS
181
190
Nothing -> pure ()
182
191
183
192
normalize' :: Id -> MS. LinkedQueue Id -> NormalizeSession (Id , Binding Term )
0 commit comments