+++ title = "`interface`" weight = 1 +++ Defines an interface for a hardware module (see section [5.13](fixme)). An interface is essentially a `struct`, but its components are restricted to those things that have a physical interpretation as wires in and out of a circuit. The types of fields in an interface are more likely to involve `Action`'s (see section [5.11](fixme)), which are typically interpreted as "enable signals" into a circuit. The fields of an interface are also known as *methods* (not to be confused with methods of a class, described in Sections [2.1](fixme) and [4.5](fixme)). ``` topDefn ::= interface typeId {tyVarId }= { { fieldDef ; }} ``` Example: ```hs interface Stack a = push :: a -> Action pop :: Action top :: Maybe a ``` This describes a circuit that implements a stack (a LIFO) of items. This polymorphic definition does not specify the type of the contents of the stack, just that they have some type "`a`". Corresponding to the `push` method, the circuit will have input wires to carry a value of type "`a`", and a "push-enable" input wire that specifies when the value present on the input wires should be pushed on the stack. Corresponding to the `pop` component, the circuit will have a "pop-enable" input wire that specifies when a value should be popped off the stack. Corresponding to the `top` component, the circuit will have a set of output wires: if the stack is empty, the wires will represent the value `Nothing`, and if the stack is non-empty and $v$ is the value at the top of the stack, the wires will represent `Maybe` $v$.