mirror of
https://github.com/YosysHQ/yosys
synced 2026-05-25 03:16:22 +00:00
simplemap: Moves $pmux mapping from techmap.v to simple map
This Fixes the slow downs I observed in techmap.v, which we attempted to fix via the simplify ast.h route originally. This turned out to be rather complex though. By moving $pmux to simplemap we can just avoid that code. My test case now runs in 310s which is 40s faster than the baseline change. B:507898959 Signed-off-by: Ethan Mahintorabi <ethanmoon@google.com>
This commit is contained in:
parent
92287d4857
commit
805c302411
2 changed files with 45 additions and 44 deletions
|
|
@ -59,7 +59,7 @@ module _90_simplemap_compare_ops;
|
|||
endmodule
|
||||
|
||||
(* techmap_simplemap *)
|
||||
(* techmap_celltype = "$buf $pos $slice $concat $mux $tribuf $bmux $bwmux $bweqx" *)
|
||||
(* techmap_celltype = "$buf $pos $slice $concat $mux $pmux $tribuf $bmux $bwmux $bweqx" *)
|
||||
module _90_simplemap_various;
|
||||
endmodule
|
||||
|
||||
|
|
@ -563,48 +563,6 @@ module _90_pow (A, B, Y);
|
|||
wire _TECHMAP_FAIL_ = 1;
|
||||
endmodule
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Parallel Multiplexers
|
||||
// --------------------------------------------------------
|
||||
|
||||
(* techmap_celltype = "$pmux" *)
|
||||
module _90_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:0] B_AND_S;
|
||||
for (i = 0; i < S_WIDTH; i = i + 1) begin:B_AND
|
||||
assign B_AND_S[WIDTH*(i+1)-1:WIDTH*i] = B[WIDTH*(i+1)-1:WIDTH*i] & {WIDTH{S[i]}};
|
||||
end:B_AND
|
||||
for (i = 0; i < WIDTH; i = i + 1) begin:B_OR
|
||||
(* force_downto *)
|
||||
wire [S_WIDTH-1:0] B_AND_BITS;
|
||||
for (j = 0; j < S_WIDTH; j = j + 1) begin:B_AND_BITS_COLLECT
|
||||
assign B_AND_BITS[j] = B_AND_S[WIDTH*j+i];
|
||||
end:B_AND_BITS_COLLECT
|
||||
assign Y_B[i] = |B_AND_BITS;
|
||||
end:B_OR
|
||||
endgenerate
|
||||
|
||||
assign Y = |S ? Y_B : A;
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Demultiplexers
|
||||
// --------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue