Added support for SizedInts and cleaned up some function related to SizedWords
[matthijs/master-project/cλash.git] / CoreTools.hs
index 3f9b33c8849c6ebe3ab921b931cb35be165fa44b..9c75bcc7b61caa6289fbec13e6e03257435e08ad 100644 (file)
@@ -61,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
@@ -93,12 +113,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 +129,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?
@@ -165,6 +187,7 @@ 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
 
 -- 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