diff options
Diffstat (limited to 'techlibs/ice40')
| -rw-r--r-- | techlibs/ice40/Makefile.inc | 1 | ||||
| -rw-r--r-- | techlibs/ice40/arith_map.v | 30 | ||||
| -rw-r--r-- | techlibs/ice40/cells_map.v | 23 | ||||
| -rw-r--r-- | techlibs/ice40/cells_sim.v | 10 | ||||
| -rw-r--r-- | techlibs/ice40/ice40_unlut.cc | 106 | ||||
| -rw-r--r-- | techlibs/ice40/synth_ice40.cc | 13 | ||||
| -rw-r--r-- | techlibs/ice40/tests/test_arith.ys | 9 | 
7 files changed, 40 insertions, 152 deletions
diff --git a/techlibs/ice40/Makefile.inc b/techlibs/ice40/Makefile.inc index b0eadab44..92a9956ea 100644 --- a/techlibs/ice40/Makefile.inc +++ b/techlibs/ice40/Makefile.inc @@ -4,7 +4,6 @@ OBJS += techlibs/ice40/ice40_braminit.o  OBJS += techlibs/ice40/ice40_ffssr.o  OBJS += techlibs/ice40/ice40_ffinit.o  OBJS += techlibs/ice40/ice40_opt.o -OBJS += techlibs/ice40/ice40_unlut.o  GENFILES += techlibs/ice40/brams_init1.vh  GENFILES += techlibs/ice40/brams_init2.vh diff --git a/techlibs/ice40/arith_map.v b/techlibs/ice40/arith_map.v index fe83a8e38..26b24db9e 100644 --- a/techlibs/ice40/arith_map.v +++ b/techlibs/ice40/arith_map.v @@ -44,35 +44,21 @@ module _80_ice40_alu (A, B, CI, BI, X, Y, CO);  	genvar i;  	generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice -`ifdef _ABC -		\$__ICE40_FULL_ADDER carry ( +		\$__ICE40_CARRY_WRAPPER #( +			//    A[0]: 1010 1010 1010 1010 +			//    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) +		) fadd (  			.A(AA[i]),  			.B(BB[i]),  			.CI(C[i]), -			.CO(CO[i]), -			.O(Y[i]) -		); -`else -		SB_CARRY carry ( -			.I0(AA[i]), -			.I1(BB[i]), -			.CI(C[i]), -			.CO(CO[i]) -		); -		SB_LUT4 #( -			//         I0: 1010 1010 1010 1010 -			//         I1: 1100 1100 1100 1100 -			//         I2: 1111 0000 1111 0000 -			//         I3: 1111 1111 0000 0000 -			.LUT_INIT(16'b 0110_1001_1001_0110) -		) adder (  			.I0(1'b0), -			.I1(AA[i]), -			.I2(BB[i]),  			.I3(C[i]), +			.CO(CO[i]),  			.O(Y[i])  		); -`endif  	end endgenerate  	assign X = AA ^ BB; diff --git a/techlibs/ice40/cells_map.v b/techlibs/ice40/cells_map.v index b4b831165..662423f0a 100644 --- a/techlibs/ice40/cells_map.v +++ b/techlibs/ice40/cells_map.v @@ -62,26 +62,21 @@ module \$lut (A, Y);  endmodule  `endif -`ifdef _ABC -module \$__ICE40_FULL_ADDER (output CO, O, input A, B, CI); +`ifndef NO_ADDER +module \$__ICE40_CARRY_WRAPPER (output CO, O, input A, B, CI, I0, I3); +  parameter LUT = 0;    SB_CARRY carry (      .I0(A),      .I1(B),      .CI(CI),      .CO(CO)    ); -  SB_LUT4 #( -    //         I0: 1010 1010 1010 1010 -    //         I1: 1100 1100 1100 1100 -    //         I2: 1111 0000 1111 0000 -    //         I3: 1111 1111 0000 0000 -    .LUT_INIT(16'b 0110_1001_1001_0110) -  ) adder ( -    .I0(1'b0), -    .I1(A), -    .I2(B), -    .I3(CI), -    .O(O) +  \$lut #( +    .WIDTH(4), +    .LUT(LUT) +  ) lut ( +    .A({I0,A,B,I3}), +    .Y(O)    );  endmodule  `endif diff --git a/techlibs/ice40/cells_sim.v b/techlibs/ice40/cells_sim.v index 2205be27d..ab04808f4 100644 --- a/techlibs/ice40/cells_sim.v +++ b/techlibs/ice40/cells_sim.v @@ -141,8 +141,14 @@ module SB_CARRY (output CO, input I0, I1, CI);  	assign CO = (I0 && I1) || ((I0 || I1) && CI);  endmodule -(* abc_box_id = 1, abc_carry="CI,CO", lib_whitebox *) -module \$__ICE40_FULL_ADDER (output CO, O, input A, B, CI); +(* abc_box_id = 1, lib_whitebox *) +module \$__ICE40_FULL_ADDER ( +	(* abc_carry *) output CO, +	output O, +	input A, +	input B, +	(* abc_carry *) input CI +);  	SB_CARRY carry (  		.I0(A),  		.I1(B), diff --git a/techlibs/ice40/ice40_unlut.cc b/techlibs/ice40/ice40_unlut.cc deleted file mode 100644 index f3f70ac1f..000000000 --- a/techlibs/ice40/ice40_unlut.cc +++ /dev/null @@ -1,106 +0,0 @@ -/* - *  yosys -- Yosys Open SYnthesis Suite - * - *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at> - * - *  Permission to use, copy, modify, and/or distribute this software for any - *  purpose with or without fee is hereby granted, provided that the above - *  copyright notice and this permission notice appear in all copies. - * - *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -#include "kernel/yosys.h" -#include "kernel/sigtools.h" -#include <stdlib.h> -#include <stdio.h> - -USING_YOSYS_NAMESPACE -PRIVATE_NAMESPACE_BEGIN - -static SigBit get_bit_or_zero(const SigSpec &sig) -{ -	if (GetSize(sig) == 0) -		return State::S0; -	return sig[0]; -} - -static void run_ice40_unlut(Module *module) -{ -	SigMap sigmap(module); - -	for (auto cell : module->selected_cells()) -	{ -		if (cell->type == "\\SB_LUT4") -		{ -			SigSpec inbits; - -			inbits.append(get_bit_or_zero(cell->getPort("\\I0"))); -			inbits.append(get_bit_or_zero(cell->getPort("\\I1"))); -			inbits.append(get_bit_or_zero(cell->getPort("\\I2"))); -			inbits.append(get_bit_or_zero(cell->getPort("\\I3"))); -			sigmap.apply(inbits); - -			log("Mapping SB_LUT4 cell %s.%s to $lut.\n", log_id(module), log_id(cell)); - -			cell->type ="$lut"; -			cell->setParam("\\WIDTH", 4); -			cell->setParam("\\LUT", cell->getParam("\\LUT_INIT")); -			cell->unsetParam("\\LUT_INIT"); - -			cell->setPort("\\A", SigSpec({ -				get_bit_or_zero(cell->getPort("\\I0")), -				get_bit_or_zero(cell->getPort("\\I1")), -				get_bit_or_zero(cell->getPort("\\I2")), -				get_bit_or_zero(cell->getPort("\\I3")) -			})); -			cell->setPort("\\Y", cell->getPort("\\O")[0]); -			cell->unsetPort("\\I0"); -			cell->unsetPort("\\I1"); -			cell->unsetPort("\\I2"); -			cell->unsetPort("\\I3"); -			cell->unsetPort("\\O"); - -			cell->check(); -		} -	} -} - -struct Ice40UnlutPass : public Pass { -	Ice40UnlutPass() : Pass("ice40_unlut", "iCE40: transform SB_LUT4 cells to $lut cells") { } -	void help() YS_OVERRIDE -	{ -		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| -		log("\n"); -		log("    ice40_unlut [options] [selection]\n"); -		log("\n"); -		log("This command transforms all SB_LUT4 cells to generic $lut cells.\n"); -		log("\n"); -	} -	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE -	{ -		log_header(design, "Executing ICE40_UNLUT pass (convert SB_LUT4 to $lut).\n"); -		log_push(); - -		size_t argidx; -		for (argidx = 1; argidx < args.size(); argidx++) { -			// if (args[argidx] == "-???") { -			//  continue; -			// } -			break; -		} -		extra_args(args, argidx, design); - -		for (auto module : design->selected_modules()) -			run_ice40_unlut(module); -	} -} Ice40UnlutPass; - -PRIVATE_NAMESPACE_END diff --git a/techlibs/ice40/synth_ice40.cc b/techlibs/ice40/synth_ice40.cc index 24668d642..a79c471c1 100644 --- a/techlibs/ice40/synth_ice40.cc +++ b/techlibs/ice40/synth_ice40.cc @@ -238,7 +238,7 @@ struct SynthIce40Pass : public ScriptPass  	{  		if (check_label("begin"))  		{ -			run("read_verilog -icells -lib -D_ABC +/ice40/cells_sim.v"); +			run("read_verilog -icells -lib +/ice40/cells_sim.v");  			run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));  			run("proc");  		} @@ -298,8 +298,10 @@ struct SynthIce40Pass : public ScriptPass  		{  			if (nocarry)  				run("techmap"); -			else -				run("techmap -map +/techmap.v -map +/ice40/arith_map.v" + std::string(abc == "abc9" ? " -D _ABC" : "")); +			else { +				run("ice40_wrapcarry"); +				run("techmap -map +/techmap.v -map +/ice40/arith_map.v"); +			}  			if (retime || help_mode)  				run(abc + " -dff", "(only if -retime)");  			run("ice40_opt"); @@ -314,7 +316,7 @@ struct SynthIce40Pass : public ScriptPass  				run("opt_merge");  				run(stringf("dff2dffe -unmap-mince %d", min_ce_use));  			} -			run("techmap -D NO_LUT -map +/ice40/cells_map.v"); +			run("techmap -D NO_LUT -D NO_ADDER -map +/ice40/cells_map.v");  			run("opt_expr -mux_undef");  			run("simplemap");  			run("ice40_ffinit"); @@ -343,13 +345,12 @@ struct SynthIce40Pass : public ScriptPass  					else  						wire_delay = 250;  					run(abc + stringf(" -W %d -lut +/ice40/abc_%s.lut -box +/ice40/abc_%s.box", wire_delay, device_opt.c_str(), device_opt.c_str()), "(skip if -noabc)"); -					run("techmap -D NO_LUT -D _ABC -map +/ice40/cells_map.v");  				}  				else  					run(abc + " -dress -lut 4", "(skip if -noabc)");  			} +			run("techmap -D NO_LUT -map +/ice40/cells_map.v");  			run("clean"); -			run("ice40_unlut");  			run("opt_lut -dlogic SB_CARRY:I0=2:I1=1:CI=0");  		} diff --git a/techlibs/ice40/tests/test_arith.ys b/techlibs/ice40/tests/test_arith.ys index 160c767fb..ddb80b700 100644 --- a/techlibs/ice40/tests/test_arith.ys +++ b/techlibs/ice40/tests/test_arith.ys @@ -1,6 +1,5 @@  read_verilog test_arith.v  synth_ice40 -techmap -map ../cells_sim.v  rename test gate  read_verilog test_arith.v @@ -8,3 +7,11 @@ rename test gold  miter -equiv -flatten -make_outputs gold gate miter  sat -verify -prove trigger 0 -show-ports miter + +synth_ice40 -top gate + +read_verilog test_arith.v +rename test gold + +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 -show-ports miter  | 
