mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Juggle opt calls in synth_xilinx
This commit is contained in:
		
							parent
							
								
									227cc54c16
								
							
						
					
					
						commit
						87b8d29a90
					
				
					 2 changed files with 44 additions and 39 deletions
				
			
		|  | @ -31,7 +31,6 @@ module \$shiftx (A, B, Y); | ||||||
|   parameter [B_WIDTH-1:0] _TECHMAP_CONSTMSK_B_ = 0; |   parameter [B_WIDTH-1:0] _TECHMAP_CONSTMSK_B_ = 0; | ||||||
|   parameter [B_WIDTH-1:0] _TECHMAP_CONSTVAL_B_ = 0; |   parameter [B_WIDTH-1:0] _TECHMAP_CONSTVAL_B_ = 0; | ||||||
| 
 | 
 | ||||||
|   localparam NUM = A_WIDTH/Y_WIDTH; |  | ||||||
|   generate |   generate | ||||||
|     genvar i, j; |     genvar i, j; | ||||||
|     if (B_SIGNED) begin |     if (B_SIGNED) begin | ||||||
|  | @ -41,51 +40,57 @@ module \$shiftx (A, B, Y); | ||||||
|       else |       else | ||||||
|         wire _TECHMAP_FAIL_ = 1; |         wire _TECHMAP_FAIL_ = 1; | ||||||
|     end |     end | ||||||
|     else if (NUM <= 4) begin |     else if (Y_WIDTH > 1) begin | ||||||
|       wire _TECHMAP_FAIL_ = 1; |  | ||||||
|     end |  | ||||||
|     else if (NUM <= 8) begin |  | ||||||
|       localparam a_width0 = Y_WIDTH * 4; |  | ||||||
|       localparam a_widthN = A_WIDTH - a_width0; |  | ||||||
|       wire [Y_WIDTH-1:0] T0, T1; |  | ||||||
|       \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_width0), .B_WIDTH(B_WIDTH-1),        .Y_WIDTH(Y_WIDTH)) fpga_shiftx      (.A(A[a_width0-1:0]),       .B(B[B_WIDTH-2:0]), .Y(T0)); |  | ||||||
|       \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_widthN), .B_WIDTH($clog2(a_widthN)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx_last (.A(A[A_WIDTH-1:a_width0]), .B(B[$clog2(a_widthN)-1:0]), .Y(T1)); |  | ||||||
|       for (i = 0; i < Y_WIDTH; i++) |  | ||||||
|         MUXF7 fpga_mux (.I0(T0[i]), .I1(T1[i]), .S(B[B_WIDTH-1]), .O(Y[i])); |  | ||||||
|     end |  | ||||||
|     else if (NUM <= 16) begin |  | ||||||
|       localparam a_width0 = Y_WIDTH * 4; |  | ||||||
|       localparam num_mux8 = A_WIDTH / a_width0; |  | ||||||
|       localparam a_widthN = A_WIDTH - num_mux8*a_width0; |  | ||||||
|       wire [Y_WIDTH*4-1:0] T; |  | ||||||
|       wire [Y_WIDTH-1:0] T0, T1; |  | ||||||
|       for (i = 0; i < 4; i++) |  | ||||||
|         if (i < num_mux8) |  | ||||||
|           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_width0), .B_WIDTH(B_WIDTH-2), .Y_WIDTH(Y_WIDTH)) fpga_shiftx      (.A(A[(i+1)*a_width0-1:i*a_width0]), .B(B[B_WIDTH-3:0]), .Y(T[(i+1)*Y_WIDTH-1:i*Y_WIDTH])); |  | ||||||
|         else if (i == num_mux8 && a_widthN > 0) |  | ||||||
|           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_widthN), .B_WIDTH(B_WIDTH-2), .Y_WIDTH(Y_WIDTH)) fpga_shiftx_last (.A(A[A_WIDTH-1:i*a_width0]),        .B(B[B_WIDTH-3:0]), .Y(T[(i+1)*Y_WIDTH-1:i*Y_WIDTH])); |  | ||||||
|         else |  | ||||||
|           assign T[(i+1)*Y_WIDTH-1:i*Y_WIDTH] = {Y_WIDTH{1'bx}}; |  | ||||||
|       for (i = 0; i < Y_WIDTH; i++) begin |       for (i = 0; i < Y_WIDTH; i++) begin | ||||||
|         MUXF7 fpga_mux_0 (.I0(T[0*Y_WIDTH+i]), .I1(T[1*Y_WIDTH+i]), .S(B[B_WIDTH-2]), .O(T0[i])); |         wire [A_WIDTH/Y_WIDTH-1:0] A_i; | ||||||
|         MUXF7 fpga_mux_1 (.I0(T[2*Y_WIDTH+i]), .I1(T[3*Y_WIDTH+i]), .S(B[B_WIDTH-2]), .O(T1[i])); |         for (j = 0; j < A_WIDTH/Y_WIDTH; j++) | ||||||
|         MUXF8 fpga_mux_2 (.I0(T0[i]),          .I1(T1[i]),          .S(B[B_WIDTH-1]), .O(Y[i])); |           assign A_i[j] = A[i*Y_WIDTH+j]; | ||||||
|  |         wire [$clog2(A_WIDTH/Y_WIDTH)-1:0] B_i = B/Y_WIDTH; | ||||||
|  |         \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(A_WIDTH/Y_WIDTH), .B_WIDTH($clog2(A_WIDTH/Y_WIDTH)), .Y_WIDTH(1)) bitblast (.A(A_i), .B(B_i), .Y(Y[i])); | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |     else if (B_WIDTH < 3) begin | ||||||
|  |       wire _TECHMAP_FAIL_ = 1; | ||||||
|  |     end | ||||||
|  |     else if (B_WIDTH == 3) begin | ||||||
|  |       localparam a_width0 = 2 ** 2; | ||||||
|  |       localparam a_widthN = A_WIDTH - a_width0; | ||||||
|  |       wire T0, T1; | ||||||
|  |       \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_width0), .B_WIDTH(B_WIDTH-1),        .Y_WIDTH(Y_WIDTH)) fpga_shiftx      (.A(A[a_width0-1:0]),       .B(B[B_WIDTH-2:0]), .Y(T0)); | ||||||
|  |       \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_widthN), .B_WIDTH($clog2(a_widthN)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx_last (.A(A[A_WIDTH-1:a_width0]), .B(B[$clog2(a_widthN)-1:0]), .Y(T1)); | ||||||
|  |       MUXF7 fpga_mux (.I0(T0[i]), .I1(T1[i]), .S(B[B_WIDTH-1]), .O(Y[i])); | ||||||
|  |     end | ||||||
|  |     else if (B_WIDTH == 4) begin | ||||||
|  |       localparam a_width0 = 2 ** 3; | ||||||
|  |       localparam num_mux8 = A_WIDTH / a_width0; | ||||||
|  |       localparam a_widthN = A_WIDTH - num_mux8*a_width0; | ||||||
|  |       wire [B_WIDTH-1:0] T; | ||||||
|  |       wire T0, T1; | ||||||
|  |       for (i = 0; i < B_WIDTH; i++) | ||||||
|  |         if (i < num_mux8) | ||||||
|  |           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_width0), .B_WIDTH(B_WIDTH-2),        .Y_WIDTH(Y_WIDTH)) fpga_shiftx      (.A(A[(i+1)*a_width0-1:i*a_width0]), .B(B[B_WIDTH-3:0]),          .Y(T[i])); | ||||||
|  |         else if (i == num_mux8 && a_widthN > 0) | ||||||
|  |           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_widthN), .B_WIDTH($clog2(a_widthN)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx_last (.A(A[A_WIDTH-1:i*a_width0]),        .B(B[$clog2(a_widthN)-1:0]), .Y(T[i])); | ||||||
|  |         else | ||||||
|  |           assign T[i] = 1'bx; | ||||||
|  |       MUXF7 fpga_mux_0 (.I0(T[0]), .I1(T[1]), .S(B[B_WIDTH-2]), .O(T0)); | ||||||
|  |       MUXF7 fpga_mux_1 (.I0(T[2]), .I1(T[3]), .S(B[B_WIDTH-2]), .O(T1)); | ||||||
|  |       MUXF8 fpga_mux_2 (.I0(T0),   .I1(T1),   .S(B[B_WIDTH-1]), .O(Y)); | ||||||
|  |     end | ||||||
|     else begin |     else begin | ||||||
|       localparam a_width0 = Y_WIDTH * 16; |       localparam a_width0 = 2 ** 4; | ||||||
|       localparam num_mux16 = A_WIDTH / a_width0; |       localparam num_mux16 = A_WIDTH / a_width0; | ||||||
|       localparam a_widthN = A_WIDTH - num_mux16*a_width0; |       localparam a_widthN = A_WIDTH - num_mux16*a_width0; | ||||||
|       wire [Y_WIDTH * (2 ** ($clog2(NUM)-4))-1:0] T; |       wire [(2**(B_WIDTH-4))-1:0] T; | ||||||
|       for (i = 0; i < 2 ** ($clog2(NUM)-4); i++) |       for (i = 0; i < 2 ** (B_WIDTH-4); i++) | ||||||
|         if (i < num_mux16) |         if (i < num_mux16) | ||||||
|           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_width0), .B_WIDTH($clog2(a_width0)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx      (.A(A[(i+1)*a_width0-1:i*a_width0]), .B(B[$clog2(a_width0)-1:0]), .Y(T[(i+1)*Y_WIDTH-1:i*Y_WIDTH])); |           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_width0), .B_WIDTH(4),                .Y_WIDTH(Y_WIDTH)) fpga_shiftx      (.A(A[(i+1)*a_width0-1:i*a_width0]), .B(B[4-1:0]),                .Y(T[i])); | ||||||
|         else if (i == num_mux16 && a_widthN > 0) begin |         else if (i == num_mux16 && a_widthN > 0) begin | ||||||
|           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_widthN), .B_WIDTH($clog2(a_width0)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx_last (.A(A[A_WIDTH-1:i*a_width0]),        .B(B[$clog2(a_width0)-1:0]), .Y(T[(i+1)*Y_WIDTH-1:i*Y_WIDTH])); |           \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(a_widthN), .B_WIDTH($clog2(a_widthN)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx_last (.A(A[A_WIDTH-1:i*a_width0]),        .B(B[$clog2(a_widthN)-1:0]), .Y(T[i])); | ||||||
|         end |         end | ||||||
|         else |         else | ||||||
|           assign T[(i+1)*Y_WIDTH-1:i*Y_WIDTH] = {Y_WIDTH{1'bx}}; |           assign T[i] = 1'bx; | ||||||
|       \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(Y_WIDTH * (2 ** ($clog2(NUM)-4))), .B_WIDTH(B_WIDTH-$clog2(a_width0)), .Y_WIDTH(Y_WIDTH)) fpga_shiftx (.A(T), .B(B[B_WIDTH-1:$clog2(a_width0)]), .Y(Y)); |       \$shiftx  #(.A_SIGNED(A_SIGNED), .B_SIGNED(B_SIGNED), .A_WIDTH(2**(B_WIDTH-4)), .B_WIDTH(B_WIDTH-4), .Y_WIDTH(Y_WIDTH)) fpga_shiftx (.A(T), .B(B[B_WIDTH-1:4]), .Y(Y)); | ||||||
|     end |     end | ||||||
|   endgenerate |   endgenerate | ||||||
| endmodule | endmodule | ||||||
|  |  | ||||||
|  | @ -118,7 +118,7 @@ struct SynthXilinxPass : public Pass | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("    map_cells:\n"); | 		log("    map_cells:\n"); | ||||||
| 		log("        techmap -map +/xilinx/cells_map.v\n"); | 		log("        techmap -map +/xilinx/cells_map.v\n"); | ||||||
| 		log("        clean\n"); | 		log("        opt -fast\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("    map_luts:\n"); | 		log("    map_luts:\n"); | ||||||
| 		log("        techmap -map +/techmap.v\n"); | 		log("        techmap -map +/techmap.v\n"); | ||||||
|  | @ -258,11 +258,10 @@ struct SynthXilinxPass : public Pass | ||||||
| 
 | 
 | ||||||
| 		if (check_label(active, run_from, run_to, "fine")) | 		if (check_label(active, run_from, run_to, "fine")) | ||||||
| 		{ | 		{ | ||||||
| 			Pass::call(design, "opt -fast -full"); | 			Pass::call(design, "opt -fast"); | ||||||
| 			Pass::call(design, "memory_map"); | 			Pass::call(design, "memory_map"); | ||||||
| 			Pass::call(design, "dffsr2dff"); | 			Pass::call(design, "dffsr2dff"); | ||||||
| 			Pass::call(design, "dff2dffe"); | 			Pass::call(design, "dff2dffe"); | ||||||
| 			Pass::call(design, "opt -full"); |  | ||||||
| 
 | 
 | ||||||
| 			if (vpr) { | 			if (vpr) { | ||||||
| 				Pass::call(design, "techmap -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY"); | 				Pass::call(design, "techmap -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY"); | ||||||
|  | @ -282,6 +281,7 @@ struct SynthXilinxPass : public Pass | ||||||
| 
 | 
 | ||||||
| 		if (check_label(active, run_from, run_to, "map_luts")) | 		if (check_label(active, run_from, run_to, "map_luts")) | ||||||
| 		{ | 		{ | ||||||
|  | 			Pass::call(design, "opt -full"); | ||||||
| 			Pass::call(design, "techmap -map +/techmap.v"); | 			Pass::call(design, "techmap -map +/techmap.v"); | ||||||
| 			if (abc == "abc9") | 			if (abc == "abc9") | ||||||
| 				Pass::call(design, abc + " -lut +/xilinx/cells.lut -box +/xilinx/cells.box" + string(retime ? " -dff" : "")); | 				Pass::call(design, abc + " -lut +/xilinx/cells.lut -box +/xilinx/cells.box" + string(retime ? " -dff" : "")); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue