diff options
Diffstat (limited to 'techlibs/xilinx')
| -rw-r--r-- | techlibs/xilinx/cells_map.v | 10 | ||||
| -rw-r--r-- | techlibs/xilinx/cells_sim.v | 17 | ||||
| -rw-r--r-- | techlibs/xilinx/cells_xtra.sh | 4 | ||||
| -rw-r--r-- | techlibs/xilinx/cells_xtra.v | 18 | ||||
| -rw-r--r-- | techlibs/xilinx/drams.txt | 24 | ||||
| -rw-r--r-- | techlibs/xilinx/drams_map.v | 34 | ||||
| -rw-r--r-- | techlibs/xilinx/ff_map.v | 13 | ||||
| -rw-r--r-- | techlibs/xilinx/synth_xilinx.cc | 292 | 
8 files changed, 211 insertions, 201 deletions
| diff --git a/techlibs/xilinx/cells_map.v b/techlibs/xilinx/cells_map.v index 704ab21b1..40789ddbe 100644 --- a/techlibs/xilinx/cells_map.v +++ b/techlibs/xilinx/cells_map.v @@ -17,6 +17,16 @@   *   */ +// Convert negative-polarity reset to positive-polarity +(* techmap_celltype = "$_DFF_NN0_" *) +module _90_dff_nn0_to_np0 (input D, C, R, output Q); \$_DFF_NP0_  _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule +(* techmap_celltype = "$_DFF_PN0_" *) +module _90_dff_pn0_to_pp0 (input D, C, R, output Q); \$_DFF_PP0_  _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule +(* techmap_celltype = "$_DFF_NN1_" *) +module _90_dff_nn1_to_np1 (input D, C, R, output Q); \$_DFF_NP1   _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule +(* techmap_celltype = "$_DFF_PN1_" *) +module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1   _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule +  module \$__SHREG_ (input C, input D, input E, output Q);    parameter DEPTH = 0;    parameter [DEPTH-1:0] INIT = 0; diff --git a/techlibs/xilinx/cells_sim.v b/techlibs/xilinx/cells_sim.v index 3a4540b83..50d588a9e 100644 --- a/techlibs/xilinx/cells_sim.v +++ b/techlibs/xilinx/cells_sim.v @@ -278,6 +278,23 @@ module FDPE_1 (output reg Q, input C, CE, D, PRE);    always @(negedge C, posedge PRE) if (PRE) Q <= 1'b1; else if (CE) Q <= D;  endmodule +module RAM32X1D ( +  output DPO, SPO, +  input  D, WCLK, WE, +  input  A0, A1, A2, A3, A4, +  input  DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, +); +  parameter INIT = 32'h0; +  parameter IS_WCLK_INVERTED = 1'b0; +  wire [4:0] a = {A4, A3, A2, A1, A0}; +  wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0}; +  reg [31:0] mem = INIT; +  assign SPO = mem[a]; +  assign DPO = mem[dpra]; +  wire clk = WCLK ^ IS_WCLK_INVERTED; +  always @(posedge clk) if (WE) mem[a] <= D; +endmodule +  module RAM64X1D (    output DPO, SPO,    input  D, WCLK, WE, diff --git a/techlibs/xilinx/cells_xtra.sh b/techlibs/xilinx/cells_xtra.sh index 8e39b440d..83863bf0b 100644 --- a/techlibs/xilinx/cells_xtra.sh +++ b/techlibs/xilinx/cells_xtra.sh @@ -116,11 +116,11 @@ function xtract_cell_decl()  	xtract_cell_decl PS7 "(* keep *)"  	xtract_cell_decl PULLDOWN  	xtract_cell_decl PULLUP -	xtract_cell_decl RAM128X1D +	#xtract_cell_decl RAM128X1D  	xtract_cell_decl RAM128X1S  	xtract_cell_decl RAM256X1S  	xtract_cell_decl RAM32M -	xtract_cell_decl RAM32X1D +	#xtract_cell_decl RAM32X1D  	xtract_cell_decl RAM32X1S  	xtract_cell_decl RAM32X1S_1  	xtract_cell_decl RAM32X2S diff --git a/techlibs/xilinx/cells_xtra.v b/techlibs/xilinx/cells_xtra.v index fbcc74682..6220da703 100644 --- a/techlibs/xilinx/cells_xtra.v +++ b/techlibs/xilinx/cells_xtra.v @@ -3655,17 +3655,6 @@ module PULLUP (...);      output O;  endmodule -module RAM128X1D (...); -    parameter [127:0] INIT = 128'h00000000000000000000000000000000; -    parameter [0:0] IS_WCLK_INVERTED = 1'b0; -    output DPO, SPO; -    input [6:0] A; -    input [6:0] DPRA; -    input D; -    input WCLK; -    input WE; -endmodule -  module RAM128X1S (...);      parameter [127:0] INIT = 128'h00000000000000000000000000000000;      parameter [0:0] IS_WCLK_INVERTED = 1'b0; @@ -3705,13 +3694,6 @@ module RAM32M (...);      input WE;  endmodule -module RAM32X1D (...); -    parameter [31:0] INIT = 32'h00000000; -    parameter [0:0] IS_WCLK_INVERTED = 1'b0; -    output DPO, SPO; -    input A0, A1, A2, A3, A4, D, DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, WCLK, WE; -endmodule -  module RAM32X1S (...);      parameter [31:0] INIT = 32'h00000000;      parameter [0:0] IS_WCLK_INVERTED = 1'b0; diff --git a/techlibs/xilinx/drams.txt b/techlibs/xilinx/drams.txt index e6635d0e2..2613c206c 100644 --- a/techlibs/xilinx/drams.txt +++ b/techlibs/xilinx/drams.txt @@ -1,4 +1,17 @@ +bram $__XILINX_RAM32X1D +  init 1 +  abits 5 +  dbits 1 +  groups 2 +  ports  1 1 +  wrmode 0 1 +  enable 0 1 +  transp 0 0 +  clocks 0 1 +  clkpol 0 2 +endbram +  bram $__XILINX_RAM64X1D    init 1    abits 6 @@ -25,12 +38,23 @@ bram $__XILINX_RAM128X1D    clkpol 0 2  endbram +match $__XILINX_RAM32X1D +  min bits 3 +  min wports 1 +  make_outreg +  or_next_if_better +endmatch +  match $__XILINX_RAM64X1D +  min bits 5 +  min wports 1    make_outreg    or_next_if_better  endmatch  match $__XILINX_RAM128X1D +  min bits 9 +  min wports 1    make_outreg  endmatch diff --git a/techlibs/xilinx/drams_map.v b/techlibs/xilinx/drams_map.v index 47476b592..77041ca86 100644 --- a/techlibs/xilinx/drams_map.v +++ b/techlibs/xilinx/drams_map.v @@ -1,4 +1,38 @@ +module \$__XILINX_RAM32X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN); +	parameter [31:0] INIT = 32'bx; +	parameter CLKPOL2 = 1; +	input CLK1; + +	input [4:0] A1ADDR; +	output A1DATA; + +	input [4:0] B1ADDR; +	input B1DATA; +	input B1EN; + +	RAM32X1D #( +		.INIT(INIT), +		.IS_WCLK_INVERTED(!CLKPOL2) +	) _TECHMAP_REPLACE_ ( +		.DPRA0(A1ADDR[0]), +		.DPRA1(A1ADDR[1]), +		.DPRA2(A1ADDR[2]), +		.DPRA3(A1ADDR[3]), +		.DPRA4(A1ADDR[4]), +		.DPO(A1DATA), + +		.A0(B1ADDR[0]), +		.A1(B1ADDR[1]), +		.A2(B1ADDR[2]), +		.A3(B1ADDR[3]), +		.A4(B1ADDR[4]), +		.D(B1DATA), +		.WCLK(CLK1), +		.WE(B1EN) +	); +endmodule +  module \$__XILINX_RAM64X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);  	parameter [63:0] INIT = 64'bx;  	parameter CLKPOL2 = 1; diff --git a/techlibs/xilinx/ff_map.v b/techlibs/xilinx/ff_map.v index c61fd7070..13beaa6ae 100644 --- a/techlibs/xilinx/ff_map.v +++ b/techlibs/xilinx/ff_map.v @@ -22,26 +22,21 @@  `ifndef _NO_FFS -`ifndef _NO_POS_SR  module  \$_DFF_N_   (input D, C, output Q);    FDRE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule  module  \$_DFF_P_   (input D, C, output Q);    FDRE   #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule  module  \$_DFFE_NP_ (input D, C, E, output Q); FDRE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E),    .R(1'b0)); endmodule  module  \$_DFFE_PP_ (input D, C, E, output Q); FDRE   #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E),    .R(1'b0)); endmodule +module  \$_DFF_NN0_ (input D, C, R, output Q); FDCE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(!R)); endmodule  module  \$_DFF_NP0_ (input D, C, R, output Q); FDCE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR( R)); endmodule +module  \$_DFF_PN0_ (input D, C, R, output Q); FDCE   #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(!R)); endmodule  module  \$_DFF_PP0_ (input D, C, R, output Q); FDCE   #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR( R)); endmodule +module  \$_DFF_NN1_ (input D, C, R, output Q); FDPE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(!R)); endmodule  module  \$_DFF_NP1_ (input D, C, R, output Q); FDPE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE( R)); endmodule +module  \$_DFF_PN1_ (input D, C, R, output Q); FDPE   #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(!R)); endmodule  module  \$_DFF_PP1_ (input D, C, R, output Q); FDPE   #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE( R)); endmodule -`endif - -module  \$_DFF_NN0_ (input D, C, R, output Q); \$_DFF_NP0_         _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C),              .R(~R)); endmodule -module  \$_DFF_PN0_ (input D, C, R, output Q); \$_DFF_PP0_         _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C),              .R(~R)); endmodule - -module  \$_DFF_NN1_ (input D, C, R, output Q); \$_DFF_NP1          _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C),              .R(~R)); endmodule -module  \$_DFF_PN1_ (input D, C, R, output Q); \$_DFF_PP1          _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C),              .R(~R)); endmodule -`endif  `endif diff --git a/techlibs/xilinx/synth_xilinx.cc b/techlibs/xilinx/synth_xilinx.cc index cc70823ef..27125d56c 100644 --- a/techlibs/xilinx/synth_xilinx.cc +++ b/techlibs/xilinx/synth_xilinx.cc @@ -25,18 +25,9 @@  USING_YOSYS_NAMESPACE  PRIVATE_NAMESPACE_BEGIN -bool check_label(bool &active, std::string run_from, std::string run_to, std::string label) +struct SynthXilinxPass : public ScriptPass  { -	if (label == run_from) -		active = true; -	if (label == run_to) -		active = false; -	return active; -} - -struct SynthXilinxPass : public Pass -{ -	SynthXilinxPass() : Pass("synth_xilinx", "synthesis for Xilinx FPGAs") { } +	SynthXilinxPass() : ScriptPass("synth_xilinx", "synthesis for Xilinx FPGAs") { }  	void help() YS_OVERRIDE  	{ @@ -51,6 +42,10 @@ struct SynthXilinxPass : public Pass  		log("    -top <module>\n");  		log("        use the specified module as top module\n");  		log("\n"); +		log("    -arch {xcup|xcu|xc7|xc6s}\n"); +		log("        run synthesis for the specified Xilinx architecture\n"); +		log("        default: xc7\n"); +		log("\n");  		log("    -edif <file>\n");  		log("        write the design to the specified edif file. writing of an output file\n");  		log("        is omitted if this parameter is not specified.\n"); @@ -73,10 +68,10 @@ struct SynthXilinxPass : public Pass  		log("        disable inference of shift registers\n");  		log("\n");  		log("    -nocarry\n"); -		log("        do not use XORCY/MUXCY cells in output netlist\n"); +		log("        do not use XORCY/MUXCY/CARRY4 cells in output netlist\n");  		log("\n"); -		log("    -nomux\n"); -		log("        do not use MUXF[78] muxes to implement LUTs larger than LUT6s\n"); +		log("    -nowidelut\n"); +		log("        do not use MUXF[78] resources to implement LUTs larger than LUT6s\n");  		log("\n");  		log("    -run <from_label>:<to_label>\n");  		log("        only run the commands between the labels (see below). an empty\n"); @@ -91,81 +86,33 @@ struct SynthXilinxPass : public Pass  		log("\n");  		log("\n");  		log("The following commands are executed by this synthesis command:\n"); -		log("\n"); -		log("    begin:\n"); -		log("        read_verilog -lib +/xilinx/cells_sim.v\n"); -		log("        read_verilog -lib +/xilinx/cells_xtra.v\n"); -		log("        read_verilog -lib +/xilinx/brams_bb.v\n"); -		log("        hierarchy -check -top <top>\n"); -		log("\n"); -		log("    flatten:     (only if -flatten)\n"); -		log("        proc\n"); -		log("        flatten\n"); -		log("\n"); -		log("    coarse:\n"); -		log("        synth -run coarse\n"); -		log("\n"); -		log("    bram: (only executed when '-nobram' is not given)\n"); -		log("        memory_bram -rules +/xilinx/brams.txt\n"); -		log("        techmap -map +/xilinx/brams_map.v\n"); -		log("\n"); -		log("    dram: (only executed when '-nodram' is not given)\n"); -		log("        memory_bram -rules +/xilinx/drams.txt\n"); -		log("        techmap -map +/xilinx/drams_map.v\n"); -		log("\n"); -		log("    fine:\n"); -		log("        opt -fast\n"); -		log("        memory_map\n"); -		log("        dffsr2dff\n"); -		log("        dff2dffe\n"); -		log("        techmap -map +/xilinx/arith_map.v\n"); -		log("        opt -fast\n"); -		log("\n"); -		log("    map_cells:\n"); -		log("        simplemap t:$dff t:$dffe (without '-nosrl' only)\n"); -		log("        pmux2shiftx (without '-nosrl' only)\n"); -		log("        opt_expr -mux_undef (without '-nosrl' only)\n"); -		log("        shregmap -tech xilinx -minlen 3 (without '-nosrl' only)\n"); -		log("        techmap -map +/xilinx/cells_map.v\n"); -		log("        clean\n"); -		log("\n"); -		log("    map_luts:\n"); -		log("        opt -full\n"); -		log("        techmap -map +/techmap.v -D _NO_POS_SR -map +/xilinx/ff_map.v\n"); -		log("        abc -luts 2:2,3,6:5,10,20 [-dff]\n"); -		log("        clean\n"); -		log("        shregmap -minlen 3 -init -params -enpol any_or_none (without '-nosrl' only)\n"); -		log("        techmap -map +/xilinx/lut_map.v -map +/xilinx/ff_map.v -map +/xilinx/cells_map.v"); -		log("        dffinit -ff FDRE   Q INIT -ff FDCE   Q INIT -ff FDPE   Q INIT -ff FDSE   Q INIT \\\n"); -		log("                -ff FDRE_1 Q INIT -ff FDCE_1 Q INIT -ff FDPE_1 Q INIT -ff FDSE_1 Q INIT\n"); -		log("        clean\n"); -		log("\n"); -		log("    check:\n"); -		log("        hierarchy -check\n"); -		log("        stat\n"); -		log("        check -noinit\n"); -		log("\n"); -		log("    edif:     (only if -edif)\n"); -		log("        write_edif <file-name>\n"); -		log("\n"); -		log("    blif:     (only if -blif)\n"); -		log("        write_blif <file-name>\n"); +		help_script();  		log("\n");  	} + +	std::string top_opt, edif_file, blif_file, arch; +	bool flatten, retime, vpr, nobram, nodram, nosrl, nocarry, nowidelut; + +	void clear_flags() YS_OVERRIDE +	{ +		top_opt = "-auto-top"; +		edif_file.clear(); +		blif_file.clear(); +		flatten = false; +		retime = false; +		vpr = false; +		nobram = false; +		nodram = false; +		nosrl = false; +		nocarry = false; +		nowidelut = false; +		arch = "xc7"; +	} +  	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE  	{ -		std::string top_opt = "-auto-top"; -		std::string edif_file; -		std::string blif_file;  		std::string run_from, run_to; -		bool flatten = false; -		bool retime = false; -		bool nocarry = false; -		bool nomux = false; -		bool vpr = false; -		bool nobram = false; -		bool nodram = false; -		bool nosrl = false; +		clear_flags();  		size_t argidx;  		for (argidx = 1; argidx < args.size(); argidx++) @@ -174,6 +121,10 @@ struct SynthXilinxPass : public Pass  				top_opt = "-top " + args[++argidx];  				continue;  			} +			if (args[argidx] == "-arch" && argidx+1 < args.size()) { +				arch = args[++argidx]; +				continue; +			}  			if (args[argidx] == "-edif" && argidx+1 < args.size()) {  				edif_file = args[++argidx];  				continue; @@ -226,133 +177,130 @@ struct SynthXilinxPass : public Pass  		}  		extra_args(args, argidx, design); +		if (arch != "xcup" && arch != "xcu" && arch != "xc7" && arch != "xc6s") +			log_cmd_error("Invalid Xilinx -arch setting: %s\n", arch.c_str()); +  		if (!design->full_selection())  			log_cmd_error("This command only operates on fully selected designs!\n"); -		bool active = run_from.empty(); -  		log_header(design, "Executing SYNTH_XILINX pass.\n");  		log_push(); -		if (check_label(active, run_from, run_to, "begin")) -		{ -			if (vpr) { -				Pass::call(design, "read_verilog -lib -D_EXPLICIT_CARRY +/xilinx/cells_sim.v"); -			} else { -				Pass::call(design, "read_verilog -lib +/xilinx/cells_sim.v"); -			} +		run_script(design, run_from, run_to); + +		log_pop(); +	} -			Pass::call(design, "read_verilog -lib +/xilinx/cells_xtra.v"); +	void script() YS_OVERRIDE +	{ +		if (check_label("begin")) { +			if (vpr) +				run("read_verilog -lib -D_EXPLICIT_CARRY +/xilinx/cells_sim.v"); +			else +				run("read_verilog -lib +/xilinx/cells_sim.v"); -			if (!nobram) { -				Pass::call(design, "read_verilog -lib +/xilinx/brams_bb.v"); -			} +			run("read_verilog -lib +/xilinx/cells_xtra.v"); -			Pass::call(design, stringf("hierarchy -check %s", top_opt.c_str())); -		} +			if (!nobram || help_mode) +				run("read_verilog -lib +/xilinx/brams_bb.v", "(skip if '-nobram')"); -		if (flatten && check_label(active, run_from, run_to, "flatten")) -		{ -			Pass::call(design, "proc"); -			Pass::call(design, "flatten"); +			run(stringf("hierarchy -check %s", top_opt.c_str()));  		} -		if (check_label(active, run_from, run_to, "coarse")) -		{ -			Pass::call(design, "synth -run coarse"); +		if (check_label("flatten", "(with '-flatten' only)")) { +			if (flatten || help_mode) { +				run("proc"); +				run("flatten"); +			}  		} -		if (check_label(active, run_from, run_to, "bram")) -		{ -			if (!nobram) { -				Pass::call(design, "memory_bram -rules +/xilinx/brams.txt"); -				Pass::call(design, "techmap -map +/xilinx/brams_map.v"); -			} +		if (check_label("coarse")) { +			run("synth -run coarse");  		} -		if (check_label(active, run_from, run_to, "dram")) -		{ -			if (!nodram) { -				Pass::call(design, "memory_bram -rules +/xilinx/drams.txt"); -				Pass::call(design, "techmap -map +/xilinx/drams_map.v"); +		if (check_label("bram", "(skip if '-nobram')")) { +			if (!nobram || help_mode) { +				run("memory_bram -rules +/xilinx/brams.txt"); +				run("techmap -map +/xilinx/brams_map.v");  			}  		} -		if (check_label(active, run_from, run_to, "fine")) -		{ -			Pass::call(design, "opt -fast"); -			Pass::call(design, "memory_map"); -			Pass::call(design, "dffsr2dff"); -			Pass::call(design, "dff2dffe"); -			if (!nocarry) { -				if (vpr) { -					Pass::call(design, "techmap -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY"); -				} else { -					Pass::call(design, "techmap -map +/xilinx/arith_map.v"); -				} +		if (check_label("dram", "(skip if '-nodram')")) { +			if (!nodram || help_mode) { +				run("memory_bram -rules +/xilinx/drams.txt"); +				run("techmap -map +/xilinx/drams_map.v");  			} -			Pass::call(design, "opt -fast");  		} -		if (check_label(active, run_from, run_to, "map_cells")) -		{ -			if (!nosrl) { +		if (check_label("fine")) { +			// shregmap -tech xilinx can cope with $shiftx and $mux +			//   cells for identifiying variable-length shift registers, +			//   so attempt to convert $pmux-es to the former +			if (!nosrl || help_mode) +				run("pmux2shiftx", "(skip if '-nosrl')"); + +			run("opt -fast -full"); +			run("memory_map"); +			run("dffsr2dff"); +			run("dff2dffe"); +			run("opt -full"); + +			if (!nosrl || help_mode) {  				// shregmap operates on bit-level flops, not word-level,  				//   so break those down here -				Pass::call(design, "simplemap t:$dff t:$dffe"); -				// shregmap -tech xilinx can cope with $shiftx and $mux -				//   cells for identifiying variable-length shift registers, -				//   so attempt to convert $pmux-es to the former -				Pass::call(design, "pmux2shiftx"); -				// pmux2shiftx can leave behind a $pmux with a single entry -				//   -- need this to clean that up before shregmap -				Pass::call(design, "opt_expr -mux_undef"); +				run("simplemap t:$dff t:$dffe", "(skip if '-nosrl')");  				// shregmap with '-tech xilinx' infers variable length shift regs -				Pass::call(design, "shregmap -tech xilinx -minlen 3"); +				run("shregmap -tech xilinx -minlen 3", "(skip if '-nosrl')");  			} -			Pass::call(design, "techmap -map +/xilinx/cells_map.v"); -			Pass::call(design, "clean"); +			if (help_mode) +				run("techmap -map +/techmap.v -map +/xilinx/arith_map.v", "(skip if '-nocarry')"); +			else if (!vpr) +				run("techmap -map +/techmap.v -map +/xilinx/arith_map.v"); +			else +				run("techmap -map +/techmap.v -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY"); + +			run("opt -fast");  		} -		if (check_label(active, run_from, run_to, "map_luts")) -		{ -			Pass::call(design, "opt -full"); -			Pass::call(design, "techmap -map +/techmap.v -D _NO_POS_SR -map +/xilinx/ff_map.v"); -			if (nomux) -				Pass::call(design, "abc -luts 2:2,3,6:5" + string(retime ? " -dff" : "")); +		if (check_label("map_cells")) { +			run("techmap -map +/techmap.v -map +/xilinx/cells_map.v"); +			run("clean"); +		} + +		if (check_label("map_luts")) { +			if (help_mode) +				run("abc -luts 2:2,3,6:5[,10,20] [-dff]", "(skip if 'nowidelut', only for '-retime')"); +			else if (nowidelut) +				run("abc -luts 2:2,3,6:5" + string(retime ? " -dff" : ""));  			else -				Pass::call(design, "abc -luts 2:2,3,6:5,10,20" + string(retime ? " -dff" : "")); -			Pass::call(design, "clean"); +				run("abc -luts 2:2,3,6:5,10,20" + string(retime ? " -dff" : "")); +			run("clean");  			// This shregmap call infers fixed length shift registers after abc  			//   has performed any necessary retiming -			if (!nosrl) -				Pass::call(design, "shregmap -minlen 3 -init -params -enpol any_or_none"); -			Pass::call(design, "techmap -map +/xilinx/lut_map.v -map +/xilinx/ff_map.v -map +/xilinx/cells_map.v"); -			Pass::call(design, "dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT -ff FDSE Q INIT " +			if (!nosrl || help_mode) +				run("shregmap -minlen 3 -init -params -enpol any_or_none", "(skip if '-nosrl')"); +			run("techmap -map +/xilinx/lut_map.v -map +/xilinx/ff_map.v -map +/xilinx/cells_map.v"); +			run("dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT -ff FDSE Q INIT "  					"-ff FDRE_1 Q INIT -ff FDCE_1 Q INIT -ff FDPE_1 Q INIT -ff FDSE_1 Q INIT"); -			Pass::call(design, "clean"); +			run("clean");  		} -		if (check_label(active, run_from, run_to, "check")) -		{ -			Pass::call(design, "hierarchy -check"); -			Pass::call(design, "stat"); -			Pass::call(design, "check -noinit"); +		if (check_label("check")) { +			run("hierarchy -check"); +			run("stat -tech xilinx"); +			run("check -noinit");  		} -		if (check_label(active, run_from, run_to, "edif")) -		{ -			if (!edif_file.empty()) -				Pass::call(design, stringf("write_edif -pvector bra %s", edif_file.c_str())); -		} -		if (check_label(active, run_from, run_to, "blif")) -		{ -			if (!blif_file.empty()) -				Pass::call(design, stringf("write_blif %s", edif_file.c_str())); +		if (check_label("edif")) { +			if (!edif_file.empty() || help_mode) +				run(stringf("write_edif -pvector bra %s", edif_file.c_str()));  		} -		log_pop(); +		if (check_label("blif")) { +			if (!blif_file.empty() || help_mode) +				run(stringf("write_blif %s", edif_file.c_str())); +		}  	}  } SynthXilinxPass; | 
