Use tcSplitSigmaTy for getting at value arguments.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 26 Jun 2009 10:36:39 +0000 (12:36 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 26 Jun 2009 10:36:39 +0000 (12:36 +0200)
Previously, some handcoded filters with isValArg and isDictId were used,
which were not so robust.

CoreTools.hs
VHDL.hs

index ed0c52d88a7e81ee6428debe2a48fc5c81a48388..3f9b33c8849c6ebe3ab921b931cb35be165fa44b 100644 (file)
@@ -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
@@ -164,3 +165,15 @@ has_free_vars = not . VarSet.isEmptyVarSet . CoreFVs.exprFreeVars
 -- simple Var CoreExprs, not complexer ones.
 exprToVar :: CoreSyn.CoreExpr -> Var.Id
 exprToVar (CoreSyn.Var id) = id
+
+-- 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
diff --git a/VHDL.hs b/VHDL.hs
index b6264dcf603266807297718c8e318a8e47dee878..8bc67a39dba4cdc9592e35fd17724c27e2871246 100644 (file)
--- a/VHDL.hs
+++ b/VHDL.hs
@@ -262,8 +262,7 @@ mkConcSm (bndr, Var v) = return $ [mkUncondAssign (Left bndr) (varToVHDLExpr v)]
 
 mkConcSm (bndr, app@(CoreSyn.App _ _))= do
   let (CoreSyn.Var f, args) = CoreSyn.collectArgs app
-  let valargs' = filter isValArg args
-  let valargs = filter (\(CoreSyn.Var bndr) -> not (Id.isDictId bndr)) valargs'
+  let valargs = get_val_args (Var.varType f) args
   genApplication (Left bndr) f (map Left valargs)
 
 -- A single alt case must be a selector. This means thee scrutinee is a simple