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:
- Simulation model (verilog)¶
1641module \$lut (A, Y); 1642 1643 parameter WIDTH = 0; 1644 parameter LUT = 0; 1645 1646 input [WIDTH-1:0] A; 1647 output Y; 1648 1649 \$bmux #(.WIDTH(1), .S_WIDTH(WIDTH)) mux(.A(LUT[(1<<WIDTH)-1:0]), .S(A), .Y(Y)); 1650 1651endmodule
- yosys> help $sop¶
- Properties:
- Simulation model (verilog)¶
1657module \$sop (A, Y); 1658 1659 parameter WIDTH = 0; 1660 parameter DEPTH = 0; 1661 parameter TABLE = 0; 1662 1663 input [WIDTH-1:0] A; 1664 output reg Y; 1665 1666 integer i, j; 1667 reg match; 1668 1669 always @* begin 1670 Y = 0; 1671 for (i = 0; i < DEPTH; i=i+1) begin 1672 match = 1; 1673 for (j = 0; j < WIDTH; j=j+1) begin 1674 if (TABLE[2*WIDTH*i + 2*j + 0] && A[j]) match = 0; 1675 if (TABLE[2*WIDTH*i + 2*j + 1] && !A[j]) match = 0; 1676 end 1677 if (match) Y = 1; 1678 end 1679 end 1680 1681endmodule