diff options
| author | Marcin Kościelnicki <koriakin@0x04.net> | 2019-08-13 00:35:54 +0000 | 
|---|---|---|
| committer | Marcin Kościelnicki <koriakin@0x04.net> | 2019-08-13 00:35:54 +0000 | 
| commit | c6d5b97b98e6edc395ee14ad60430f7ebc264f01 (patch) | |
| tree | 7cb2ac35a3c3fbe50b080a65761745773646c505 | |
| parent | f4c62f33ac56bc5725c44ad822e75d2387f98061 (diff) | |
| download | yosys-c6d5b97b98e6edc395ee14ad60430f7ebc264f01.tar.gz yosys-c6d5b97b98e6edc395ee14ad60430f7ebc264f01.tar.bz2 yosys-c6d5b97b98e6edc395ee14ad60430f7ebc264f01.zip | |
review fixes
| -rw-r--r-- | CHANGELOG | 3 | ||||
| -rw-r--r-- | passes/techmap/clkbufmap.cc | 18 | ||||
| -rw-r--r-- | passes/techmap/iopadmap.cc | 15 | ||||
| -rw-r--r-- | techlibs/xilinx/synth_xilinx.cc | 45 | 
4 files changed, 34 insertions, 47 deletions
| @@ -19,6 +19,9 @@ Yosys 0.9 .. Yosys 0.9-dev      - Added automatic gzip compression (based on filename extension) for backends      - Improve attribute and parameter encoding in JSON to avoid ambiguities between        bit vectors and strings containing [01xz]* +    - Added "clkbufmap" pass +    - Added "synth_xilinx -ise" for Spartan 6 (experimental) +    - "synth_xilinx" now automatically inserts clock buffers  Yosys 0.8 .. Yosys 0.8-dev  -------------------------- diff --git a/passes/techmap/clkbufmap.cc b/passes/techmap/clkbufmap.cc index 9ecc83071..a2d10c48b 100644 --- a/passes/techmap/clkbufmap.cc +++ b/passes/techmap/clkbufmap.cc @@ -2,6 +2,7 @@   *  yosys -- Yosys Open SYnthesis Suite   *   *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at> + *  Copyright (C) 2019  Marcin Kościelnicki <mwk@0x04.net>   *   *  Permission to use, copy, modify, and/or distribute this software for any   *  purpose with or without fee is hereby granted, provided that the above @@ -32,19 +33,6 @@ void split_portname_pair(std::string &port1, std::string &port2)  	}  } -std::vector<std::string> split(std::string text, const char *delim) -{ -	std::vector<std::string> list; -	char *p = strdup(text.c_str()); -	char *t = strtok(p, delim); -	while (t != NULL) { -		list.push_back(t); -		t = strtok(NULL, delim); -	} -	free(p); -	return list; -} -  struct ClkbufmapPass : public Pass {  	ClkbufmapPass() : Pass("clkbufmap", "insert global buffers on clock networks") { }  	void help() YS_OVERRIDE @@ -127,7 +115,7 @@ struct ClkbufmapPass : public Pass {  				auto it = module->attributes.find("\\clkbuf_driver");  				if (it != module->attributes.end()) {  					auto value = it->second.decode_string(); -					for (auto name : split(value, ",")) { +					for (auto name : split_tokens(value, ",")) {  						auto wire = module->wire(RTLIL::escape_id(name));  						if (!wire)  							log_error("Module %s does not have port %s.\n", log_id(module), log_id(name)); @@ -138,7 +126,7 @@ struct ClkbufmapPass : public Pass {  				it = module->attributes.find("\\clkbuf_sink");  				if (it != module->attributes.end()) {  					auto value = it->second.decode_string(); -					for (auto name : split(value, ",")) { +					for (auto name : split_tokens(value, ",")) {  						auto wire = module->wire(RTLIL::escape_id(name));  						if (!wire)  							log_error("Module %s does not have port %s.\n", log_id(module), log_id(name)); diff --git a/passes/techmap/iopadmap.cc b/passes/techmap/iopadmap.cc index e3d68ab0c..0fcb6b2ec 100644 --- a/passes/techmap/iopadmap.cc +++ b/passes/techmap/iopadmap.cc @@ -32,19 +32,6 @@ void split_portname_pair(std::string &port1, std::string &port2)  	}  } -std::vector<std::string> split(std::string text, const char *delim) -{ -	std::vector<std::string> list; -	char *p = strdup(text.c_str()); -	char *t = strtok(p, delim); -	while (t != NULL) { -		list.push_back(t); -		t = strtok(NULL, delim); -	} -	free(p); -	return list; -} -  struct IopadmapPass : public Pass {  	IopadmapPass() : Pass("iopadmap", "technology mapping of i/o pads (or buffers)") { }  	void help() YS_OVERRIDE @@ -190,7 +177,7 @@ struct IopadmapPass : public Pass {  			auto it = module->attributes.find("\\iopad_external_pin");  			if (it != module->attributes.end()) {  				auto value = it->second.decode_string(); -				for (auto name : split(value, ",")) { +				for (auto name : split_tokens(value, ",")) {  					ignore.insert(make_pair(module->name, RTLIL::escape_id(name)));  				}  			} diff --git a/techlibs/xilinx/synth_xilinx.cc b/techlibs/xilinx/synth_xilinx.cc index a7362d26b..e9e8dbfea 100644 --- a/techlibs/xilinx/synth_xilinx.cc +++ b/techlibs/xilinx/synth_xilinx.cc @@ -81,12 +81,15 @@ struct SynthXilinxPass : public ScriptPass  		log("    -nowidelut\n");  		log("        do not use MUXF[78] resources to implement LUTs larger than LUT6s\n");  		log("\n"); -		log("    -iopads\n"); -		log("        perform I/O buffer insertion (selected automatically by -ise)\n"); +		log("    -iopad\n"); +		log("        enable I/O buffer insertion (selected automatically by -ise)\n");  		log("\n"); -		log("    -noiopads\n"); +		log("    -noiopad\n");  		log("        disable I/O buffer insertion (only useful with -ise)\n");  		log("\n"); +		log("    -noclkbuf\n"); +		log("        disable automatic clock buffer insertion\n"); +		log("\n");  		log("    -widemux <int>\n");  		log("        enable inference of hard multiplexer resources (MUXF[78]) for muxes at or\n");  		log("        above this number of inputs (minimum value 2, recommended value >= 5).\n"); @@ -113,7 +116,7 @@ struct SynthXilinxPass : public ScriptPass  	}  	std::string top_opt, edif_file, blif_file, family; -	bool flatten, retime, vpr, ise, iopads, noiopads, nobram, nodram, nosrl, nocarry, nowidelut, abc9; +	bool flatten, retime, vpr, ise, iopad, noiopad, noclkbuf, nobram, nodram, nosrl, nocarry, nowidelut, abc9;  	int widemux;  	void clear_flags() YS_OVERRIDE @@ -126,8 +129,9 @@ struct SynthXilinxPass : public ScriptPass  		retime = false;  		vpr = false;  		ise = false; -		iopads = false; -		noiopads = false; +		iopad = false; +		noiopad = false; +		noclkbuf = false;  		nocarry = false;  		nobram = false;  		nodram = false; @@ -194,12 +198,16 @@ struct SynthXilinxPass : public ScriptPass  				ise = true;  				continue;  			} -			if (args[argidx] == "-iopads") { -				iopads = true; +			if (args[argidx] == "-iopad") { +				iopad = true; +				continue; +			} +			if (args[argidx] == "-noiopad") { +				noiopad = true;  				continue;  			} -			if (args[argidx] == "-noiopads") { -				noiopads = true; +			if (args[argidx] == "-noclkbuf") { +				noclkbuf = true;  				continue;  			}  			if (args[argidx] == "-nocarry") { @@ -435,14 +443,15 @@ struct SynthXilinxPass : public ScriptPass  		}  		if (check_label("finalize")) { -			bool do_iopads = iopads || (ise && !noiopads); -			if (help_mode || do_iopads) -				run("clkbufmap -buf BUFG O:I -inpad IBUFG O:I", "(-inpad passed if '-iopads' or '-ise' and not '-noiopads')"); -			else -				run("clkbufmap -buf BUFG O:I"); - -			if (do_iopads) -				run("iopadmap -bits -outpad OBUF I:O -inpad IBUF O:I A:top", "(only if '-iopads' or '-ise' and not '-noiopads')"); +			bool do_iopad = iopad || (ise && !noiopad); +			if (help_mode || !noclkbuf) { +				if (help_mode || do_iopad) +					run("clkbufmap -buf BUFG O:I -inpad IBUFG O:I", "(skip if '-noclkbuf', '-inpad' passed if '-iopad' or '-ise' and not '-noiopad')"); +				else +					run("clkbufmap -buf BUFG O:I"); +			} +			if (do_iopad) +				run("iopadmap -bits -outpad OBUF I:O -inpad IBUF O:I A:top", "(only if '-iopad' or '-ise' and not '-noiopad')");  		}  		if (check_label("check")) { | 
