mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +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
 | 
				
			||||||
 | 
					      for (i = 0; i < Y_WIDTH; i++) begin
 | 
				
			||||||
 | 
					        wire [A_WIDTH/Y_WIDTH-1:0] A_i;
 | 
				
			||||||
 | 
					        for (j = 0; j < A_WIDTH/Y_WIDTH; j++)
 | 
				
			||||||
 | 
					          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
 | 
				
			||||||
 | 
					    else if (B_WIDTH < 3) begin
 | 
				
			||||||
      wire _TECHMAP_FAIL_ = 1;
 | 
					      wire _TECHMAP_FAIL_ = 1;
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    else if (NUM <= 8) begin
 | 
					    else if (B_WIDTH == 3) begin
 | 
				
			||||||
      localparam a_width0 = Y_WIDTH * 4;
 | 
					      localparam a_width0 = 2 ** 2;
 | 
				
			||||||
      localparam a_widthN = A_WIDTH - a_width0;
 | 
					      localparam a_widthN = A_WIDTH - a_width0;
 | 
				
			||||||
      wire [Y_WIDTH-1:0] T0, T1;
 | 
					      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_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));
 | 
					      \$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]));
 | 
					      MUXF7 fpga_mux (.I0(T0[i]), .I1(T1[i]), .S(B[B_WIDTH-1]), .O(Y[i]));
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    else if (NUM <= 16) begin
 | 
					    else if (B_WIDTH == 4) begin
 | 
				
			||||||
      localparam a_width0 = Y_WIDTH * 4;
 | 
					      localparam a_width0 = 2 ** 3;
 | 
				
			||||||
      localparam num_mux8 = A_WIDTH / a_width0;
 | 
					      localparam num_mux8 = A_WIDTH / a_width0;
 | 
				
			||||||
      localparam a_widthN = A_WIDTH - num_mux8*a_width0;
 | 
					      localparam a_widthN = A_WIDTH - num_mux8*a_width0;
 | 
				
			||||||
      wire [Y_WIDTH*4-1:0] T;
 | 
					      wire [B_WIDTH-1:0] T;
 | 
				
			||||||
      wire [Y_WIDTH-1:0] T0, T1;
 | 
					      wire T0, T1;
 | 
				
			||||||
      for (i = 0; i < 4; i++)
 | 
					      for (i = 0; i < B_WIDTH; i++)
 | 
				
			||||||
        if (i < num_mux8)
 | 
					        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]));
 | 
					          \$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)
 | 
					        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]));
 | 
					          \$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
 | 
					        else
 | 
				
			||||||
          assign T[(i+1)*Y_WIDTH-1:i*Y_WIDTH] = {Y_WIDTH{1'bx}};
 | 
					          assign T[i] = 1'bx;
 | 
				
			||||||
      for (i = 0; i < Y_WIDTH; i++) begin
 | 
					      MUXF7 fpga_mux_0 (.I0(T[0]), .I1(T[1]), .S(B[B_WIDTH-2]), .O(T0));
 | 
				
			||||||
        MUXF7 fpga_mux_0 (.I0(T[0*Y_WIDTH+i]), .I1(T[1*Y_WIDTH+i]), .S(B[B_WIDTH-2]), .O(T0[i]));
 | 
					      MUXF7 fpga_mux_1 (.I0(T[2]), .I1(T[3]), .S(B[B_WIDTH-2]), .O(T1));
 | 
				
			||||||
        MUXF7 fpga_mux_1 (.I0(T[2*Y_WIDTH+i]), .I1(T[3*Y_WIDTH+i]), .S(B[B_WIDTH-2]), .O(T1[i]));
 | 
					      MUXF8 fpga_mux_2 (.I0(T0),   .I1(T1),   .S(B[B_WIDTH-1]), .O(Y));
 | 
				
			||||||
        MUXF8 fpga_mux_2 (.I0(T0[i]),          .I1(T1[i]),          .S(B[B_WIDTH-1]), .O(Y[i]));
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					    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