mirror of https://github.com/YosysHQ/yosys.git
49 lines
1.2 KiB
Verilog
49 lines
1.2 KiB
Verilog
|
module \$reduce_or (A, Y);
|
||
|
|
||
|
parameter A_SIGNED = 0;
|
||
|
parameter A_WIDTH = 0;
|
||
|
parameter Y_WIDTH = 0;
|
||
|
|
||
|
input [A_WIDTH-1:0] A;
|
||
|
output [Y_WIDTH-1:0] Y;
|
||
|
|
||
|
function integer min;
|
||
|
input integer a, b;
|
||
|
begin
|
||
|
if (a < b)
|
||
|
min = a;
|
||
|
else
|
||
|
min = b;
|
||
|
end
|
||
|
endfunction
|
||
|
|
||
|
genvar i;
|
||
|
generate begin
|
||
|
if (A_WIDTH == 0) begin
|
||
|
assign Y = 0;
|
||
|
end
|
||
|
if (A_WIDTH == 1) begin
|
||
|
assign Y = A;
|
||
|
end
|
||
|
if (A_WIDTH == 2) begin
|
||
|
wire ybuf;
|
||
|
OR3X1 g (.A(A[0]), .B(A[1]), .C(1'b0), .Y(ybuf));
|
||
|
assign Y = ybuf;
|
||
|
end
|
||
|
if (A_WIDTH == 3) begin
|
||
|
wire ybuf;
|
||
|
OR3X1 g (.A(A[0]), .B(A[1]), .C(A[2]), .Y(ybuf));
|
||
|
assign Y = ybuf;
|
||
|
end
|
||
|
if (A_WIDTH > 3) begin
|
||
|
localparam next_stage_sz = (A_WIDTH+2) / 3;
|
||
|
wire [next_stage_sz-1:0] next_stage;
|
||
|
for (i = 0; i < next_stage_sz; i = i+1) begin
|
||
|
localparam bits = min(A_WIDTH - 3*i, 3);
|
||
|
assign next_stage[i] = |A[3*i +: bits];
|
||
|
end
|
||
|
assign Y = |next_stage;
|
||
|
end
|
||
|
end endgenerate
|
||
|
endmodule
|