getInstantiations ::
VHDLSession
- -> PortNameMap -- The arguments that need to be applied to the
- -- expression. Should always be the Args
- -- constructor.
+ -> [PortNameMap] -- The arguments that need to be applied to the
+ -- expression.
-> PortNameMap -- The output ports that the expression should generate.
-> [(CoreBndr, PortNameMap)] -- A list of bindings in effect
-> CoreSyn.CoreExpr -- The expression to generate an architecture for
-> [AST.ConcSm] -- The resulting VHDL code
-- A lambda expression binds the first argument (a) to the binder b.
-getInstantiations sess (Args (a:as)) outs binds (Lam b expr) =
- getInstantiations sess (Args as) outs ((b, a):binds) expr
+getInstantiations sess (a:as) outs binds (Lam b expr) =
+ getInstantiations sess as outs ((b, a):binds) expr
-- A case expression that checks a single variable and has a single
-- alternative, can be used to take tuples apart
hwfunc = Maybe.fromMaybe
(error $ "Function " ++ compname ++ "is unknown")
(lookup compname (funcs sess))
- HWFunction (Args inports) outport = hwfunc
+ HWFunction inports outport = hwfunc
ports =
zipWith (getPortMapEntry binds) inports fargs
++ mapOutputPorts outport outs
-- Use unsafe for now, to prevent pulling in ForSyDe error handling
(AST.NSimple (AST.unsafeVHDLBasicId name))
[]
- (getInstantiations sess (Args inports) outport [] expr)
+ (getInstantiations sess inports outport [] expr)
where
name = (getOccString var)
hwfunc = Maybe.fromMaybe
(error $ "Function " ++ name ++ "is unknown? This should not happen!")
(lookup name (funcs sess))
- HWFunction (Args inports) outport = hwfunc
+ HWFunction inports outport = hwfunc
data PortNameMap =
- Args [PortNameMap] -- Each of the submaps represent an argument to the
- -- function. Should only occur at top level.
- | Tuple [PortNameMap]
+ Tuple [PortNameMap]
| Port String
-- Generate a port name map (or multiple for tuple types) in the given direction for
(tycon, args) = Type.splitTyConApp ty
data HWFunction = HWFunction { -- A function that is available in hardware
- inPorts :: PortNameMap,
- outPorts :: PortNameMap
+ inPorts :: [PortNameMap],
+ outPort :: PortNameMap
--entity :: AST.EntityDec
}
-> (VHDLSession, String, HWFunction) -- The name of the function and its interface
mkHWFunction sess (NonRec var expr) =
- (sess, name, HWFunction (Args inports) outport)
+ (sess, name, HWFunction inports outport)
where
name = (getOccString var)
ty = CoreUtils.exprType expr
builtin_funcs =
[
- ("hwxor", HWFunction (Args [Port "a", Port "b"]) (Port "o")),
- ("hwand", HWFunction (Args [Port "a", Port "b"]) (Port "o"))
+ ("hwxor", HWFunction [Port "a", Port "b"] (Port "o")),
+ ("hwand", HWFunction [Port "a", Port "b"] (Port "o"))
]