X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=clash%2FCLasH%2FUtils%2FCore%2FCoreTools.hs;h=7d5423ccc16b39ccf2c96e8cd2ee8e4fc0eab242;hb=82245ee4c9b5e653738fbeb168d245a6f3a5b91b;hp=e98aec6a090ab2abc77d15251ac25850054c3185;hpb=3858748d71e47b52ddc1b464df804ec21bebaeff;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/clash/CLasH/Utils/Core/CoreTools.hs b/clash/CLasH/Utils/Core/CoreTools.hs index e98aec6..7d5423c 100644 --- a/clash/CLasH/Utils/Core/CoreTools.hs +++ b/clash/CLasH/Utils/Core/CoreTools.hs @@ -7,6 +7,7 @@ module CLasH.Utils.Core.CoreTools where --Standard modules import qualified Maybe +import qualified List import qualified System.IO.Unsafe import qualified Data.Map as Map import qualified Data.Accessor.Monad.Trans.State as MonadState @@ -34,6 +35,7 @@ import qualified CoreFVs import qualified Literal import qualified MkCore import qualified VarEnv +import qualified Outputable -- Local imports import CLasH.Translator.TranslatorTypes @@ -147,6 +149,27 @@ tfvec_elem ty = el_ty Nothing -> error $ "\nCoreTools.tfvec_len: Not a vector type: " ++ (pprString ty) [len, el_ty] = args +-- | Gets the index of the given datacon in the given typed thing. +-- Errors out if it does not occur or if the type is not an ADT. +datacon_index :: TypedThing t => t -> DataCon.DataCon -> Int +datacon_index tt dc = case List.elemIndex dc dcs of + Nothing -> error $ "Datacon " ++ pprString dc ++ " does not occur in typed thing: " ++ pprString tt + Just i -> i + where + dcs = datacons_for tt + +-- | Gets all datacons for the given typed thing. Errors out if the +-- typed thing is not ADT typed. +datacons_for :: TypedThing t => t -> [DataCon.DataCon] +datacons_for tt = + case getType tt of + Nothing -> error $ "Getting datacon index of untyped thing? " ++ pprString tt + Just ty -> case Type.splitTyConApp_maybe ty of + Nothing -> error $ "Trying to find datacon in a type without a tycon?" ++ pprString ty + Just (tycon, _) -> case TyCon.tyConDataCons_maybe tycon of + Nothing -> error $ "Trying to find datacon in a type without datacons?" ++ pprString ty + Just dcs -> dcs + -- Is the given core expression a lambda abstraction? is_lam :: CoreSyn.CoreExpr -> Bool is_lam (CoreSyn.Lam _ _) = True @@ -347,7 +370,7 @@ mkNonRecLets bindings expr = MkCore.mkCoreLets binds expr -- | A class of things that (optionally) have a core Type. The type is -- optional, since Type expressions don't have a type themselves. -class TypedThing t where +class Outputable.Outputable t => TypedThing t where getType :: t -> Maybe Type.Type instance TypedThing CoreSyn.CoreExpr where @@ -448,7 +471,7 @@ mkSelCase scrut dc_i i = do Just (tycon, tyargs) -> case TyCon.tyConDataCons_maybe tycon of -- The scrutinee type should have a single dataconstructor, -- otherwise we can't construct a valid selector case. - Just dcs | i < 0 || i >= length dcs -> error $ "\nCoreTools.mkSelCase: Creating extractor case, but datacon index is invalid." ++ error_msg + Just dcs | dc_i < 0 || dc_i >= length dcs -> error $ "\nCoreTools.mkSelCase: Creating extractor case, but datacon index is invalid." ++ error_msg | otherwise -> do let datacon = (dcs!!dc_i) let field_tys = DataCon.dataConInstOrigArgTys datacon tyargs