Types
-----

===============  ====
``void``         Nothing. E.g. if an instruction yields no result.
``metadata``     Additional information attached to various things in the assembly.
``label``        Basic block.
``time``         Simulation time.
``iN``           Integer of N bits.
``nN``           Enumerated type of N values.
``lN``           Logic type with 9 possible values ``UX01ZWLH-`` (see IEEE 1164)
``sN``           Strong logic type with 4 possible values ``01ZX`` (see IEEE 1800)
``T*``           Pointer to value of type T.
``T$``           Signal carrying a value of type T.
``[N x T]``      Array containing N elements of type T.
``{T0,T1,…}``    Struct containing fields of types T0, T1, etc.
``T (T0,T1,…)``  Function returning value T, taking arguments of type T0, T1, etc.
===============  ====


Names
-----

===========  ====
**Global Visibility**
-----------------
``@<name>``  Global name.  Visible in the symbol table of the module.
``!<name>``  Metadata name. Visible in the symbol table of the module.
**Local Visibility**
-----------------
``%<name>``  Local name. Not visible beyond the scope of the module or section it is declared in.
``!<int>``   Temporary local metadata name.
``%<int>``   Temporary local name.
===========  ====


Constants
---------

=====  ====
false  Alias for ``i1 0``
true   Alias for ``i1 1``
=====  ====


Instructions
------------

========  ====  ====
Mnemonic        Description
========  ====  ====
type      M     Global type alias
const     M     Global constant
func      M     Function definition
proc      M     Process definition
entity    M     Entity definition
decl      M     Function, process, or entity declaration
**Memory**
--------------------
load      FP    Load a value from memory.
store     FP    Store a value to memory.
var       FP    Allocate memory on the stack.
alloc     FP    Allocate memory on the heap.
free      FP    Free memory on the heap.
**Signals**
--------------------
probe     PE    Sample the value of a signal.
drive     PE    Change the value of a signal
sig       E     Allocate a new signal.
**Control Flow**
--------------------
wait      P
halt      FP
br        FP
ret       F
call      FPE
inst      E
**Comparison**
--------------------
icmp      FPE   Integer comparison
lcmp      FPE   Logic comparison
**Logic**
--------------------
and       FPE
or        FPE
xor       FPE
not       FPE
**Arithmetic**
--------------------
add       FPE
sub       FPE
mul       FPE
udiv      FPE
sdiv      FPE
**Restructuring**
--------------------
trunc     FPE   Reduce width of integer.
ext       FPE   Increase width of integer.
insert    FPE   Change the value of an array/structure element by index.
extract   FPE   Obtain the value of an array/structure element by index.
cat       FPE   Concatenate values.
slice     FPE   Obtain a part of an integer.
**Data Flow**
--------------------
mux       FPE   Select among a list of values, based on a "selection" value.
reg       E     Storage element that keeps state.
========  ====  ====


Missing
-------

* conversion lN to sN and back
* conversion iN to lN/sN and back
* working with time values
* choosing strong/weak drive on lN, choosing high impedance or weak
* a way to declare funcs, procs, and entities


Details
-------

* ``icmp [eq|ne|sgt|sge|slt|sle|ugt|uge|ult|ule]``
* ``lcmp [eq|ne]``
* ``ext [zero|sign]``
