From 33091be93e25da149859abb7635a1694b42d4b31 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Wed, 16 Jun 2010 12:37:20 +0200 Subject: [PATCH] Add datacons_for function to get the datacons for a TypedThing. --- clash/CLasH/Utils/Core/CoreTools.hs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/clash/CLasH/Utils/Core/CoreTools.hs b/clash/CLasH/Utils/Core/CoreTools.hs index c7bce65..7d5423c 100644 --- a/clash/CLasH/Utils/Core/CoreTools.hs +++ b/clash/CLasH/Utils/Core/CoreTools.hs @@ -152,16 +152,23 @@ tfvec_elem ty = el_ty -- | 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 = +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 -> case List.elemIndex dc dcs of - Nothing -> error $ "Datacon " ++ pprString dc ++ " does not occur in type: " ++ pprString ty - Just i -> i + Just dcs -> dcs -- Is the given core expression a lambda abstraction? is_lam :: CoreSyn.CoreExpr -> Bool -- 2.30.2