@@ -91,7 +91,7 @@ import TyCon (AlgTyConRhs (..), TyCon, tyConName,
9191 tyConArity ,
9292 tyConDataCons , tyConKind ,
9393 tyConName , tyConUnique , isClassTyCon )
94- import Type (mkTvSubstPrs , substTy , coreView )
94+ import Type (mkTvSubstPrs , substTy , coreView , piResultTys )
9595import TyCoRep (Coercion (.. ), TyLit (.. ), Type (.. ))
9696import Unique (Uniquable (.. ), Unique , getKey , hasKey )
9797import Var (Id , TyVar , Var , idDetails ,
@@ -288,71 +288,101 @@ coreToTerm primMap unlocs = term
288288 , let (nm, _) = RWS. evalRWS (qualifiedNameString (varName x))
289289 noSrcSpan
290290 emptyGHC2CoreState
291- = go nm args
291+ = go nm (varType x) args
292292 | otherwise
293293 = term' e
294294 where
295295 -- Remove most Signal transformers
296- go " Clash.Signal.Internal.mapSignal#" args
297- | length args == 5
298- = term (App (args!! 3 ) (args!! 4 ))
299- go " Clash.Signal.Internal.signal#" args
300- | length args == 3
301- = term (args!! 2 )
302- go " Clash.Signal.Internal.appSignal#" args
303- | length args == 5
304- = term (App (args!! 3 ) (args!! 4 ))
305- go " Clash.Signal.Internal.joinSignal#" args
296+ go " Clash.Signal.Internal.mapSignal#" pTy args
297+ | [Type aTy, Type bTy, Type domTy, fTm, aSigTm] <- args
298+ = do
299+ let aSigTy = piResultTys pTy [bTy,aTy,domTy,aTy,aTy]
300+ bSigTy = piResultTys pTy [aTy,bTy,domTy,bTy,bTy]
301+ aTyC <- coreToType aTy
302+ bTyC <- coreToType bTy
303+ aSigTyC <- coreToType aSigTy
304+ bSigTyC <- coreToType bSigTy
305+ C. Cast <$> (C. App <$> term fTm
306+ <*> (C. Cast <$> term aSigTm
307+ <*> pure aSigTyC
308+ <*> pure aTyC))
309+ <*> pure bTyC
310+ <*> pure bSigTyC
311+ go " Clash.Signal.Internal.signal#" pty args
312+ | [Type aTy, Type domTy, aTm] <- args
313+ = let aSigTy = piResultTys pty [aTy,domTy,aTy]
314+ in C. Cast <$> term aTm <*> coreToType aTy <*> coreToType aSigTy
315+ go " Clash.Signal.Internal.appSignal#" pTy args
316+ | [Type domTy, Type aTy, Type bTy, fSigTm, aSigTm] <- args
317+ = do
318+ let aSigTy = piResultTys pTy [domTy,bTy,aTy,aTy,aTy]
319+ bSigTy = piResultTys pTy [domTy,aTy,bTy,bTy,bTy]
320+ fSigTy = piResultTys pTy [domTy,aTy,FunTy aTy bTy,aTy,aTy]
321+ aTyC <- coreToType aTy
322+ bTyC <- coreToType bTy
323+ aSigTyC <- coreToType aSigTy
324+ bSigTyC <- coreToType bSigTy
325+ fSigTyC <- coreToType fSigTy
326+ let fTyC = C. mkFunTy aTyC bTyC
327+ C. Cast <$> (C. App <$> (C. Cast <$> term fSigTm
328+ <*> pure fSigTyC
329+ <*> pure fTyC)
330+ <*> (C. Cast <$> term aSigTm
331+ <*> pure aSigTyC
332+ <*> pure aTyC))
333+ <*> pure bTyC
334+ <*> pure bSigTyC
335+ go " Clash.Signal.Internal.joinSignal#" _ args
306336 | length args == 3
307337 = term (args!! 2 )
308- go " Clash.Signal.Bundle.vecBundle#" args
338+ go " Clash.Signal.Bundle.vecBundle#" _ args
309339 | length args == 4
310340 = term (args!! 3 )
311341 --- Remove `$`
312- go " GHC.Base.$" args
342+ go " GHC.Base.$" _ args
313343 | length args == 5
314344 = term (App (args!! 3 ) (args!! 4 ))
315- go " GHC.Magic.noinline" args -- noinline :: forall a. a -> a
345+ go " GHC.Magic.noinline" _ args -- noinline :: forall a. a -> a
316346 | [_ty, x] <- args
317347 = term x
318348 -- Remove most CallStack logic
319- go " GHC.Stack.Types.PushCallStack" args = term (last args)
320- go " GHC.Stack.Types.FreezeCallStack" args = term (last args)
321- go " GHC.Stack.withFrozenCallStack" args
349+ go " GHC.Stack.Types.PushCallStack" _ args = term (last args)
350+ go " GHC.Stack.Types.FreezeCallStack" _ args = term (last args)
351+ go " GHC.Stack.withFrozenCallStack" _ args
322352 | length args == 3
323353 = term (App (args!! 2 ) (args!! 1 ))
324- go " Clash.Class.BitPack.packXWith" args
354+ go " Clash.Class.BitPack.packXWith" _ args
325355 | [_nTy,_aTy,_kn,f] <- args
326356 = term f
327- go " Clash.Sized.BitVector.Internal.checkUnpackUndef" args
357+ go " Clash.Sized.BitVector.Internal.checkUnpackUndef" _ args
328358 | [_nTy,_aTy,_kn,_typ,f] <- args
329359 = term f
330- go " Clash.Magic.prefixName" args
360+ go " Clash.Magic.prefixName" _ args
331361 | [Type nmTy,_aTy,f] <- args
332362 = C. Tick <$> (C. NameMod C. PrefixName <$> coreToType nmTy) <*> term f
333- go " Clash.Magic.suffixName" args
363+ go " Clash.Magic.suffixName" _ args
334364 | [Type nmTy,_aTy,f] <- args
335365 = C. Tick <$> (C. NameMod C. SuffixName <$> coreToType nmTy) <*> term f
336- go " Clash.Magic.suffixNameFromNat" args
366+ go " Clash.Magic.suffixNameFromNat" _ args
337367 | [Type nmTy,_aTy,f] <- args
338368 = C. Tick <$> (C. NameMod C. SuffixName <$> coreToType nmTy) <*> term f
339- go " Clash.Magic.suffixNameP" args
369+ go " Clash.Magic.suffixNameP" _ args
340370 | [Type nmTy,_aTy,f] <- args
341371 = C. Tick <$> (C. NameMod C. SuffixNameP <$> coreToType nmTy) <*> term f
342- go " Clash.Magic.suffixNameFromNatP" args
372+ go " Clash.Magic.suffixNameFromNatP" _ args
343373 | [Type nmTy,_aTy,f] <- args
344374 = C. Tick <$> (C. NameMod C. SuffixNameP <$> coreToType nmTy) <*> term f
345- go " Clash.Magic.setName" args
375+ go " Clash.Magic.setName" _ args
346376 | [Type nmTy,_aTy,f] <- args
347377 = C. Tick <$> (C. NameMod C. SetName <$> coreToType nmTy) <*> term f
348- go " Clash.Magic.deDup" args
378+ go " Clash.Magic.deDup" _ args
349379 | [_aTy,f] <- args
350380 = C. Tick C. DeDup <$> term f
351- go " Clash.Magic.noDeDup" args
381+ go " Clash.Magic.noDeDup" _ args
352382 | [_aTy,f] <- args
353383 = C. Tick C. NoDeDup <$> term f
354384
355- go _ _ = term' e
385+ go _ _ _ = term' e
356386 term' (Var x) = var x
357387 term' (Lit l) = return $ C. Literal (coreToLiteral l)
358388 term' (App eFun (Type tyArg)) = C. TyApp <$> term eFun <*> coreToType tyArg
@@ -405,7 +435,7 @@ coreToTerm primMap unlocs = term
405435 case hasPrimCoM of
406436 Just _ | ty1_I || ty2_I
407437 -> C. Cast <$> term e <*> coreToType ty1 <*> coreToType ty2
408- _ -> term e
438+ _ -> C. Cast <$> term e <*> coreToType ty1 <*> coreToType ty2
409439 term' (Tick (SourceNote rsp _) e) =
410440 C. Tick (C. SrcSpan (RealSrcSpan rsp)) <$> addUsefull (RealSrcSpan rsp) (term e)
411441 term' (Tick _ e) = term e
0 commit comments