yosys/techlibs/common/smtmap.v

29 lines
654 B
Verilog

(* techmap_celltype = "$pmux" *)
module smt_pmux (A, B, S, Y);
parameter WIDTH = 1;
parameter S_WIDTH = 1;
(* force_downto *)
input [WIDTH-1:0] A;
(* force_downto *)
input [WIDTH*S_WIDTH-1:0] B;
(* force_downto *)
input [S_WIDTH-1:0] S;
(* force_downto *)
output [WIDTH-1:0] Y;
(* force_downto *)
wire [WIDTH-1:0] Y_B;
genvar i, j;
generate
(* force_downto *)
wire [WIDTH*(S_WIDTH+1)-1:0] C;
assign C[WIDTH-1:0] = A;
for (i = 0; i < S_WIDTH; i = i + 1)
assign C[WIDTH*(i+2)-1:WIDTH*(i+1)] = S[i] ? B[WIDTH*(i+1)-1:WIDTH*i] : C[WIDTH*(i+1)-1:WIDTH*i];
assign Y = C[WIDTH*(S_WIDTH+1)-1:WIDTH*S_WIDTH];
endgenerate
endmodule