Arbitrary logic functions

The $lut cell type implements a single-output LUT (lookup table). It implements an arbitrary logic function with its \LUT parameter to map input port \A to values of \Y output port values. In psuedocode: Y = \LUT[A]. \A has width set by parameter \WIDTH and \Y has a width of 1. Every logic function with a single bit output has a unique $lut representation.

The $sop cell type implements a sum-of-products expression, also known as disjunctive normal form (DNF). It implements an arbitrary logic function. Its structure mimics a programmable logic array (PLA). Output port \Y is the sum of products of the bits of the input port \A as defined by parameter \TABLE. \A is \WIDTH bits wide. The number of products in the sum is set by parameter \DEPTH, and each product has two bits for each input bit - for the presence of the unnegated and negated version of said input bit in the product. Therefore the \TABLE parameter holds 2 * \WIDTH * \DEPTH bits.

For example:

Let \WIDTH be 3. We would like to represent \Y =~\A[0] + \A[1]~\A[2]. There are 2 products to be summed, so \DEPTH shall be 2.

~A[2]-----+
 A[2]----+|
~A[1]---+||
 A[1]--+|||
~A[0]-+||||
 A[0]+|||||
     |||||| product formula
     010000 ~\A[0]
     001001 \A[1]~\A[2]

So the value of \TABLE will become 010000001001.

Any logic function with a single bit output can be represented with $sop but may have variously minimized or ordered summands represented in the \TABLE values.

yosys> help $lut
Properties:

is_evaluable

Simulation model (verilog)
Listing 209 simlib.v
1755module \$lut (A, Y);
1756
1757    parameter WIDTH = 0;
1758    parameter LUT = 0;
1759
1760    input [WIDTH-1:0] A;
1761    output Y;
1762
1763    \$bmux #(.WIDTH(1), .S_WIDTH(WIDTH)) mux(.A(LUT[(1<<WIDTH)-1:0]), .S(A), .Y(Y));
1764
1765endmodule
yosys> help $sop
Properties:

is_evaluable

Simulation model (verilog)
Listing 210 simlib.v
1771module \$sop (A, Y);
1772
1773    parameter WIDTH = 0;
1774    parameter DEPTH = 0;
1775    parameter TABLE = 0;
1776
1777    input [WIDTH-1:0] A;
1778    output reg Y;
1779
1780    integer i, j;
1781    reg match;
1782
1783    always @* begin
1784        Y = 0;
1785        for (i = 0; i < DEPTH; i=i+1) begin
1786            match = 1;
1787            for (j = 0; j < WIDTH; j=j+1) begin
1788                if (TABLE[2*WIDTH*i + 2*j + 0] && A[j]) match = 0;
1789                if (TABLE[2*WIDTH*i + 2*j + 1] && !A[j]) match = 0;
1790            end
1791            if (match) Y = 1;
1792        end
1793    end
1794
1795endmodule