X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=CoreTools.hs;h=443586b946f6b3ce904d090ed3d1a66aaae75d5f;hb=7eb34cb0e082185b256b7231ee84cb04e006f51c;hp=3f9b33c8849c6ebe3ab921b931cb35be165fa44b;hpb=5ce8aec0615804d8e7da0bf05f64a8669c46dfd2;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/CoreTools.hs b/CoreTools.hs index 3f9b33c..443586b 100644 --- a/CoreTools.hs +++ b/CoreTools.hs @@ -27,6 +27,7 @@ import qualified VarSet import qualified Unique import qualified CoreUtils import qualified CoreFVs +import qualified Literal -- Local imports import GhcTools @@ -61,18 +62,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 @@ -93,12 +114,14 @@ ranged_word_bound ty = -- | Get the length of a FSVec type tfvec_len :: Type.Type -> Int -tfvec_len ty = - eval_tfp_int len +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 $ "CoreTools.tfvec_len Not a vector type: " ++ (pprString ty) + Nothing -> error $ "\nCoreTools.tfvec_len_ty: Not a vector type: " ++ (pprString ty) [len, el_ty] = args -- | Get the element type of a TFVec type @@ -107,7 +130,7 @@ tfvec_elem ty = el_ty where args = case Type.splitTyConApp_maybe ty of Just (tycon, args) -> args - Nothing -> error $ "CoreTools.tfvec_len Not a vector type: " ++ (pprString ty) + Nothing -> error $ "\nCoreTools.tfvec_len: Not a vector type: " ++ (pprString ty) [len, el_ty] = args -- Is this a wild binder? @@ -141,6 +164,10 @@ is_var :: CoreSyn.CoreExpr -> Bool is_var (CoreSyn.Var _) = True is_var _ = False +is_lit :: CoreSyn.CoreExpr -> Bool +is_lit (CoreSyn.Lit _) = True +is_lit _ = False + -- Can the given core expression be applied to something? This is true for -- applying to a value as well as a type. is_applicable :: CoreSyn.CoreExpr -> Bool @@ -165,6 +192,12 @@ has_free_vars = not . VarSet.isEmptyVarSet . CoreFVs.exprFreeVars -- 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 + +-- Turns a Lit CoreExpr into the Literal inside it. +exprToLit :: CoreSyn.CoreExpr -> Literal.Literal +exprToLit (CoreSyn.Lit lit) = lit +exprToLit expr = error $ "\nCoreTools.exprToLit: Not a lit: " ++ 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 @@ -177,3 +210,9 @@ get_val_args ty args = drop n args -- (length predtypes) arguments should be dictionaries. We drop this many -- arguments, to get at the value arguments. n = length tyvars + length predtypes + +getLiterals :: CoreSyn.CoreExpr -> [CoreSyn.CoreExpr] +getLiterals app@(CoreSyn.App _ _) = literals + where + (CoreSyn.Var f, args) = CoreSyn.collectArgs app + literals = filter (is_lit) args \ No newline at end of file