Generate input port names from the argument types.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Wed, 21 Jan 2009 10:48:58 +0000 (11:48 +0100)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Wed, 21 Jan 2009 10:48:58 +0000 (11:48 +0100)
This replaces the hardcoded list of input port names which was used for
testing before.

Translator.hs

index 64cdb5199a9aa5b5e69b9008b12d6b63a704105d..56cbe5e698c764451f3f15bb19658f58e872cca2 100644 (file)
@@ -166,14 +166,38 @@ getInstantiations args binds expr = showSDoc $ ppr $ expr
 getArchitecture (NonRec var expr) =
        "architecture structural of " ++ name ++ " is\n"
        ++ "begin\n"
-       ++ getInstantiations (Args [Tuple [Port "portin0", Port "portin1"]]) [] expr
+       ++ getInstantiations (Args inportnames) [] expr
        ++ "end structural\n"
        where
                name = (getOccString var)
                ty = CoreUtils.exprType expr
+               (fargs, res) = Type.splitFunTys ty
+               --state = if length fargs == 1 then () else (last fargs)
+               ports = if length fargs == 1 then fargs else (init fargs)
+               inportnames = case ports of
+                       [port] -> [getPortNameMapForTy "portin" port]
+                       ps     -> getPortNameMapForTys "portin" 0 ps
 
 data PortNameMap =
        Args [PortNameMap] -- Each of the submaps represent an argument to the
                           -- function. Should only occur at top level.
        | Tuple [PortNameMap]
        | Port  String
+
+-- Generate a port name map (or multiple for tuple types) in the given direction for
+-- each type given.
+getPortNameMapForTys :: String -> Int -> [Type] -> [PortNameMap]
+getPortNameMapForTys prefix num [] = [] 
+getPortNameMapForTys prefix num (t:ts) =
+       (getPortNameMapForTy (prefix ++ show num) t) : getPortNameMapForTys prefix (num + 1) ts
+
+getPortNameMapForTy    :: String -> Type -> PortNameMap
+getPortNameMapForTy name ty =
+       if (TyCon.isTupleTyCon tycon) then
+               -- Expand tuples we find
+               Tuple (getPortNameMapForTys name 0 args)
+       else -- Assume it's a type constructor application, ie simple data type
+               -- TODO: Add type?
+               Port name
+       where
+               (tycon, args) = Type.splitTyConApp ty