Skip to content

Commit ba2d00c

Browse files
committed
split supply instead of sharing via mvars
1 parent 3477044 commit ba2d00c

File tree

6 files changed

+139
-160
lines changed

6 files changed

+139
-160
lines changed

clash-lib/src/Clash/Normalize.hs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ module Clash.Normalize where
2020
import qualified Control.Concurrent.Async.Lifted as Async
2121
import Control.Concurrent.MVar.Lifted (MVar)
2222
import qualified Control.Concurrent.MVar.Lifted as MVar
23-
import Control.Concurrent.Supply (Supply)
23+
import Control.Concurrent.Supply (Supply, splitSupply)
2424
import Control.Exception (throw)
2525
import qualified Control.Lens as Lens
26-
import Control.Monad (when, unless)
26+
import Control.Monad (when)
2727
import qualified Control.Monad.IO.Class as Monad (liftIO)
2828
import Control.Monad.State.Strict (State)
29-
import Data.Bifunctor (first, second)
29+
import Data.Bifunctor (second)
3030
import Data.Default (def)
3131
import Data.Either (lefts,partitionEithers)
3232
import Data.Foldable (traverse_)
@@ -71,7 +71,7 @@ import Clash.Core.Var (Id, varName, varType)
7171
import 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)
7575
import Clash.Debug (traceIf)
7676
import Clash.Driver.Types
7777
(BindingMap, Binding(..), DebugOpts(..), ClashEnv(..))
@@ -85,7 +85,7 @@ import Clash.Normalize.Types
8585
import Clash.Normalize.Util
8686
import Clash.Rewrite.Combinators ((>->),(!->),repeatR,topdownR)
8787
import Clash.Rewrite.Types
88-
(RewriteEnv (..), RewriteState (..), bindings, debugOpts, extra,
88+
(RewriteEnv (..), RewriteState (..), bindings, debugOpts, extra, uniqSupply,
8989
tcCache, topEntities, newInlineStrategy, ioLock)
9090
import 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+
154158
normalize :: [Id] -> NormalizeSession BindingMap
155159
normalize 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

163169
normalizeStep
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

183192
normalize' :: Id -> MS.LinkedQueue Id -> NormalizeSession (Id, Binding Term)

0 commit comments

Comments
 (0)