X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=CoreTools.hs;h=9c75bcc7b61caa6289fbec13e6e03257435e08ad;hb=78b45072fc36c7311bee97f2d9195bbc33b994cf;hp=85c398ab7c2777bb920c749033f28caa2594d6c4;hpb=ef589dec9b04aa3d0a30a2b0787c50d07c320563;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/CoreTools.hs b/CoreTools.hs index 85c398a..9c75bcc 100644 --- a/CoreTools.hs +++ b/CoreTools.hs @@ -10,6 +10,7 @@ import qualified Maybe -- GHC API import qualified GHC import qualified Type +import qualified TcType import qualified HsExpr import qualified HsTypes import qualified HsBinds @@ -27,8 +28,10 @@ import qualified Unique import qualified CoreUtils import qualified CoreFVs +-- Local imports import GhcTools import HsTools +import Pretty -- | Evaluate a core Type representing type level int from the tfp -- library to a real int. @@ -58,18 +61,38 @@ eval_tfp_int ty = -- | Get the width of a SizedWord type sized_word_len :: Type.Type -> Int -sized_word_len ty = - eval_tfp_int len - where - (tycon, args) = Type.splitTyConApp ty - [len] = args +sized_word_len ty = eval_tfp_int (sized_word_len_ty ty) + +sized_word_len_ty :: Type.Type -> Type.Type +sized_word_len_ty ty = len + where + args = case Type.splitTyConApp_maybe ty of + Just (tycon, args) -> args + Nothing -> error $ "\nCoreTools.sized_word_len_ty: Not a sized word type: " ++ (pprString ty) + [len] = args + +-- | Get the width of a SizedInt type +sized_int_len :: Type.Type -> Int +sized_int_len ty = eval_tfp_int (sized_int_len_ty ty) + +sized_int_len_ty :: Type.Type -> Type.Type +sized_int_len_ty ty = len + where + args = case Type.splitTyConApp_maybe ty of + Just (tycon, args) -> args + Nothing -> error $ "\nCoreTools.sized_int_len_ty: Not a sized int type: " ++ (pprString ty) + [len] = args -- | Get the upperbound of a RangedWord type ranged_word_bound :: Type.Type -> Int -ranged_word_bound ty = - eval_tfp_int len +ranged_word_bound ty = eval_tfp_int (ranged_word_bound_ty ty) + +ranged_word_bound_ty :: Type.Type -> Type.Type +ranged_word_bound_ty ty = len where - (tycon, args) = Type.splitTyConApp ty + args = case Type.splitTyConApp_maybe ty of + Just (tycon, args) -> args + Nothing -> error $ "\nCoreTools.ranged_word_bound_ty: Not a sized word type: " ++ (pprString ty) [len] = args -- | Evaluate a core Type representing type level int from the TypeLevel @@ -90,10 +113,23 @@ ranged_word_bound ty = -- | Get the length of a FSVec type tfvec_len :: Type.Type -> Int -tfvec_len ty = - eval_tfp_int len - where - (tycon, args) = Type.splitTyConApp ty +tfvec_len ty = eval_tfp_int (tfvec_len_ty ty) + +tfvec_len_ty :: Type.Type -> Type.Type +tfvec_len_ty ty = len + where + args = case Type.splitTyConApp_maybe ty of + Just (tycon, args) -> args + Nothing -> error $ "\nCoreTools.tfvec_len_ty: Not a vector type: " ++ (pprString ty) + [len, el_ty] = args + +-- | Get the element type of a TFVec type +tfvec_elem :: Type.Type -> Type.Type +tfvec_elem ty = el_ty + where + args = case Type.splitTyConApp_maybe ty of + Just (tycon, args) -> args + Nothing -> error $ "\nCoreTools.tfvec_len: Not a vector type: " ++ (pprString ty) [len, el_ty] = args -- Is this a wild binder? @@ -132,6 +168,35 @@ is_var _ = False is_applicable :: CoreSyn.CoreExpr -> Bool is_applicable expr = is_fun expr || is_poly expr +-- Is the given core expression a variable or an application? +is_simple :: CoreSyn.CoreExpr -> Bool +is_simple (CoreSyn.App _ _) = True +is_simple (CoreSyn.Var _) = True +is_simple (CoreSyn.Cast expr _) = is_simple expr +is_simple _ = False + -- Does the given CoreExpr have any free type vars? has_free_tyvars :: CoreSyn.CoreExpr -> Bool has_free_tyvars = not . VarSet.isEmptyVarSet . (CoreFVs.exprSomeFreeVars Var.isTyVar) + +-- Does the given CoreExpr have any free local vars? +has_free_vars :: CoreSyn.CoreExpr -> Bool +has_free_vars = not . VarSet.isEmptyVarSet . CoreFVs.exprFreeVars + +-- Turns a Var CoreExpr into the Id inside it. Will of course only work for +-- simple Var CoreExprs, not complexer ones. +exprToVar :: CoreSyn.CoreExpr -> Var.Id +exprToVar (CoreSyn.Var id) = id +exprToVar expr = error $ "\nCoreTools.exprToVar: Not a var: " ++ show expr + +-- Removes all the type and dictionary arguments from the given argument list, +-- leaving only the normal value arguments. The type given is the type of the +-- expression applied to this argument list. +get_val_args :: Type.Type -> [CoreSyn.CoreExpr] -> [CoreSyn.CoreExpr] +get_val_args ty args = drop n args + where + (tyvars, predtypes, _) = TcType.tcSplitSigmaTy ty + -- The first (length tyvars) arguments should be types, the next + -- (length predtypes) arguments should be dictionaries. We drop this many + -- arguments, to get at the value arguments. + n = length tyvars + length predtypes