mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Merge pull request #1643 from YosysHQ/eddie/cleanup_arith_map
Cleanup +/xilinx/arith_map.v
This commit is contained in:
		
						commit
						b7be6cfd65
					
				
					 2 changed files with 88 additions and 125 deletions
				
			
		| 
						 | 
				
			
			@ -33,7 +33,21 @@ module _80_xilinx_lcu (P, G, CI, CO);
 | 
			
		|||
 | 
			
		||||
	genvar i;
 | 
			
		||||
 | 
			
		||||
`ifdef _CLB_CARRY
 | 
			
		||||
`ifdef _EXPLICIT_CARRY
 | 
			
		||||
 | 
			
		||||
	wire [WIDTH-1:0] C = {CO, CI};
 | 
			
		||||
	wire [WIDTH-1:0] S = P & ~G;
 | 
			
		||||
 | 
			
		||||
	generate for (i = 0; i < WIDTH; i = i + 1) begin:slice
 | 
			
		||||
		MUXCY muxcy (
 | 
			
		||||
			.CI(C[i]),
 | 
			
		||||
			.DI(G[i]),
 | 
			
		||||
			.S(S[i]),
 | 
			
		||||
			.O(CO[i])
 | 
			
		||||
		);
 | 
			
		||||
	end endgenerate
 | 
			
		||||
 | 
			
		||||
`else
 | 
			
		||||
 | 
			
		||||
	localparam CARRY4_COUNT = (WIDTH + 3) / 4;
 | 
			
		||||
	localparam MAX_WIDTH    = CARRY4_COUNT * 4;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,9 +67,9 @@ module _80_xilinx_lcu (P, G, CI, CO);
 | 
			
		|||
				(
 | 
			
		||||
				.CYINIT(CI),
 | 
			
		||||
				.CI    (1'd0),
 | 
			
		||||
				.DI    (G [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.DI    (G [(WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(WIDTH - 1):i*4]),
 | 
			
		||||
				);
 | 
			
		||||
			// Another one
 | 
			
		||||
			end else begin
 | 
			
		||||
| 
						 | 
				
			
			@ -63,9 +77,9 @@ module _80_xilinx_lcu (P, G, CI, CO);
 | 
			
		|||
				(
 | 
			
		||||
				.CYINIT(1'd0),
 | 
			
		||||
				.CI    (C [i*4 - 1]),
 | 
			
		||||
				.DI    (G [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.DI    (G [(WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(WIDTH - 1):i*4]),
 | 
			
		||||
				);
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -97,34 +111,6 @@ module _80_xilinx_lcu (P, G, CI, CO);
 | 
			
		|||
		end
 | 
			
		||||
 | 
			
		||||
	end endgenerate
 | 
			
		||||
 | 
			
		||||
`elsif _EXPLICIT_CARRY
 | 
			
		||||
 | 
			
		||||
	wire [WIDTH-1:0] C = {CO, CI};
 | 
			
		||||
	wire [WIDTH-1:0] S = P & ~G;
 | 
			
		||||
 | 
			
		||||
	generate for (i = 0; i < WIDTH; i = i + 1) begin:slice
 | 
			
		||||
		MUXCY muxcy (
 | 
			
		||||
			.CI(C[i]),
 | 
			
		||||
			.DI(G[i]),
 | 
			
		||||
			.S(S[i]),
 | 
			
		||||
			.O(CO[i])
 | 
			
		||||
		);
 | 
			
		||||
	end endgenerate
 | 
			
		||||
 | 
			
		||||
`else
 | 
			
		||||
 | 
			
		||||
	wire [WIDTH-1:0] C = {CO, CI};
 | 
			
		||||
	wire [WIDTH-1:0] S = P & ~G;
 | 
			
		||||
 | 
			
		||||
	generate for (i = 0; i < WIDTH; i = i + 1) begin:slice
 | 
			
		||||
		MUXCY muxcy (
 | 
			
		||||
			.CI(C[i]),
 | 
			
		||||
			.DI(G[i]),
 | 
			
		||||
			.S(S[i]),
 | 
			
		||||
			.O(CO[i])
 | 
			
		||||
		);
 | 
			
		||||
	end endgenerate
 | 
			
		||||
`endif
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
| 
						 | 
				
			
			@ -161,79 +147,7 @@ module _80_xilinx_alu (A, B, CI, BI, X, Y, CO);
 | 
			
		|||
 | 
			
		||||
	genvar i;
 | 
			
		||||
 | 
			
		||||
`ifdef _CLB_CARRY
 | 
			
		||||
 | 
			
		||||
	localparam CARRY4_COUNT = (Y_WIDTH + 3) / 4;
 | 
			
		||||
	localparam MAX_WIDTH    = CARRY4_COUNT * 4;
 | 
			
		||||
	localparam PAD_WIDTH    = MAX_WIDTH - Y_WIDTH;
 | 
			
		||||
 | 
			
		||||
	wire [MAX_WIDTH-1:0] S  = {{PAD_WIDTH{1'b0}}, AA ^ BB};
 | 
			
		||||
	wire [MAX_WIDTH-1:0] DI = {{PAD_WIDTH{1'b0}}, AA & BB};
 | 
			
		||||
 | 
			
		||||
	wire [MAX_WIDTH-1:0] C  = CO;
 | 
			
		||||
 | 
			
		||||
	genvar i;
 | 
			
		||||
	generate for (i = 0; i < CARRY4_COUNT; i = i + 1) begin:slice
 | 
			
		||||
 | 
			
		||||
		// Partially occupied CARRY4
 | 
			
		||||
		if ((i+1)*4 > Y_WIDTH) begin
 | 
			
		||||
 | 
			
		||||
			// First one
 | 
			
		||||
			if (i == 0) begin
 | 
			
		||||
				CARRY4 carry4_1st_part
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(CI),
 | 
			
		||||
				.CI    (1'd0),
 | 
			
		||||
				.DI    (DI[(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.O     (Y [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(Y_WIDTH - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			// Another one
 | 
			
		||||
			end else begin
 | 
			
		||||
				CARRY4 carry4_part
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(1'd0),
 | 
			
		||||
				.CI    (C [i*4 - 1]),
 | 
			
		||||
				.DI    (DI[(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.O     (Y [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(Y_WIDTH - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
		// Fully occupied CARRY4
 | 
			
		||||
		end else begin
 | 
			
		||||
 | 
			
		||||
			// First one
 | 
			
		||||
			if (i == 0) begin
 | 
			
		||||
				CARRY4 carry4_1st_full
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(CI),
 | 
			
		||||
				.CI    (1'd0),
 | 
			
		||||
				.DI    (DI[((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.S     (S [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.O     (Y [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.CO    (CO[((i+1)*4 - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			// Another one
 | 
			
		||||
			end else begin
 | 
			
		||||
				CARRY4 carry4_full
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(1'd0),
 | 
			
		||||
				.CI    (C [i*4 - 1]),
 | 
			
		||||
				.DI    (DI[((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.S     (S [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.O     (Y [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.CO    (CO[((i+1)*4 - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
	end endgenerate
 | 
			
		||||
 | 
			
		||||
`elsif _EXPLICIT_CARRY
 | 
			
		||||
`ifdef _EXPLICIT_CARRY
 | 
			
		||||
 | 
			
		||||
	wire [Y_WIDTH-1:0] S = AA ^ BB;
 | 
			
		||||
	wire [Y_WIDTH-1:0] DI = AA & BB;
 | 
			
		||||
| 
						 | 
				
			
			@ -333,23 +247,74 @@ module _80_xilinx_alu (A, B, CI, BI, X, Y, CO);
 | 
			
		|||
 | 
			
		||||
`else
 | 
			
		||||
 | 
			
		||||
	wire [Y_WIDTH-1:0] S = AA ^ BB;
 | 
			
		||||
	wire [Y_WIDTH-1:0] DI = AA & BB;
 | 
			
		||||
	localparam CARRY4_COUNT = (Y_WIDTH + 3) / 4;
 | 
			
		||||
	localparam MAX_WIDTH    = CARRY4_COUNT * 4;
 | 
			
		||||
	localparam PAD_WIDTH    = MAX_WIDTH - Y_WIDTH;
 | 
			
		||||
 | 
			
		||||
	wire [Y_WIDTH-1:0] C = {CO, CI};
 | 
			
		||||
	wire [MAX_WIDTH-1:0] S  = {{PAD_WIDTH{1'b0}}, AA ^ BB};
 | 
			
		||||
	wire [MAX_WIDTH-1:0] DI = {{PAD_WIDTH{1'b0}}, AA & BB};
 | 
			
		||||
 | 
			
		||||
	wire [MAX_WIDTH-1:0] C  = CO;
 | 
			
		||||
 | 
			
		||||
	genvar i;
 | 
			
		||||
	generate for (i = 0; i < CARRY4_COUNT; i = i + 1) begin:slice
 | 
			
		||||
 | 
			
		||||
		// Partially occupied CARRY4
 | 
			
		||||
		if ((i+1)*4 > Y_WIDTH) begin
 | 
			
		||||
 | 
			
		||||
			// First one
 | 
			
		||||
			if (i == 0) begin
 | 
			
		||||
				CARRY4 carry4_1st_part
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(CI),
 | 
			
		||||
				.CI    (1'd0),
 | 
			
		||||
				.DI    (DI[(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.O     (Y [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(Y_WIDTH - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			// Another one
 | 
			
		||||
			end else begin
 | 
			
		||||
				CARRY4 carry4_part
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(1'd0),
 | 
			
		||||
				.CI    (C [i*4 - 1]),
 | 
			
		||||
				.DI    (DI[(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.S     (S [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.O     (Y [(Y_WIDTH - 1):i*4]),
 | 
			
		||||
				.CO    (CO[(Y_WIDTH - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
		// Fully occupied CARRY4
 | 
			
		||||
		end else begin
 | 
			
		||||
 | 
			
		||||
			// First one
 | 
			
		||||
			if (i == 0) begin
 | 
			
		||||
				CARRY4 carry4_1st_full
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(CI),
 | 
			
		||||
				.CI    (1'd0),
 | 
			
		||||
				.DI    (DI[((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.S     (S [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.O     (Y [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.CO    (CO[((i+1)*4 - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			// Another one
 | 
			
		||||
			end else begin
 | 
			
		||||
				CARRY4 carry4_full
 | 
			
		||||
				(
 | 
			
		||||
				.CYINIT(1'd0),
 | 
			
		||||
				.CI    (C [i*4 - 1]),
 | 
			
		||||
				.DI    (DI[((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.S     (S [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.O     (Y [((i+1)*4 - 1):i*4]),
 | 
			
		||||
				.CO    (CO[((i+1)*4 - 1):i*4])
 | 
			
		||||
				);
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
	generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice
 | 
			
		||||
		MUXCY muxcy (
 | 
			
		||||
			.CI(C[i]),
 | 
			
		||||
			.DI(DI[i]),
 | 
			
		||||
			.S(S[i]),
 | 
			
		||||
			.O(CO[i])
 | 
			
		||||
		);
 | 
			
		||||
		XORCY xorcy (
 | 
			
		||||
			.CI(C[i]),
 | 
			
		||||
			.LI(S[i]),
 | 
			
		||||
			.O(Y[i])
 | 
			
		||||
		);
 | 
			
		||||
	end endgenerate
 | 
			
		||||
 | 
			
		||||
`endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -518,8 +518,6 @@ struct SynthXilinxPass : public ScriptPass
 | 
			
		|||
				techmap_args += " -map +/xilinx/arith_map.v";
 | 
			
		||||
				if (vpr)
 | 
			
		||||
					techmap_args += " -D _EXPLICIT_CARRY";
 | 
			
		||||
				else
 | 
			
		||||
					techmap_args += " -D _CLB_CARRY";
 | 
			
		||||
			}
 | 
			
		||||
			run("techmap " + techmap_args);
 | 
			
		||||
			run("opt -fast");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue