
FUNCTOR DETAILS

The README.txt describes the .functor statement and how that creates a
functor. It also makes passing mention of how the functor is connected
up to the netlist. This document describes in detail how a functor is
supposed to act. See also the functor.h header file and the functor.cc
source file.

The current values of the inputs are stored in a single 8-bit byte,
2-bits per value. This is the ``ival'' member. The input of a functor
gets set by propagation events, assign events, or %set instructions.

The output value is stored in two bits of the functor. The current
output is used to detect edges when the input changes. Whenever an
input is set, a new output is calculated and compared with the current
output. If the current output is the same as the new output, then the
operation is complete and propagation stops.

If after a set the output changes, the current output is changed to
the new output, and a propagation event is created. This propagation
event is given a pointer to the functor that changed, and *not* simply
the contents of the out port. The event is scheduled for a delay that
is the propagation delay for the functor.

A propagation event is the only way that the output of a functor is
moved to the input of another functor. The propagation event, which is
given a pointer to the functor to propagate, looks at the output list
and sets the listed inputs to the current value of the output.


BUILT-IN FUNCTOR TABLES

* AND

* BUF

* MUXZ

This is a single-bit A/B mux with an active sigh enable. The 4 inputs
are A, B, select and enable:

	Se En
	0  0    z
	0  1    A
	1  0	z
	1  1	B
	xz 0	z
	xz 1	x

This is used to implement structural ?: operators. The enable is
normally initialized to 1 and left unconnected. The device is called
MUXZ because the x and z values of the A and B inputs are passed
through.

* EEQ

Compare two pairs of inputs.  output = (i1 === i2) && (i3 === i4);

* NAND

* NOR

* NOT

* OR

* XNOR

* XOR

