module CLasH.Utils.Core.BinderTools where
import qualified Data.Accessor.Monad.Trans.State as MonadState
import qualified CoreSyn
import qualified Type
import qualified UniqSupply
import qualified Unique
import qualified OccName
import qualified Name
import qualified Module
import qualified Var
import qualified SrcLoc
import qualified IdInfo
import qualified CoreUtils
import CLasH.Translator.TranslatorTypes
mkUnique :: TranslatorSession Unique.Unique
mkUnique = do
us <- MonadState.get tsUniqSupply
let (us', us'') = UniqSupply.splitUniqSupply us
MonadState.set tsUniqSupply us'
return $ UniqSupply.uniqFromSupply us''
mkInternalVar :: String -> Type.Type -> TranslatorSession Var.Var
mkInternalVar str ty = do
uniq <- mkUnique
let occname = OccName.mkVarOcc (str ++ show uniq)
let name = Name.mkInternalName uniq occname SrcLoc.noSrcSpan
return $ Var.mkLocalVar IdInfo.VanillaId name ty IdInfo.vanillaIdInfo
mkTypeVar :: String -> Type.Kind -> TranslatorSession Var.Var
mkTypeVar str kind = do
uniq <- mkUnique
let occname = OccName.mkVarOcc (str ++ show uniq)
let name = Name.mkInternalName uniq occname SrcLoc.noSrcSpan
return $ Var.mkTyVar name kind
mkBinderFor :: CoreSyn.CoreExpr -> String -> TranslatorSession Var.Var
mkBinderFor (CoreSyn.Type ty) string = mkTypeVar string (Type.typeKind ty)
mkBinderFor expr string = mkInternalVar string (CoreUtils.exprType expr)
mkReferenceTo :: Var.Var -> CoreSyn.CoreExpr
mkReferenceTo var | Var.isTyVar var = (CoreSyn.Type $ Type.mkTyVarTy var)
| otherwise = (CoreSyn.Var var)
cloneVar :: Var.Var -> TranslatorSession Var.Var
cloneVar v = do
uniq <- mkUnique
return $ Var.lazySetIdInfo (Var.setVarUnique v uniq) IdInfo.vanillaIdInfo
mkFunction :: CoreSyn.CoreBndr -> CoreSyn.CoreExpr -> TranslatorSession CoreSyn.CoreBndr
mkFunction bndr body = do
let ty = CoreUtils.exprType body
id <- cloneVar bndr
let newid = Var.setVarType id ty
addGlobalBind newid body
return newid
getFullString :: Name.NamedThing a => a -> String
getFullString thing = modstr ++ occstr
where
name = Name.getName thing
modstr = case Name.nameModule_maybe name of
Nothing -> ""
Just mod -> Module.moduleNameString (Module.moduleName mod) ++ "."
occstr = Name.getOccString name