28 bool check_label(
bool &active, std::string run_from, std::string run_to, std::string label)
30 if (label == run_from)
43 log(
" synth_xilinx [options]\n");
45 log(
"This command runs synthesis for Xilinx FPGAs. This command does not operate on\n");
46 log(
"partly selected designs.\n");
48 log(
" -top <module>\n");
49 log(
" use the specified module as top module (default='top')\n");
51 log(
" -arch <arch>\n");
52 log(
" select architecture. the following architectures are supported:\n");
53 log(
" spartan6 (default), artix7, kintex7, virtex7, zynq7000\n");
54 log(
" (this parameter is not used by the command at the moment)\n");
56 log(
" -edif <file>\n");
57 log(
" write the design to the specified edif file. writing of an output file\n");
58 log(
" is omitted if this parameter is not specified.\n");
60 log(
" -run <from_label>:<to_label>\n");
61 log(
" only run the commands between the labels (see below). an empty\n");
62 log(
" from label is synonymous to 'begin', and empty to label is\n");
63 log(
" synonymous to the end of the command list.\n");
66 log(
"The following commands are executed by this synthesis command:\n");
69 log(
" hierarchy -check -top <top>\n");
88 log(
" techmap -share_map xilinx/cells.v\n");
92 log(
" select -set xilinx_clocks <top>/t:FDRE %%x:+FDRE[C] <top>/t:FDRE %%d\n");
93 log(
" iopadmap -inpad BUFGP O:I @xilinx_clocks\n");
96 log(
" select -set xilinx_nonclocks <top>/w:* <top>/t:BUFGP %%x:+BUFGP[I] %%d\n");
97 log(
" iopadmap -outpad OBUF I:O -inpad IBUF O:I @xilinx_nonclocks\n");
100 log(
" write_edif synth.edif\n");
105 std::string top_module =
"top";
106 std::string arch_name =
"spartan6";
107 std::string edif_file;
108 std::string run_from, run_to;
111 for (argidx = 1; argidx < args.size(); argidx++)
113 if (args[argidx] ==
"-top" && argidx+1 < args.size()) {
114 top_module = args[++argidx];
117 if (args[argidx] ==
"-arch" && argidx+1 < args.size()) {
118 arch_name = args[++argidx];
121 if (args[argidx] ==
"-edif" && argidx+1 < args.size()) {
122 edif_file = args[++argidx];
125 if (args[argidx] ==
"-run" && argidx+1 < args.size()) {
126 size_t pos = args[argidx+1].find(
':');
127 if (pos == std::string::npos)
129 run_from = args[++argidx].substr(0, pos);
130 run_to = args[argidx].substr(pos+1);
138 log_cmd_error(
"This comannd only operates on fully selected designs!\n");
140 if (arch_name ==
"spartan6") {
143 if (arch_name ==
"artix7") {
146 if (arch_name ==
"kintex7") {
149 if (arch_name ==
"zynq7000") {
152 log_cmd_error(
"Architecture '%s' is not supported!\n", arch_name.c_str());
154 bool active = run_from.empty();
159 if (
check_label(active, run_from, run_to,
"begin"))
164 if (
check_label(active, run_from, run_to,
"coarse"))
180 if (
check_label(active, run_from, run_to,
"map_luts"))
186 if (
check_label(active, run_from, run_to,
"map_cells"))
188 Pass::call(design,
"techmap -share_map xilinx/cells.v");
192 if (
check_label(active, run_from, run_to,
"clkbuf"))
194 Pass::call(design,
stringf(
"select -set xilinx_clocks %s/t:FDRE %%x:+FDRE[C] %s/t:FDRE %%d", top_module.c_str(), top_module.c_str()));
195 Pass::call(design,
"iopadmap -inpad BUFGP O:I @xilinx_clocks");
198 if (
check_label(active, run_from, run_to,
"iobuf"))
200 Pass::call(design,
stringf(
"select -set xilinx_nonclocks %s/w:* %s/t:BUFGP %%x:+BUFGP[I] %%d", top_module.c_str(), top_module.c_str()));
201 Pass::call(design,
"iopadmap -outpad OBUF I:O -inpad IBUF O:I @xilinx_nonclocks");
206 if (!edif_file.empty())
std::string stringf(const char *fmt,...)
USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN bool check_label(bool &active, std::string run_from, std::string run_to, std::string label)
void log_header(const char *format,...)
SynthXilinxPass SynthXilinxPass
bool full_selection() const
#define PRIVATE_NAMESPACE_BEGIN
#define PRIVATE_NAMESPACE_END
void log_cmd_error(const char *format,...)
#define USING_YOSYS_NAMESPACE
void log(const char *format,...)
void extra_args(std::vector< std::string > args, size_t argidx, RTLIL::Design *design, bool select=true)
static void call(RTLIL::Design *design, std::string command)
virtual void execute(std::vector< std::string > args, RTLIL::Design *design)