yosys-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
hierarchy.cc
Go to the documentation of this file.
1 /*
2  * yosys -- Yosys Open SYnthesis Suite
3  *
4  * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  */
19 
20 #include "kernel/yosys.h"
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <set>
24 
25 #ifndef _WIN32
26 # include <unistd.h>
27 #endif
28 
29 
32 
34  bool input, output;
36  int index;
37 };
38 
39 void generate(RTLIL::Design *design, const std::vector<std::string> &celltypes, const std::vector<generate_port_decl_t> &portdecls)
40 {
41  std::set<RTLIL::IdString> found_celltypes;
42 
43  for (auto i1 : design->modules_)
44  for (auto i2 : i1.second->cells_)
45  {
46  RTLIL::Cell *cell = i2.second;
47  if (design->has(cell->type))
48  continue;
49  if (cell->type.substr(0, 1) == "$" && cell->type.substr(0, 3) != "$__")
50  continue;
51  for (auto &pattern : celltypes)
52  if (patmatch(pattern.c_str(), RTLIL::unescape_id(cell->type).c_str()))
53  found_celltypes.insert(cell->type);
54  }
55 
56  for (auto &celltype : found_celltypes)
57  {
58  std::set<RTLIL::IdString> portnames;
59  std::set<RTLIL::IdString> parameters;
60  std::map<RTLIL::IdString, int> portwidths;
61  log("Generate module for cell type %s:\n", celltype.c_str());
62 
63  for (auto i1 : design->modules_)
64  for (auto i2 : i1.second->cells_)
65  if (i2.second->type == celltype) {
66  for (auto &conn : i2.second->connections()) {
67  if (conn.first[0] != '$')
68  portnames.insert(conn.first);
69  portwidths[conn.first] = std::max(portwidths[conn.first], conn.second.size());
70  }
71  for (auto &para : i2.second->parameters)
72  parameters.insert(para.first);
73  }
74 
75  for (auto &decl : portdecls)
76  if (decl.index > 0)
77  portnames.insert(decl.portname);
78 
79  std::set<int> indices;
80  for (int i = 0; i < int(portnames.size()); i++)
81  indices.insert(i+1);
82 
83  std::vector<generate_port_decl_t> ports(portnames.size());
84 
85  for (auto &decl : portdecls)
86  if (decl.index > 0) {
87  portwidths[decl.portname] = std::max(portwidths[decl.portname], 1);
88  portwidths[decl.portname] = std::max(portwidths[decl.portname], portwidths[stringf("$%d", decl.index)]);
89  log(" port %d: %s [%d:0] %s\n", decl.index, decl.input ? decl.output ? "inout" : "input" : "output", portwidths[decl.portname]-1, RTLIL::id2cstr(decl.portname));
90  if (indices.count(decl.index) > ports.size())
91  log_error("Port index (%d) exceeds number of found ports (%d).\n", decl.index, int(ports.size()));
92  if (indices.count(decl.index) == 0)
93  log_error("Conflict on port index %d.\n", decl.index);
94  indices.erase(decl.index);
95  portnames.erase(decl.portname);
96  ports[decl.index-1] = decl;
97  }
98 
99  while (portnames.size() > 0) {
100  RTLIL::IdString portname = *portnames.begin();
101  for (auto &decl : portdecls)
102  if (decl.index == 0 && patmatch(decl.portname.c_str(), RTLIL::unescape_id(portname).c_str())) {
103  generate_port_decl_t d = decl;
104  d.portname = portname;
105  d.index = *indices.begin();
106  log_assert(!indices.empty());
107  indices.erase(d.index);
108  ports[d.index-1] = d;
109  portwidths[d.portname] = std::max(portwidths[d.portname], 1);
110  log(" port %d: %s [%d:0] %s\n", d.index, d.input ? d.output ? "inout" : "input" : "output", portwidths[d.portname]-1, RTLIL::id2cstr(d.portname));
111  goto found_matching_decl;
112  }
113  log_error("Can't match port %s.\n", RTLIL::id2cstr(portname));
114  found_matching_decl:;
115  portnames.erase(portname);
116  }
117 
118  log_assert(indices.empty());
119 
120  RTLIL::Module *mod = new RTLIL::Module;
121  mod->name = celltype;
122  mod->attributes["\\blackbox"] = RTLIL::Const(1);
123  design->add(mod);
124 
125  for (auto &decl : ports) {
126  RTLIL::Wire *wire = mod->addWire(decl.portname, portwidths.at(decl.portname));
127  wire->port_id = decl.index;
128  wire->port_input = decl.input;
129  wire->port_output = decl.output;
130  }
131 
132  mod->fixup_ports();
133 
134  for (auto &para : parameters)
135  log(" ignoring parameter %s.\n", RTLIL::id2cstr(para));
136 
137  log(" module %s created.\n", RTLIL::id2cstr(mod->name));
138  }
139 }
140 
141 bool expand_module(RTLIL::Design *design, RTLIL::Module *module, bool flag_check, std::vector<std::string> &libdirs)
142 {
143  bool did_something = false;
144  std::map<RTLIL::Cell*, std::pair<int, int>> array_cells;
145  std::string filename;
146 
147  for (auto &cell_it : module->cells_)
148  {
149  RTLIL::Cell *cell = cell_it.second;
150 
151  if (cell->type.substr(0, 7) == "$array:") {
152  int pos_idx = cell->type.str().find_first_of(':');
153  int pos_num = cell->type.str().find_first_of(':', pos_idx + 1);
154  int pos_type = cell->type.str().find_first_of(':', pos_num + 1);
155  int idx = atoi(cell->type.str().substr(pos_idx + 1, pos_num).c_str());
156  int num = atoi(cell->type.str().substr(pos_num + 1, pos_type).c_str());
157  array_cells[cell] = std::pair<int, int>(idx, num);
158  cell->type = cell->type.str().substr(pos_type + 1);
159  }
160 
161  if (design->modules_.count(cell->type) == 0)
162  {
163  if (design->modules_.count("$abstract" + cell->type.str()))
164  {
165  cell->type = design->modules_.at("$abstract" + cell->type.str())->derive(design, cell->parameters);
166  cell->parameters.clear();
167  did_something = true;
168  continue;
169  }
170 
171  if (cell->type[0] == '$')
172  continue;
173 
174  for (auto &dir : libdirs)
175  {
176  filename = dir + "/" + RTLIL::unescape_id(cell->type) + ".v";
177  if (check_file_exists(filename)) {
178  std::vector<std::string> args;
179  args.push_back(filename);
180  Frontend::frontend_call(design, NULL, filename, "verilog");
181  goto loaded_module;
182  }
183 
184  filename = dir + "/" + RTLIL::unescape_id(cell->type) + ".il";
185  if (check_file_exists(filename)) {
186  std::vector<std::string> args;
187  args.push_back(filename);
188  Frontend::frontend_call(design, NULL, filename, "ilang");
189  goto loaded_module;
190  }
191  }
192 
193  if (flag_check && cell->type[0] != '$')
194  log_error("Module `%s' referenced in module `%s' in cell `%s' is not part of the design.\n",
195  cell->type.c_str(), module->name.c_str(), cell->name.c_str());
196  continue;
197 
198  loaded_module:
199  if (design->modules_.count(cell->type) == 0)
200  log_error("File `%s' from libdir does not declare module `%s'.\n", filename.c_str(), cell->type.c_str());
201  did_something = true;
202  }
203 
204  if (cell->parameters.size() == 0)
205  continue;
206 
207  if (design->modules_.at(cell->type)->get_bool_attribute("\\blackbox"))
208  continue;
209 
210  RTLIL::Module *mod = design->modules_[cell->type];
211  cell->type = mod->derive(design, cell->parameters);
212  cell->parameters.clear();
213  did_something = true;
214  }
215 
216  for (auto &it : array_cells)
217  {
218  RTLIL::Cell *cell = it.first;
219  int idx = it.second.first, num = it.second.second;
220 
221  if (design->modules_.count(cell->type) == 0)
222  log_error("Array cell `%s.%s' of unknown type `%s'.\n", RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(cell->type));
223 
224  RTLIL::Module *mod = design->modules_[cell->type];
225 
226  for (auto &conn : cell->connections_) {
227  int conn_size = conn.second.size();
228  RTLIL::IdString portname = conn.first;
229  if (portname.substr(0, 1) == "$") {
230  int port_id = atoi(portname.substr(1).c_str());
231  for (auto &wire_it : mod->wires_)
232  if (wire_it.second->port_id == port_id) {
233  portname = wire_it.first;
234  break;
235  }
236  }
237  if (mod->wires_.count(portname) == 0)
238  log_error("Array cell `%s.%s' connects to unknown port `%s'.\n", RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(conn.first));
239  int port_size = mod->wires_.at(portname)->width;
240  if (conn_size == port_size)
241  continue;
242  if (conn_size != port_size*num)
243  log_error("Array cell `%s.%s' has invalid port vs. signal size for port `%s'.\n", RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(conn.first));
244  conn.second = conn.second.extract(port_size*idx, port_size);
245  }
246  }
247 
248  return did_something;
249 }
250 
251 void hierarchy_worker(RTLIL::Design *design, std::set<RTLIL::Module*> &used, RTLIL::Module *mod, int indent)
252 {
253  if (used.count(mod) > 0)
254  return;
255 
256  if (indent == 0)
257  log("Top module: %s\n", mod->name.c_str());
258  else
259  log("Used module: %*s%s\n", indent, "", mod->name.c_str());
260  used.insert(mod);
261 
262  for (auto cell : mod->cells()) {
263  std::string celltype = cell->type.str();
264  if (celltype.substr(0, 7) == "$array:") {
265  int pos_idx = celltype.find_first_of(':');
266  int pos_num = celltype.find_first_of(':', pos_idx + 1);
267  int pos_type = celltype.find_first_of(':', pos_num + 1);
268  celltype = celltype.substr(pos_type + 1);
269  }
270  if (design->module(celltype))
271  hierarchy_worker(design, used, design->module(celltype), indent+4);
272  }
273 }
274 
275 void hierarchy(RTLIL::Design *design, RTLIL::Module *top, bool purge_lib, bool first_pass)
276 {
277  std::set<RTLIL::Module*> used;
278  hierarchy_worker(design, used, top, 0);
279 
280  std::vector<RTLIL::Module*> del_modules;
281  for (auto &it : design->modules_)
282  if (used.count(it.second) == 0)
283  del_modules.push_back(it.second);
284 
285  for (auto mod : del_modules) {
286  if (first_pass && mod->name.substr(0, 9) == "$abstract")
287  continue;
288  if (!purge_lib && mod->get_bool_attribute("\\blackbox"))
289  continue;
290  log("Removing unused module `%s'.\n", mod->name.c_str());
291  design->modules_.erase(mod->name);
292  delete mod;
293  }
294 
295  log("Removed %d unused modules.\n", GetSize(del_modules));
296 }
297 
298 bool set_keep_assert(std::map<RTLIL::Module*, bool> &cache, RTLIL::Module *mod)
299 {
300  if (cache.count(mod) == 0)
301  for (auto c : mod->cells()) {
302  RTLIL::Module *m = mod->design->module(c->type);
303  if ((m != nullptr && set_keep_assert(cache, m)) || c->type == "$assert")
304  return cache[mod] = true;
305  }
306  return cache[mod];
307 }
308 
309 struct HierarchyPass : public Pass {
310  HierarchyPass() : Pass("hierarchy", "check, expand and clean up design hierarchy") { }
311  virtual void help()
312  {
313  // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
314  log("\n");
315  log(" hierarchy [-check] [-top <module>]\n");
316  log(" hierarchy -generate <cell-types> <port-decls>\n");
317  log("\n");
318  log("In parametric designs, a module might exists in several variations with\n");
319  log("different parameter values. This pass looks at all modules in the current\n");
320  log("design an re-runs the language frontends for the parametric modules as\n");
321  log("needed.\n");
322  log("\n");
323  log(" -check\n");
324  log(" also check the design hierarchy. this generates an error when\n");
325  log(" an unknown module is used as cell type.\n");
326  log("\n");
327  log(" -purge_lib\n");
328  log(" by default the hierarchy command will not remove library (blackbox)\n");
329  log(" module. use this options to also remove unused blackbox modules.\n");
330  log("\n");
331  log(" -libdir <directory>\n");
332  log(" search for files named <module_name>.v in the specified directory\n");
333  log(" for unknown modules and automatically run read_verilog for each\n");
334  log(" unknown module.\n");
335  log("\n");
336  log(" -keep_positionals\n");
337  log(" per default this pass also converts positional arguments in cells\n");
338  log(" to arguments using port names. this option disables this behavior.\n");
339  log("\n");
340  log(" -nokeep_asserts\n");
341  log(" per default this pass sets the \"keep\" attribute on all modules\n");
342  log(" that directly or indirectly contain one or more $assert cells. this\n");
343  log(" option disables this behavior.\n");
344  log("\n");
345  log(" -top <module>\n");
346  log(" use the specified top module to built a design hierarchy. modules\n");
347  log(" outside this tree (unused modules) are removed.\n");
348  log("\n");
349  log(" when the -top option is used, the 'top' attribute will be set on the\n");
350  log(" specified top module. otherwise a module with the 'top' attribute set\n");
351  log(" will implicitly be used as top module, if such a module exists.\n");
352  log("\n");
353  log("In -generate mode this pass generates blackbox modules for the given cell\n");
354  log("types (wildcards supported). For this the design is searched for cells that\n");
355  log("match the given types and then the given port declarations are used to\n");
356  log("determine the direction of the ports. The syntax for a port declaration is:\n");
357  log("\n");
358  log(" {i|o|io}[@<num>]:<portname>\n");
359  log("\n");
360  log("Input ports are specified with the 'i' prefix, output ports with the 'o'\n");
361  log("prefix and inout ports with the 'io' prefix. The optional <num> specifies\n");
362  log("the position of the port in the parameter list (needed when instanciated\n");
363  log("using positional arguments). When <num> is not specified, the <portname> can\n");
364  log("also contain wildcard characters.\n");
365  log("\n");
366  log("This pass ignores the current selection and always operates on all modules\n");
367  log("in the current design.\n");
368  log("\n");
369  }
370  virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
371  {
372  log_header("Executing HIERARCHY pass (managing design hierarchy).\n");
373 
374  bool flag_check = false;
375  bool purge_lib = false;
376  RTLIL::Module *top_mod = NULL;
377  std::vector<std::string> libdirs;
378 
379  bool generate_mode = false;
380  bool keep_positionals = false;
381  bool nokeep_asserts = false;
382  std::vector<std::string> generate_cells;
383  std::vector<generate_port_decl_t> generate_ports;
384 
385  size_t argidx;
386  for (argidx = 1; argidx < args.size(); argidx++)
387  {
388  if (args[argidx] == "-generate" && !flag_check && !top_mod) {
389  generate_mode = true;
390  log("Entering generate mode.\n");
391  while (++argidx < args.size()) {
392  const char *p = args[argidx].c_str();
394  if (p[0] == 'i' && p[1] == 'o')
395  decl.input = true, decl.output = true, p += 2;
396  else if (*p == 'i')
397  decl.input = true, decl.output = false, p++;
398  else if (*p == 'o')
399  decl.input = false, decl.output = true, p++;
400  else
401  goto is_celltype;
402  if (*p == '@') {
403  char *endptr;
404  decl.index = strtol(++p, &endptr, 10);
405  if (decl.index < 1)
406  goto is_celltype;
407  p = endptr;
408  } else
409  decl.index = 0;
410  if (*(p++) != ':')
411  goto is_celltype;
412  if (*p == 0)
413  goto is_celltype;
414  decl.portname = p;
415  log("Port declaration: %s", decl.input ? decl.output ? "inout" : "input" : "output");
416  if (decl.index >= 1)
417  log(" [at position %d]", decl.index);
418  log(" %s\n", decl.portname.c_str());
419  generate_ports.push_back(decl);
420  continue;
421  is_celltype:
422  log("Celltype: %s\n", args[argidx].c_str());
423  generate_cells.push_back(RTLIL::unescape_id(args[argidx]));
424  }
425  continue;
426  }
427  if (args[argidx] == "-check") {
428  flag_check = true;
429  continue;
430  }
431  if (args[argidx] == "-purge_lib") {
432  purge_lib = true;
433  continue;
434  }
435  if (args[argidx] == "-keep_positionals") {
436  keep_positionals = true;
437  continue;
438  }
439  if (args[argidx] == "-nokeep_asserts") {
440  nokeep_asserts = true;
441  continue;
442  }
443  if (args[argidx] == "-libdir" && argidx+1 < args.size()) {
444  libdirs.push_back(args[++argidx]);
445  continue;
446  }
447  if (args[argidx] == "-top") {
448  if (++argidx >= args.size())
449  log_cmd_error("Option -top requires an additional argument!\n");
450  top_mod = design->modules_.count(RTLIL::escape_id(args[argidx])) ? design->modules_.at(RTLIL::escape_id(args[argidx])) : NULL;
451  if (top_mod == NULL && design->modules_.count("$abstract" + RTLIL::escape_id(args[argidx]))) {
452  std::map<RTLIL::IdString, RTLIL::Const> empty_parameters;
453  design->modules_.at("$abstract" + RTLIL::escape_id(args[argidx]))->derive(design, empty_parameters);
454  top_mod = design->modules_.count(RTLIL::escape_id(args[argidx])) ? design->modules_.at(RTLIL::escape_id(args[argidx])) : NULL;
455  }
456  if (top_mod == NULL)
457  log_cmd_error("Module `%s' not found!\n", args[argidx].c_str());
458  continue;
459  }
460  break;
461  }
462  extra_args(args, argidx, design, false);
463 
464  if (generate_mode) {
465  generate(design, generate_cells, generate_ports);
466  return;
467  }
468 
469  log_push();
470 
471  if (top_mod == NULL)
472  for (auto &mod_it : design->modules_)
473  if (mod_it.second->get_bool_attribute("\\top"))
474  top_mod = mod_it.second;
475 
476  if (top_mod != NULL)
477  hierarchy(design, top_mod, purge_lib, true);
478 
479  bool did_something = true;
480  bool did_something_once = false;
481  while (did_something) {
482  did_something = false;
483  std::vector<RTLIL::IdString> modnames;
484  modnames.reserve(design->modules_.size());
485  for (auto &mod_it : design->modules_)
486  modnames.push_back(mod_it.first);
487  for (auto &modname : modnames) {
488  if (design->modules_.count(modname) == 0)
489  continue;
490  if (expand_module(design, design->modules_[modname], flag_check, libdirs))
491  did_something = true;
492  }
493  if (did_something)
494  did_something_once = true;
495  }
496 
497  if (top_mod != NULL && did_something_once) {
498  log_header("Re-running hierarchy analysis..\n");
499  hierarchy(design, top_mod, purge_lib, false);
500  }
501 
502  if (top_mod != NULL) {
503  for (auto &mod_it : design->modules_)
504  if (mod_it.second == top_mod)
505  mod_it.second->attributes["\\top"] = RTLIL::Const(1);
506  else
507  mod_it.second->attributes.erase("\\top");
508  }
509 
510  if (!nokeep_asserts) {
511  std::map<RTLIL::Module*, bool> cache;
512  for (auto mod : design->modules())
513  if (set_keep_assert(cache, mod)) {
514  log("Module %s directly or indirectly contains $assert cells -> setting \"keep\" attribute.\n", log_id(mod));
515  mod->set_bool_attribute("\\keep");
516  }
517  }
518 
519  if (!keep_positionals)
520  {
521  std::set<RTLIL::Module*> pos_mods;
522  std::map<std::pair<RTLIL::Module*,int>, RTLIL::IdString> pos_map;
523  std::vector<std::pair<RTLIL::Module*,RTLIL::Cell*>> pos_work;
524 
525  for (auto &mod_it : design->modules_)
526  for (auto &cell_it : mod_it.second->cells_) {
527  RTLIL::Cell *cell = cell_it.second;
528  if (design->modules_.count(cell->type) == 0)
529  continue;
530  for (auto &conn : cell->connections())
531  if (conn.first[0] == '$' && '0' <= conn.first[1] && conn.first[1] <= '9') {
532  pos_mods.insert(design->modules_.at(cell->type));
533  pos_work.push_back(std::pair<RTLIL::Module*,RTLIL::Cell*>(mod_it.second, cell));
534  break;
535  }
536  }
537 
538  for (auto module : pos_mods)
539  for (auto &wire_it : module->wires_) {
540  RTLIL::Wire *wire = wire_it.second;
541  if (wire->port_id > 0)
542  pos_map[std::pair<RTLIL::Module*,int>(module, wire->port_id)] = wire->name;
543  }
544 
545  for (auto &work : pos_work) {
546  RTLIL::Module *module = work.first;
547  RTLIL::Cell *cell = work.second;
548  log("Mapping positional arguments of cell %s.%s (%s).\n",
549  RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(cell->type));
550  std::map<RTLIL::IdString, RTLIL::SigSpec> new_connections;
551  for (auto &conn : cell->connections())
552  if (conn.first[0] == '$' && '0' <= conn.first[1] && conn.first[1] <= '9') {
553  int id = atoi(conn.first.c_str()+1);
554  std::pair<RTLIL::Module*,int> key(design->modules_.at(cell->type), id);
555  if (pos_map.count(key) == 0) {
556  log(" Failed to map positional argument %d of cell %s.%s (%s).\n",
557  id, RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(cell->type));
558  new_connections[conn.first] = conn.second;
559  } else
560  new_connections[pos_map.at(key)] = conn.second;
561  } else
562  new_connections[conn.first] = conn.second;
563  cell->connections_ = new_connections;
564  }
565  }
566 
567  log_pop();
568  }
569 } HierarchyPass;
570 
const char * c_str() const
Definition: rtlil.h:178
std::string str() const
Definition: rtlil.h:182
std::string stringf(const char *fmt,...)
Definition: yosys.cc:58
void add(RTLIL::Module *module)
Definition: rtlil.cc:259
void log_header(const char *format,...)
Definition: log.cc:188
virtual void execute(std::vector< std::string > args, RTLIL::Design *design)
Definition: hierarchy.cc:370
std::map< RTLIL::IdString, RTLIL::Wire * > wires_
Definition: rtlil.h:595
static std::string unescape_id(std::string str)
Definition: rtlil.h:257
static void frontend_call(RTLIL::Design *design, std::istream *f, std::string filename, std::string command)
Definition: register.cc:375
RTLIL::IdString name
Definition: rtlil.h:853
static std::string idx(std::string str)
Definition: test_autotb.cc:57
bool port_input
Definition: rtlil.h:827
RTLIL::IdString portname
Definition: hierarchy.cc:35
void log_error(const char *format,...)
Definition: log.cc:204
RTLIL::Module * module
Definition: abc.cc:94
int port_id
Definition: rtlil.h:826
RTLIL::IdString type
Definition: rtlil.h:854
std::map< RTLIL::IdString, RTLIL::Const > parameters
Definition: rtlil.h:856
void log_pop()
Definition: log.cc:237
virtual RTLIL::IdString derive(RTLIL::Design *design, std::map< RTLIL::IdString, RTLIL::Const > parameters)
Definition: rtlil.cc:467
if(!(yy_init))
Definition: ilang_lexer.cc:846
static std::string escape_id(std::string str)
Definition: rtlil.h:251
bool port_output
Definition: rtlil.h:827
void hierarchy_worker(RTLIL::Design *design, std::set< RTLIL::Module * > &used, RTLIL::Module *mod, int indent)
Definition: hierarchy.cc:251
USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN bool did_something
Definition: opt_const.cc:32
bool patmatch(const char *pattern, const char *string)
Definition: yosys.cc:144
#define PRIVATE_NAMESPACE_BEGIN
Definition: yosys.h:97
int GetSize(RTLIL::Wire *wire)
Definition: yosys.cc:334
bool set_keep_assert(std::map< RTLIL::Module *, bool > &cache, RTLIL::Module *mod)
Definition: hierarchy.cc:298
#define log_assert(_assert_expr_)
Definition: log.h:85
RTLIL::IdString name
Definition: rtlil.h:599
bool expand_module(RTLIL::Design *design, RTLIL::Module *module, bool flag_check, std::vector< std::string > &libdirs)
Definition: hierarchy.cc:141
#define PRIVATE_NAMESPACE_END
Definition: yosys.h:98
virtual void help()
Definition: hierarchy.cc:311
Definition: register.h:27
RTLIL::IdString name
Definition: rtlil.h:825
static const char * id2cstr(const RTLIL::IdString &str)
Definition: rtlil.h:267
void log_cmd_error(const char *format,...)
Definition: log.cc:211
bool check_file_exists(std::string filename, bool is_exec)
Definition: yosys.cc:302
RTLIL::Module * module(RTLIL::IdString name)
Definition: rtlil.cc:254
std::string substr(size_t pos=0, size_t len=std::string::npos) const
Definition: rtlil.h:208
bool has(RTLIL::IdString id) const
Definition: rtlil.h:519
#define USING_YOSYS_NAMESPACE
Definition: yosys.h:102
RTLIL::ObjRange< RTLIL::Cell * > cells()
Definition: rtlil.h:641
RTLIL::ObjRange< RTLIL::Module * > modules()
Definition: rtlil.cc:249
std::map< RTLIL::IdString, RTLIL::Module * > modules_
Definition: rtlil.h:507
#define NULL
std::map< RTLIL::IdString, RTLIL::Cell * > cells_
Definition: rtlil.h:596
void log(const char *format,...)
Definition: log.cc:180
void log_push()
Definition: log.cc:232
std::map< RTLIL::IdString, RTLIL::SigSpec > connections_
Definition: rtlil.h:855
RTLIL::Design * design
Definition: rtlil.h:589
std::string id(RTLIL::IdString internal_id, bool may_rename=true)
void extra_args(std::vector< std::string > args, size_t argidx, RTLIL::Design *design, bool select=true)
Definition: register.cc:128
HierarchyPass HierarchyPass
const std::map< RTLIL::IdString, RTLIL::SigSpec > & connections() const
Definition: rtlil.cc:1814
void hierarchy(RTLIL::Design *design, RTLIL::Module *top, bool purge_lib, bool first_pass)
Definition: hierarchy.cc:275
const char * log_id(RTLIL::IdString str)
Definition: log.cc:283
void generate(RTLIL::Design *design, const std::vector< std::string > &celltypes, const std::vector< generate_port_decl_t > &portdecls)
Definition: hierarchy.cc:39