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