diff options
Diffstat (limited to 'techlibs')
| -rw-r--r-- | techlibs/ice40/abc9_model.v | 4 | ||||
| -rw-r--r-- | techlibs/ice40/abc9_u.box | 3 | ||||
| -rw-r--r-- | techlibs/ice40/arith_map.v | 5 | ||||
| -rw-r--r-- | techlibs/ice40/cells_sim.v | 1 | ||||
| -rw-r--r-- | techlibs/ice40/ice40_opt.cc | 4 | 
5 files changed, 11 insertions, 6 deletions
| diff --git a/techlibs/ice40/abc9_model.v b/techlibs/ice40/abc9_model.v index 26cf6cc22..a5e5f4372 100644 --- a/techlibs/ice40/abc9_model.v +++ b/techlibs/ice40/abc9_model.v @@ -9,6 +9,8 @@ module \$__ICE40_CARRY_WRAPPER (  	input I0, I3  );  	parameter LUT = 0; +	parameter I3_IS_CI = 0; +	wire I3_OR_CI = I3_IS_CI ? CI : I3;  	SB_CARRY carry (  		.I0(A),  		.I1(B), @@ -21,7 +23,7 @@ module \$__ICE40_CARRY_WRAPPER (  		.I0(I0),  		.I1(A),  		.I2(B), -		.I3(I3), +		.I3(I3_OR_CI),  		.O(O)  	);  endmodule diff --git a/techlibs/ice40/abc9_u.box b/techlibs/ice40/abc9_u.box index 48a51463e..3d4b93834 100644 --- a/techlibs/ice40/abc9_u.box +++ b/techlibs/ice40/abc9_u.box @@ -6,13 +6,12 @@  # Box 1 : $__ICE40_CARRY_WRAPPER (private cell used to preserve  #                                 SB_LUT4+SB_CARRY) -# Outputs: O, CO  #   (Exception: carry chain input/output must be the  #        last input and output and the entire bus has been  #        moved there overriding the otherwise  #        alphabetical ordering)  # name                 ID  w/b ins outs  $__ICE40_CARRY_WRAPPER 1   1   5   2 -#A  B   I0  I3  CI +#A   B    I0   I3  CI  1231 1205 1285 874 874 # O  675  609  -    -   278 # CO diff --git a/techlibs/ice40/arith_map.v b/techlibs/ice40/arith_map.v index 00a07247b..ed4140e44 100644 --- a/techlibs/ice40/arith_map.v +++ b/techlibs/ice40/arith_map.v @@ -49,13 +49,14 @@ module _80_ice40_alu (A, B, CI, BI, X, Y, CO);  			//    A[1]: 1100 1100 1100 1100  			//    A[2]: 1111 0000 1111 0000  			//    A[3]: 1111 1111 0000 0000 -			.LUT(16'b 0110_1001_1001_0110) +			.LUT(16'b 0110_1001_1001_0110), +			.I3_IS_CI(1'b1)  		) carry (  			.A(AA[i]),  			.B(BB[i]),  			.CI(C[i]),  			.I0(1'b0), -			.I3(C[i]), +			.I3(1'bx),  			.CO(CO[i]),  			.O(Y[i])  		); diff --git a/techlibs/ice40/cells_sim.v b/techlibs/ice40/cells_sim.v index 7d1b37fd6..50eab5dde 100644 --- a/techlibs/ice40/cells_sim.v +++ b/techlibs/ice40/cells_sim.v @@ -1126,6 +1126,7 @@ module SB_SPRAM256KA (  	input [15:0] DATAIN,  	input [3:0] MASKWREN,  	input WREN, CHIPSELECT, CLOCK, STANDBY, SLEEP, POWEROFF, +	`ABC9_ARRIVAL_U(1821)  // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13207  	output reg [15:0] DATAOUT  );  `ifndef BLACKBOX diff --git a/techlibs/ice40/ice40_opt.cc b/techlibs/ice40/ice40_opt.cc index 9bee0444b..df10a2842 100644 --- a/techlibs/ice40/ice40_opt.cc +++ b/techlibs/ice40/ice40_opt.cc @@ -139,7 +139,8 @@ static void run_ice40_opts(Module *module)  				log("Optimized $__ICE40_CARRY_WRAPPER cell back to logic (without SB_CARRY) %s.%s: CO=%s\n",  						log_id(module), log_id(cell), log_signal(replacement_output));  				cell->type = "$lut"; -				cell->setPort("\\A", { cell->getPort("\\I0"), inbit[0], inbit[1], cell->getPort("\\I3") }); +				auto I3 = cell->getPort(cell->getParam(ID(I3_IS_CI)).as_bool() ? ID(CI) : ID(I3)); +				cell->setPort("\\A", { cell->getPort("\\I0"), inbit[0], inbit[1], I3 });  				cell->setPort("\\Y", cell->getPort("\\O"));  				cell->unsetPort("\\B");  				cell->unsetPort("\\CI"); @@ -148,6 +149,7 @@ static void run_ice40_opts(Module *module)  				cell->unsetPort("\\CO");  				cell->unsetPort("\\O");  				cell->setParam("\\WIDTH", 4); +				cell->unsetParam("\\I3_IS_CI");  			}  			continue;  		} | 
