44 lines
1.6 KiB
Markdown
44 lines
1.6 KiB
Markdown
|
+++
|
||
|
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$.
|