yosys-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
rtlil.h
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 
22 #ifndef RTLIL_H
23 #define RTLIL_H
24 
26 
27 namespace RTLIL
28 {
29  enum State : unsigned char {
30  S0 = 0,
31  S1 = 1,
32  Sx = 2, // undefined value or conflict
33  Sz = 3, // high-impedance / not-connected
34  Sa = 4, // don't care (used only in cases)
35  Sm = 5 // marker (used internally by some passes)
36  };
37 
38  enum SyncType : unsigned char {
39  ST0 = 0, // level sensitive: 0
40  ST1 = 1, // level sensitive: 1
41  STp = 2, // edge sensitive: posedge
42  STn = 3, // edge sensitive: negedge
43  STe = 4, // edge sensitive: both edges
44  STa = 5, // always active
45  STi = 6 // init
46  };
47 
48  enum ConstFlags : unsigned char {
51  CONST_FLAG_SIGNED = 2, // only used for parameters
52  CONST_FLAG_REAL = 4 // unused -- to be used for parameters
53  };
54 
55  struct Const;
56  struct Selection;
57  struct Monitor;
58  struct Design;
59  struct Module;
60  struct Wire;
61  struct Memory;
62  struct Cell;
63  struct SigChunk;
64  struct SigBit;
65  struct SigSpecIterator;
66  struct SigSpecConstIterator;
67  struct SigSpec;
68  struct CaseRule;
69  struct SwitchRule;
70  struct SyncRule;
71  struct Process;
72 
73  typedef std::pair<SigSpec, SigSpec> SigSig;
74 
75  struct IdString
76  {
77  // the global id string cache
78 
79  struct char_ptr_cmp {
80  bool operator()(const char *a, const char *b) const {
81  for (int i = 0; a[i] || b[i]; i++)
82  if (a[i] != b[i])
83  return a[i] < b[i];
84  return false;
85  }
86  };
87 
88  static struct destruct_guard_t {
89  bool ok = false;
90  destruct_guard_t() { ok = true; }
91  ~destruct_guard_t() { ok = false; }
93 
94  static std::vector<int> global_refcount_storage_;
95  static std::vector<char*> global_id_storage_;
96  static std::map<char*, int, char_ptr_cmp> global_id_index_;
97  static std::vector<int> global_free_idx_list_;
98 
99  static inline int get_reference(int idx)
100  {
101  global_refcount_storage_.at(idx)++;
102  return idx;
103  }
104 
105  static inline int get_reference(const char *p)
106  {
108 
109  if (p[0]) {
110  log_assert(p[1] != 0);
111  log_assert(p[0] == '$' || p[0] == '\\');
112  }
113 
114  auto it = global_id_index_.find((char*)p);
115  if (it != global_id_index_.end()) {
116  global_refcount_storage_.at(it->second)++;
117  return it->second;
118  }
119 
120  if (global_free_idx_list_.empty()) {
121  log_assert(global_id_storage_.size() < 0x40000000);
122  global_free_idx_list_.push_back(global_id_storage_.size());
123  global_id_storage_.push_back(nullptr);
124  global_refcount_storage_.push_back(0);
125  }
126 
127  int idx = global_free_idx_list_.back();
128  global_free_idx_list_.pop_back();
129  global_id_storage_.at(idx) = strdup(p);
131  global_refcount_storage_.at(idx)++;
132  return idx;
133  }
134 
135  static inline void put_reference(int idx)
136  {
137  // put_reference() may be called from destructors after the destructor of
138  // global_refcount_storage_ has been run. in this case we simply do nothing.
139  if (!destruct_guard.ok)
140  return;
141 
143 
144  if (--global_refcount_storage_.at(idx) != 0)
145  return;
146 
147  global_id_index_.erase(global_id_storage_.at(idx));
148  free(global_id_storage_.at(idx));
149  global_id_storage_.at(idx) = nullptr;
150  global_free_idx_list_.push_back(idx);
151  }
152 
153  // the actual IdString object is just is a single int
154 
155  int index_;
156 
158  IdString(const char *str) : index_(get_reference(str)) { }
160  IdString(const std::string &str) : index_(get_reference(str.c_str())) { }
162 
163  void operator=(const IdString &rhs) {
165  index_ = get_reference(rhs.index_);
166  }
167 
168  void operator=(const char *rhs) {
169  IdString id(rhs);
170  *this = id;
171  }
172 
173  void operator=(const std::string &rhs) {
174  IdString id(rhs);
175  *this = id;
176  }
177 
178  const char *c_str() const {
179  return global_id_storage_.at(index_);
180  }
181 
182  std::string str() const {
183  return std::string(global_id_storage_.at(index_));
184  }
185 
186  bool operator<(IdString rhs) const {
187  return index_ < rhs.index_;
188  }
189 
190  bool operator==(IdString rhs) const { return index_ == rhs.index_; }
191  bool operator!=(IdString rhs) const { return index_ != rhs.index_; }
192 
193  // The methods below are just convinience functions for better compatibility with std::string.
194 
195  bool operator==(const std::string &rhs) const { return str() == rhs; }
196  bool operator!=(const std::string &rhs) const { return str() != rhs; }
197 
198  bool operator==(const char *rhs) const { return strcmp(c_str(), rhs) == 0; }
199  bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; }
200 
201  char operator[](size_t i) const {
202  const char *p = c_str();
203  for (; i != 0; i--, p++)
204  log_assert(*p != 0);
205  return *p;
206  }
207 
208  std::string substr(size_t pos = 0, size_t len = std::string::npos) const {
209  if (len == std::string::npos || len >= strlen(c_str() + pos))
210  return std::string(c_str() + pos);
211  else
212  return std::string(c_str() + pos, len);
213  }
214 
215  size_t size() const {
216  return str().size();
217  }
218 
219  bool empty() const {
220  return c_str()[0] == 0;
221  }
222 
223  void clear() {
224  *this = IdString();
225  }
226 
227  // The following is a helper key_compare class. Instead of for example std::set<Cell*>
228  // use std::set<Cell*, IdString::compare_ptr_by_name<Cell>> if the order of cells in the
229  // set has an influence on the algorithm.
230 
231  template<typename T> struct compare_ptr_by_name {
232  bool operator()(const T *a, const T *b) const {
233  return (a == nullptr || b == nullptr) ? (a < b) : (a->name < b->name);
234  }
235  };
236 
237  // often one needs to check if a given IdString is part of a list (for example a list
238  // of cell types). the following functions helps with that.
239 
240  template<typename T, typename... Args>
241  bool in(T first, Args... rest) {
242  return in(first) || in(rest...);
243  }
244 
245  bool in(IdString rhs) { return *this == rhs; }
246  bool in(const char *rhs) { return *this == rhs; }
247  bool in(const std::string &rhs) { return *this == rhs; }
248  bool in(const std::set<IdString> &rhs) { return rhs.count(*this) != 0; }
249  };
250 
251  static inline std::string escape_id(std::string str) {
252  if (str.size() > 0 && str[0] != '\\' && str[0] != '$')
253  return "\\" + str;
254  return str;
255  }
256 
257  static inline std::string unescape_id(std::string str) {
258  if (str.size() > 1 && str[0] == '\\' && str[1] != '$')
259  return str.substr(1);
260  return str;
261  }
262 
263  static inline std::string unescape_id(RTLIL::IdString str) {
264  return unescape_id(str.str());
265  }
266 
267  static inline const char *id2cstr(const RTLIL::IdString &str) {
268  return log_id(str);
269  }
270 
271  template <typename T> struct sort_by_name_id {
272  bool operator()(T *a, T *b) const {
273  return a->name < b->name;
274  }
275  };
276 
277  template <typename T> struct sort_by_name_str {
278  bool operator()(T *a, T *b) const {
279  return strcmp(a->name.c_str(), b->name.c_str()) < 0;
280  }
281  };
282 
283  struct sort_by_id_str {
285  return strcmp(a.c_str(), b.c_str()) < 0;
286  }
287  };
288 
289  // see calc.cc for the implementation of this functions
290  RTLIL::Const const_not (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
291  RTLIL::Const const_and (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
292  RTLIL::Const const_or (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
293  RTLIL::Const const_xor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
294  RTLIL::Const const_xnor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
295 
296  RTLIL::Const const_reduce_and (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
297  RTLIL::Const const_reduce_or (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
298  RTLIL::Const const_reduce_xor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
299  RTLIL::Const const_reduce_xnor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
300  RTLIL::Const const_reduce_bool (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
301 
302  RTLIL::Const const_logic_not (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
303  RTLIL::Const const_logic_and (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
304  RTLIL::Const const_logic_or (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
305 
306  RTLIL::Const const_shl (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
307  RTLIL::Const const_shr (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
308  RTLIL::Const const_sshl (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
309  RTLIL::Const const_sshr (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
310  RTLIL::Const const_shift (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
311  RTLIL::Const const_shiftx (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
312 
313  RTLIL::Const const_lt (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
314  RTLIL::Const const_le (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
315  RTLIL::Const const_eq (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
316  RTLIL::Const const_ne (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
317  RTLIL::Const const_eqx (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
318  RTLIL::Const const_nex (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
319  RTLIL::Const const_ge (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
320  RTLIL::Const const_gt (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
321 
322  RTLIL::Const const_add (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
323  RTLIL::Const const_sub (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
324  RTLIL::Const const_mul (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
325  RTLIL::Const const_div (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
326  RTLIL::Const const_mod (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
327  RTLIL::Const const_pow (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
328 
329  RTLIL::Const const_pos (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
330  RTLIL::Const const_neg (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len);
331 
332 
333  // This iterator-range-pair is used for Design::modules(), Module::wires() and Module::cells().
334  // It maintains a reference counter that is used to make sure that the container is not modified while being iterated over.
335 
336  template<typename T>
337  struct ObjIterator
338  {
339  typename std::map<RTLIL::IdString, T>::iterator it;
340  std::map<RTLIL::IdString, T> *list_p;
342 
343  ObjIterator() : list_p(nullptr), refcount_p(nullptr) {
344  }
345 
346  ObjIterator(decltype(list_p) list_p, int *refcount_p) : list_p(list_p), refcount_p(refcount_p) {
347  if (list_p->empty()) {
348  this->list_p = nullptr;
349  this->refcount_p = nullptr;
350  } else {
351  it = list_p->begin();
352  (*refcount_p)++;
353  }
354  }
355 
357  it = other.it;
358  list_p = other.list_p;
359  refcount_p = other.refcount_p;
360  if (refcount_p)
361  (*refcount_p)++;
362  }
363 
365  if (refcount_p)
366  (*refcount_p)--;
367  it = other.it;
368  list_p = other.list_p;
369  refcount_p = other.refcount_p;
370  if (refcount_p)
371  (*refcount_p)++;
372  return *this;
373  }
374 
376  if (refcount_p)
377  (*refcount_p)--;
378  }
379 
380  inline T operator*() const {
381  log_assert(list_p != nullptr);
382  return it->second;
383  }
384 
385  inline bool operator!=(const RTLIL::ObjIterator<T> &other) const {
386  if (list_p == nullptr || other.list_p == nullptr)
387  return list_p != other.list_p;
388  return it != other.it;
389  }
390 
391  inline void operator++() {
392  log_assert(list_p != nullptr);
393  if (++it == list_p->end()) {
394  (*refcount_p)--;
395  list_p = nullptr;
396  refcount_p = nullptr;
397  }
398  }
399  };
400 
401  template<typename T>
402  struct ObjRange
403  {
404  std::map<RTLIL::IdString, T> *list_p;
406 
407  ObjRange(decltype(list_p) list_p, int *refcount_p) : list_p(list_p), refcount_p(refcount_p) { }
410 
411  size_t size() const {
412  return list_p->size();
413  }
414 
415  operator std::set<T>() const {
416  std::set<T> result;
417  for (auto &it : *list_p)
418  result.insert(it.second);
419  return result;
420  }
421 
422  operator std::vector<T>() const {
423  std::vector<T> result;
424  result.reserve(list_p->size());
425  for (auto &it : *list_p)
426  result.push_back(it.second);
427  return result;
428  }
429 
430  std::set<T> to_set() const { return *this; }
431  std::vector<T> to_vector() const { return *this; }
432  };
433 };
434 
436 {
437  int flags;
438  std::vector<RTLIL::State> bits;
439 
440  Const();
441  Const(std::string str);
442  Const(int val, int width = 32);
443  Const(RTLIL::State bit, int width = 1);
444  Const(const std::vector<RTLIL::State> &bits) : bits(bits) { flags = CONST_FLAG_NONE; };
445  Const(const std::vector<bool> &bits);
446 
447  bool operator <(const RTLIL::Const &other) const;
448  bool operator ==(const RTLIL::Const &other) const;
449  bool operator !=(const RTLIL::Const &other) const;
450 
451  bool as_bool() const;
452  int as_int(bool is_signed = false) const;
453  std::string as_string() const;
454 
455  std::string decode_string() const;
456 
457  inline int size() const { return bits.size(); }
458 };
459 
461 {
463  std::set<RTLIL::IdString> selected_modules;
464  std::map<RTLIL::IdString, std::set<RTLIL::IdString>> selected_members;
465 
466  Selection(bool full = true) : full_selection(full) { }
467 
468  bool selected_module(RTLIL::IdString mod_name) const;
469  bool selected_whole_module(RTLIL::IdString mod_name) const;
470  bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const;
471  void optimize(RTLIL::Design *design);
472 
473  template<typename T1> void select(T1 *module) {
474  if (!full_selection && selected_modules.count(module->name) == 0) {
475  selected_modules.insert(module->name);
476  selected_members.erase(module->name);
477  }
478  }
479 
480  template<typename T1, typename T2> void select(T1 *module, T2 *member) {
481  if (!full_selection && selected_modules.count(module->name) == 0)
482  selected_members[module->name].insert(member->name);
483  }
484 
485  bool empty() const {
486  return !full_selection && selected_modules.empty() && selected_members.empty();
487  }
488 };
489 
491 {
492  virtual ~Monitor() { }
493  virtual void notify_module_add(RTLIL::Module*) { }
494  virtual void notify_module_del(RTLIL::Module*) { }
496  virtual void notify_connect(RTLIL::Module*, const RTLIL::SigSig&) { }
497  virtual void notify_connect(RTLIL::Module*, const std::vector<RTLIL::SigSig>&) { }
498  virtual void notify_blackout(RTLIL::Module*) { }
499 };
500 
502 {
503  std::set<RTLIL::Monitor*> monitors;
504  std::map<std::string, std::string> scratchpad;
505 
507  std::map<RTLIL::IdString, RTLIL::Module*> modules_;
508 
509  std::vector<RTLIL::Selection> selection_stack;
510  std::map<RTLIL::IdString, RTLIL::Selection> selection_vars;
512 
513  Design();
514  ~Design();
515 
518 
519  bool has(RTLIL::IdString id) const {
520  return modules_.count(id) != 0;
521  }
522 
523  void add(RTLIL::Module *module);
525  void remove(RTLIL::Module *module);
526 
527  void scratchpad_unset(std::string varname);
528 
529  void scratchpad_set_int(std::string varname, int value);
530  void scratchpad_set_bool(std::string varname, bool value);
531  void scratchpad_set_string(std::string varname, std::string value);
532 
533  int scratchpad_get_int(std::string varname, int default_value = 0) const;
534  bool scratchpad_get_bool(std::string varname, bool default_value = false) const;
535  std::string scratchpad_get_string(std::string varname, std::string default_value = std::string()) const;
536 
537  void check();
538  void optimize();
539 
540  bool selected_module(RTLIL::IdString mod_name) const;
541  bool selected_whole_module(RTLIL::IdString mod_name) const;
542  bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const;
543 
544  bool selected_module(RTLIL::Module *mod) const;
545  bool selected_whole_module(RTLIL::Module *mod) const;
546 
547  bool full_selection() const {
548  return selection_stack.back().full_selection;
549  }
550 
551  template<typename T1> bool selected(T1 *module) const {
552  return selected_module(module->name);
553  }
554 
555  template<typename T1, typename T2> bool selected(T1 *module, T2 *member) const {
556  return selected_member(module->name, member->name);
557  }
558 
559  template<typename T1, typename T2> void select(T1 *module, T2 *member) {
560  if (selection_stack.size() > 0) {
561  RTLIL::Selection &sel = selection_stack.back();
562  sel.select(module, member);
563  }
564  }
565 
566  std::vector<RTLIL::Module*> selected_modules() const;
567  std::vector<RTLIL::Module*> selected_whole_modules() const;
568  std::vector<RTLIL::Module*> selected_whole_modules_warn() const;
569 };
570 
571 #define RTLIL_ATTRIBUTE_MEMBERS \
572  std::map<RTLIL::IdString, RTLIL::Const> attributes; \
573  void set_bool_attribute(RTLIL::IdString id) { \
574  attributes[id] = RTLIL::Const(1); \
575  } \
576  bool get_bool_attribute(RTLIL::IdString id) const { \
577  if (attributes.count(id) == 0) \
578  return false; \
579  return attributes.at(id).as_bool(); \
580  }
581 
583 {
584 protected:
585  void add(RTLIL::Wire *wire);
586  void add(RTLIL::Cell *cell);
587 
588 public:
590  std::set<RTLIL::Monitor*> monitors;
591 
594 
595  std::map<RTLIL::IdString, RTLIL::Wire*> wires_;
596  std::map<RTLIL::IdString, RTLIL::Cell*> cells_;
597  std::vector<RTLIL::SigSig> connections_;
598 
600  std::set<RTLIL::IdString> avail_parameters;
601  std::map<RTLIL::IdString, RTLIL::Memory*> memories;
602  std::map<RTLIL::IdString, RTLIL::Process*> processes;
604 
605  Module();
606  virtual ~Module();
607  virtual RTLIL::IdString derive(RTLIL::Design *design, std::map<RTLIL::IdString, RTLIL::Const> parameters);
608  virtual size_t count_id(RTLIL::IdString id);
609  virtual void check();
610  virtual void optimize();
611 
612  void connect(const RTLIL::SigSig &conn);
613  void connect(const RTLIL::SigSpec &lhs, const RTLIL::SigSpec &rhs);
614  void new_connections(const std::vector<RTLIL::SigSig> &new_conn);
615  const std::vector<RTLIL::SigSig> &connections() const;
616 
617  std::vector<RTLIL::IdString> ports;
618  void fixup_ports();
619 
620  template<typename T> void rewrite_sigspecs(T functor);
621  void cloneInto(RTLIL::Module *new_mod) const;
622  virtual RTLIL::Module *clone() const;
623 
624  bool has_memories() const;
625  bool has_processes() const;
626 
627  bool has_memories_warn() const;
628  bool has_processes_warn() const;
629 
630  std::vector<RTLIL::Wire*> selected_wires() const;
631  std::vector<RTLIL::Cell*> selected_cells() const;
632 
633  template<typename T> bool selected(T *member) const {
634  return design->selected_member(name, member->name);
635  }
636 
637  RTLIL::Wire* wire(RTLIL::IdString id) { return wires_.count(id) ? wires_.at(id) : nullptr; }
638  RTLIL::Cell* cell(RTLIL::IdString id) { return cells_.count(id) ? cells_.at(id) : nullptr; }
639 
642 
643  // Removing wires is expensive. If you have to remove wires, remove them all at once.
644  void remove(const std::set<RTLIL::Wire*> &wires);
645  void remove(RTLIL::Cell *cell);
646 
647  void rename(RTLIL::Wire *wire, RTLIL::IdString new_name);
648  void rename(RTLIL::Cell *cell, RTLIL::IdString new_name);
649  void rename(RTLIL::IdString old_name, RTLIL::IdString new_name);
650 
651  void swap_names(RTLIL::Wire *w1, RTLIL::Wire *w2);
652  void swap_names(RTLIL::Cell *c1, RTLIL::Cell *c2);
653 
656 
657  RTLIL::Wire *addWire(RTLIL::IdString name, int width = 1);
659 
662 
663  // The add* methods create a cell and return the created cell. All signals must exist in advance.
664 
665  RTLIL::Cell* addNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
666  RTLIL::Cell* addPos (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
667  RTLIL::Cell* addNeg (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
668 
669  RTLIL::Cell* addAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
670  RTLIL::Cell* addOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
671  RTLIL::Cell* addXor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
672  RTLIL::Cell* addXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
673 
674  RTLIL::Cell* addReduceAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
675  RTLIL::Cell* addReduceOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
676  RTLIL::Cell* addReduceXor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
677  RTLIL::Cell* addReduceXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
678  RTLIL::Cell* addReduceBool (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
679 
680  RTLIL::Cell* addShl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
681  RTLIL::Cell* addShr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
682  RTLIL::Cell* addSshl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
683  RTLIL::Cell* addSshr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
684  RTLIL::Cell* addShift (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
685  RTLIL::Cell* addShiftx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
686 
687  RTLIL::Cell* addLt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
688  RTLIL::Cell* addLe (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
689  RTLIL::Cell* addEq (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
690  RTLIL::Cell* addNe (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
691  RTLIL::Cell* addEqx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
692  RTLIL::Cell* addNex (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
693  RTLIL::Cell* addGe (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
694  RTLIL::Cell* addGt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
695 
696  RTLIL::Cell* addAdd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
697  RTLIL::Cell* addSub (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
698  RTLIL::Cell* addMul (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
699  RTLIL::Cell* addDiv (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
700  RTLIL::Cell* addMod (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
701  RTLIL::Cell* addPow (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed = false, bool b_signed = false);
702 
703  RTLIL::Cell* addLogicNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false);
704  RTLIL::Cell* addLogicAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
705  RTLIL::Cell* addLogicOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false);
706 
709 
714 
715  RTLIL::Cell* addSr (RTLIL::IdString name, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_q, bool set_polarity = true, bool clr_polarity = true);
717  RTLIL::Cell* addDffe (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool en_polarity = true);
719  RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true);
721  RTLIL::Const arst_value, bool clk_polarity = true, bool arst_polarity = true);
722  RTLIL::Cell* addDlatch (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true);
724  RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true);
725 
738 
740  RTLIL::Cell* addDffeGate (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool en_polarity = true);
742  RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true);
744  bool arst_value = false, bool clk_polarity = true, bool arst_polarity = true);
745  RTLIL::Cell* addDlatchGate (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true);
747  RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true);
748 
749  // The methods without the add* prefix create a cell and an output signal. They return the newly created output signal.
750 
751  RTLIL::SigSpec Not (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
752  RTLIL::SigSpec Pos (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
753  RTLIL::SigSpec Bu0 (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
754  RTLIL::SigSpec Neg (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
755 
756  RTLIL::SigSpec And (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
757  RTLIL::SigSpec Or (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
758  RTLIL::SigSpec Xor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
759  RTLIL::SigSpec Xnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
760 
761  RTLIL::SigSpec ReduceAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
762  RTLIL::SigSpec ReduceOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
763  RTLIL::SigSpec ReduceXor (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
764  RTLIL::SigSpec ReduceXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
765  RTLIL::SigSpec ReduceBool (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
766 
767  RTLIL::SigSpec Shl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
768  RTLIL::SigSpec Shr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
769  RTLIL::SigSpec Sshl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
770  RTLIL::SigSpec Sshr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
771  RTLIL::SigSpec Shift (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
772  RTLIL::SigSpec Shiftx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
773 
774  RTLIL::SigSpec Lt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
775  RTLIL::SigSpec Le (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
776  RTLIL::SigSpec Eq (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
777  RTLIL::SigSpec Ne (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
778  RTLIL::SigSpec Eqx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
779  RTLIL::SigSpec Nex (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
780  RTLIL::SigSpec Ge (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
781  RTLIL::SigSpec Gt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
782 
783  RTLIL::SigSpec Add (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
784  RTLIL::SigSpec Sub (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
785  RTLIL::SigSpec Mul (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
786  RTLIL::SigSpec Div (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
787  RTLIL::SigSpec Mod (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
788  RTLIL::SigSpec Pow (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool a_signed = false, bool b_signed = false);
789 
790  RTLIL::SigSpec LogicNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false);
791  RTLIL::SigSpec LogicAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
792  RTLIL::SigSpec LogicOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false);
793 
796 
809 };
810 
812 {
813 protected:
814  // use module->addWire() and module->remove() to create or destroy wires
815  friend struct RTLIL::Module;
816  Wire();
817  ~Wire() { };
818 
819 public:
820  // do not simply copy wires
821  Wire(RTLIL::Wire &other) = delete;
822  void operator=(RTLIL::Wire &other) = delete;
823 
829 };
830 
832 {
833  Memory();
834 
838 };
839 
841 {
842 protected:
843  // use module->addCell() and module->remove() to create or destroy cells
844  friend struct RTLIL::Module;
845  Cell();
846 
847 public:
848  // do not simply copy cells
849  Cell(RTLIL::Cell &other) = delete;
850  void operator=(RTLIL::Cell &other) = delete;
851 
855  std::map<RTLIL::IdString, RTLIL::SigSpec> connections_;
856  std::map<RTLIL::IdString, RTLIL::Const> parameters;
858 
859  // access cell ports
860  bool hasPort(RTLIL::IdString portname) const;
861  void unsetPort(RTLIL::IdString portname);
862  void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal);
863  const RTLIL::SigSpec &getPort(RTLIL::IdString portname) const;
864  const std::map<RTLIL::IdString, RTLIL::SigSpec> &connections() const;
865 
866  // access cell parameters
867  bool hasParam(RTLIL::IdString paramname) const;
868  void unsetParam(RTLIL::IdString paramname);
869  void setParam(RTLIL::IdString paramname, RTLIL::Const value);
870  const RTLIL::Const &getParam(RTLIL::IdString paramname) const;
871 
872  void check();
873  void fixup_parameters(bool set_a_signed = false, bool set_b_signed = false);
874 
875  bool has_keep_attr() const {
876  return get_bool_attribute("\\keep") || (module && module->design && module->design->module(type) &&
877  module->design->module(type)->get_bool_attribute("\\keep"));
878  }
879 
880  template<typename T> void rewrite_sigspecs(T functor);
881 };
882 
884 {
886  std::vector<RTLIL::State> data; // only used if wire == NULL, LSB at index 0
887  int width, offset;
888 
889  SigChunk();
890  SigChunk(const RTLIL::Const &value);
892  SigChunk(RTLIL::Wire *wire, int offset, int width = 1);
893  SigChunk(const std::string &str);
894  SigChunk(int val, int width = 32);
895  SigChunk(RTLIL::State bit, int width = 1);
896  SigChunk(RTLIL::SigBit bit);
897 
898  RTLIL::SigChunk extract(int offset, int length) const;
899 
900  bool operator <(const RTLIL::SigChunk &other) const;
901  bool operator ==(const RTLIL::SigChunk &other) const;
902  bool operator !=(const RTLIL::SigChunk &other) const;
903 };
904 
906 {
908  union {
909  RTLIL::State data; // used if wire == NULL
910  int offset; // used if wire != NULL
911  };
912 
913  SigBit() : wire(NULL), data(RTLIL::State::S0) { }
914  SigBit(RTLIL::State bit) : wire(NULL), data(bit) { }
915  SigBit(bool bit) : wire(NULL), data(bit ? RTLIL::S1 : RTLIL::S0) { }
916  SigBit(RTLIL::Wire *wire) : wire(wire), offset(0) { log_assert(wire && wire->width == 1); }
917  SigBit(RTLIL::Wire *wire, int offset) : wire(wire), offset(offset) { log_assert(wire != nullptr); }
918  SigBit(const RTLIL::SigChunk &chunk) : wire(chunk.wire) { log_assert(chunk.width == 1); if (wire) offset = chunk.offset; else data = chunk.data[0]; }
919  SigBit(const RTLIL::SigChunk &chunk, int index) : wire(chunk.wire) { if (wire) offset = chunk.offset + index; else data = chunk.data[index]; }
920  SigBit(const RTLIL::SigSpec &sig);
921 
922  bool operator <(const RTLIL::SigBit &other) const {
923  if (wire == other.wire)
924  return wire ? (offset < other.offset) : (data < other.data);
925  if (wire != nullptr && other.wire != nullptr)
926  return wire->name < other.wire->name;
927  return wire < other.wire;
928  }
929 
930  bool operator ==(const RTLIL::SigBit &other) const {
931  return (wire == other.wire) && (wire ? (offset == other.offset) : (data == other.data));
932  }
933 
934  bool operator !=(const RTLIL::SigBit &other) const {
935  return (wire != other.wire) || (wire ? (offset != other.offset) : (data != other.data));
936  }
937 };
938 
939 struct RTLIL::SigSpecIterator : public std::iterator<std::input_iterator_tag, RTLIL::SigSpec>
940 {
942  int index;
943 
944  inline RTLIL::SigBit &operator*() const;
945  inline bool operator!=(const RTLIL::SigSpecIterator &other) const { return index != other.index; }
946  inline bool operator==(const RTLIL::SigSpecIterator &other) const { return index == other.index; }
947  inline void operator++() { index++; }
948 };
949 
950 struct RTLIL::SigSpecConstIterator : public std::iterator<std::input_iterator_tag, RTLIL::SigSpec>
951 {
953  int index;
954 
955  inline const RTLIL::SigBit &operator*() const;
956  inline bool operator!=(const RTLIL::SigSpecConstIterator &other) const { return index != other.index; }
957  inline bool operator==(const RTLIL::SigSpecIterator &other) const { return index == other.index; }
958  inline void operator++() { index++; }
959 };
960 
962 {
963 private:
964  int width_;
965  unsigned long hash_;
966  std::vector<RTLIL::SigChunk> chunks_; // LSB at index 0
967  std::vector<RTLIL::SigBit> bits_; // LSB at index 0
968 
969  void pack() const;
970  void unpack() const;
971  void hash() const;
972 
973  inline bool packed() const {
974  return bits_.empty();
975  }
976 
977  inline void inline_unpack() const {
978  if (!chunks_.empty())
979  unpack();
980  }
981 
982 public:
983  SigSpec();
984  SigSpec(const RTLIL::SigSpec &other);
985  SigSpec(std::initializer_list<RTLIL::SigSpec> parts);
986  const RTLIL::SigSpec &operator=(const RTLIL::SigSpec &other);
987 
988  SigSpec(const RTLIL::Const &value);
989  SigSpec(const RTLIL::SigChunk &chunk);
990  SigSpec(RTLIL::Wire *wire);
991  SigSpec(RTLIL::Wire *wire, int offset, int width = 1);
992  SigSpec(const std::string &str);
993  SigSpec(int val, int width = 32);
994  SigSpec(RTLIL::State bit, int width = 1);
995  SigSpec(RTLIL::SigBit bit, int width = 1);
996  SigSpec(std::vector<RTLIL::SigChunk> chunks);
997  SigSpec(std::vector<RTLIL::SigBit> bits);
998  SigSpec(std::set<RTLIL::SigBit> bits);
999  SigSpec(bool bit);
1000 
1002  width_ = other.width_;
1003  hash_ = other.hash_;
1004  chunks_ = std::move(other.chunks_);
1005  bits_ = std::move(other.bits_);
1006  }
1007 
1009  width_ = other.width_;
1010  hash_ = other.hash_;
1011  chunks_ = std::move(other.chunks_);
1012  bits_ = std::move(other.bits_);
1013  return *this;
1014  }
1015 
1016  inline const std::vector<RTLIL::SigChunk> &chunks() const { pack(); return chunks_; }
1017  inline const std::vector<RTLIL::SigBit> &bits() const { inline_unpack(); return bits_; }
1018 
1019  inline int size() const { return width_; }
1020 
1021  inline RTLIL::SigBit &operator[](int index) { inline_unpack(); return bits_.at(index); }
1022  inline const RTLIL::SigBit &operator[](int index) const { inline_unpack(); return bits_.at(index); }
1023 
1024  inline RTLIL::SigSpecIterator begin() { RTLIL::SigSpecIterator it; it.sig_p = this; it.index = 0; return it; }
1025  inline RTLIL::SigSpecIterator end() { RTLIL::SigSpecIterator it; it.sig_p = this; it.index = width_; return it; }
1026 
1027  inline RTLIL::SigSpecConstIterator begin() const { RTLIL::SigSpecConstIterator it; it.sig_p = this; it.index = 0; return it; }
1028  inline RTLIL::SigSpecConstIterator end() const { RTLIL::SigSpecConstIterator it; it.sig_p = this; it.index = width_; return it; }
1029 
1030  void sort();
1031  void sort_and_unify();
1032 
1033  void replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with);
1034  void replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with, RTLIL::SigSpec *other) const;
1035 
1036  void replace(const std::map<RTLIL::SigBit, RTLIL::SigBit> &rules);
1037  void replace(const std::map<RTLIL::SigBit, RTLIL::SigBit> &rules, RTLIL::SigSpec *other) const;
1038 
1039  void replace(int offset, const RTLIL::SigSpec &with);
1040 
1041  void remove(const RTLIL::SigSpec &pattern);
1042  void remove(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other) const;
1043  void remove2(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other);
1044 
1045  void remove(const std::set<RTLIL::SigBit> &pattern);
1046  void remove(const std::set<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other) const;
1047  void remove2(const std::set<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other);
1048 
1049  void remove(int offset, int length = 1);
1050  void remove_const();
1051 
1052  RTLIL::SigSpec extract(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec *other = NULL) const;
1053  RTLIL::SigSpec extract(const std::set<RTLIL::SigBit> &pattern, const RTLIL::SigSpec *other = NULL) const;
1054  RTLIL::SigSpec extract(int offset, int length = 1) const;
1055 
1056  void append(const RTLIL::SigSpec &signal);
1057  void append_bit(const RTLIL::SigBit &bit);
1058 
1059  void extend(int width, bool is_signed = false);
1060  void extend_u0(int width, bool is_signed = false);
1061 
1062  RTLIL::SigSpec repeat(int num) const;
1063 
1064  bool operator <(const RTLIL::SigSpec &other) const;
1065  bool operator ==(const RTLIL::SigSpec &other) const;
1066  inline bool operator !=(const RTLIL::SigSpec &other) const { return !(*this == other); }
1067 
1068  bool is_wire() const;
1069  bool is_chunk() const;
1070 
1071  bool is_fully_const() const;
1072  bool is_fully_def() const;
1073  bool is_fully_undef() const;
1074  bool has_marked_bits() const;
1075 
1076  bool as_bool() const;
1077  int as_int(bool is_signed = false) const;
1078  std::string as_string() const;
1079  RTLIL::Const as_const() const;
1080  RTLIL::Wire *as_wire() const;
1081  RTLIL::SigChunk as_chunk() const;
1082 
1083  bool match(std::string pattern) const;
1084 
1085  std::set<RTLIL::SigBit> to_sigbit_set() const;
1086  std::vector<RTLIL::SigBit> to_sigbit_vector() const;
1087  std::map<RTLIL::SigBit, RTLIL::SigBit> to_sigbit_map(const RTLIL::SigSpec &other) const;
1089 
1090  static bool parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str);
1091  static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str);
1092  static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str);
1093 
1094  operator std::vector<RTLIL::SigChunk>() const { return chunks(); }
1095  operator std::vector<RTLIL::SigBit>() const { return bits(); }
1096 
1097 #ifndef NDEBUG
1098  void check() const;
1099 #else
1100  inline void check() const { }
1101 #endif
1102 };
1103 
1105  return (*sig_p)[index];
1106 }
1107 
1109  return (*sig_p)[index];
1110 }
1111 
1113  log_assert(sig.size() == 1 && sig.chunks().size() == 1);
1114  *this = SigBit(sig.chunks().front());
1115 }
1116 
1118 {
1119  std::vector<RTLIL::SigSpec> compare;
1120  std::vector<RTLIL::SigSig> actions;
1121  std::vector<RTLIL::SwitchRule*> switches;
1122 
1123  ~CaseRule();
1124  void optimize();
1125 
1126  template<typename T> void rewrite_sigspecs(T functor);
1127  RTLIL::CaseRule *clone() const;
1128 };
1129 
1131 {
1134  std::vector<RTLIL::CaseRule*> cases;
1135 
1136  ~SwitchRule();
1137 
1138  template<typename T> void rewrite_sigspecs(T functor);
1139  RTLIL::SwitchRule *clone() const;
1140 };
1141 
1143 {
1146  std::vector<RTLIL::SigSig> actions;
1147 
1148  template<typename T> void rewrite_sigspecs(T functor);
1149  RTLIL::SyncRule *clone() const;
1150 };
1151 
1153 {
1157  std::vector<RTLIL::SyncRule*> syncs;
1158 
1159  ~Process();
1160 
1161  template<typename T> void rewrite_sigspecs(T functor);
1162  RTLIL::Process *clone() const;
1163 };
1164 
1165 template<typename T>
1167 {
1168  for (auto &it : cells_)
1169  it.second->rewrite_sigspecs(functor);
1170  for (auto &it : processes)
1171  it.second->rewrite_sigspecs(functor);
1172  for (auto &it : connections_) {
1173  functor(it.first);
1174  functor(it.second);
1175  }
1176 }
1177 
1178 template<typename T>
1180  for (auto &it : connections_)
1181  functor(it.second);
1182 }
1183 
1184 template<typename T>
1186  for (auto &it : compare)
1187  functor(it);
1188  for (auto &it : actions) {
1189  functor(it.first);
1190  functor(it.second);
1191  }
1192  for (auto it : switches)
1193  it->rewrite_sigspecs(functor);
1194 }
1195 
1196 template<typename T>
1198 {
1199  functor(signal);
1200  for (auto it : cases)
1201  it->rewrite_sigspecs(functor);
1202 }
1203 
1204 template<typename T>
1206 {
1207  functor(signal);
1208  for (auto &it : actions) {
1209  functor(it.first);
1210  functor(it.second);
1211  }
1212 }
1213 
1214 template<typename T>
1216 {
1217  root_case.rewrite_sigspecs(functor);
1218  for (auto it : syncs)
1219  it->rewrite_sigspecs(functor);
1220 }
1221 
1223 
1224 #endif
bool selected_module(RTLIL::IdString mod_name) const
Definition: rtlil.cc:148
void fixup_parameters(bool set_a_signed=false, bool set_b_signed=false)
Definition: rtlil.cc:1847
const char * c_str() const
Definition: rtlil.h:178
void rewrite_sigspecs(T functor)
Definition: rtlil.h:1185
bool selected(T1 *module) const
Definition: rtlil.h:551
virtual void optimize()
Definition: rtlil.cc:1018
RTLIL::Const const_logic_or(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:256
RTLIL::Wire * wire
Definition: rtlil.h:907
bool as_bool() const
Definition: rtlil.cc:96
bool is_fully_def() const
Definition: rtlil.cc:2774
std::map< RTLIL::IdString, T > * list_p
Definition: rtlil.h:404
void cloneInto(RTLIL::Module *new_mod) const
Definition: rtlil.cc:1022
RTLIL::SigBit Aoi4Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d)
bool operator!=(const RTLIL::ObjIterator< T > &other) const
Definition: rtlil.h:385
RTLIL::Cell * addReduceXor(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
std::string str() const
Definition: rtlil.h:182
RTLIL::SigBit Oai4Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d)
RTLIL::SigSpec Gt(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
bool is_fully_undef() const
Definition: rtlil.cc:2789
void operator++()
Definition: rtlil.h:391
RTLIL::SigSpec Lt(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Wire * wire(RTLIL::IdString id)
Definition: rtlil.h:637
RTLIL::Cell * addXorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
void unsetPort(RTLIL::IdString portname)
Definition: rtlil.cc:1771
bool empty() const
Definition: rtlil.h:485
RTLIL::Cell * addSlice(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const offset)
Definition: rtlil.cc:1547
void scratchpad_set_int(std::string varname, int value)
Definition: rtlil.cc:291
RTLIL::Cell * addDiv(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Const const_xor(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:175
void sort()
Definition: rtlil.cc:2284
bool selected_whole_module(RTLIL::IdString mod_name) const
Definition: rtlil.cc:159
std::vector< RTLIL::Selection > selection_stack
Definition: rtlil.h:509
bool operator!=(const RTLIL::SigSpec &other) const
Definition: rtlil.h:1066
RTLIL::Const const_pow(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:511
ObjIterator(decltype(list_p) list_p, int *refcount_p)
Definition: rtlil.h:346
RTLIL::SigSpec Shr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
SigBit(RTLIL::State bit)
Definition: rtlil.h:914
RTLIL::State data
Definition: rtlil.h:909
RTLIL::Cell * addNandGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
T operator*() const
Definition: rtlil.h:380
void new_connections(const std::vector< RTLIL::SigSig > &new_conn)
Definition: rtlil.cc:1295
bool selected_module(RTLIL::IdString mod_name) const
Definition: rtlil.cc:379
void free(void *)
RTLIL::Cell * addCell(RTLIL::IdString name, RTLIL::IdString type)
Definition: rtlil.cc:1353
void add(RTLIL::Module *module)
Definition: rtlil.cc:259
bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const
Definition: rtlil.cc:168
std::set< RTLIL::Monitor * > monitors
Definition: rtlil.h:590
std::set< RTLIL::IdString > selected_modules
Definition: rtlil.h:463
static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3058
RTLIL::SigSpec Ne(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Const const_ne(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:403
bool clk_polarity
Definition: abc.cc:98
int flags
Definition: rtlil.h:437
RTLIL::SigSpec Shl(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::SigBit XorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b)
void setParam(RTLIL::IdString paramname, RTLIL::Const value)
Definition: rtlil.cc:1829
RTLIL::SigBit AndGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b)
RTLIL::Cell * addDffGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity=true)
Definition: rtlil.cc:1681
RTLIL::Const const_eq(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:379
const std::vector< RTLIL::SigSig > & connections() const
Definition: rtlil.cc:1307
void clear()
Definition: rtlil.h:223
#define YOSYS_NAMESPACE_END
Definition: yosys.h:100
std::map< RTLIL::IdString, std::set< RTLIL::IdString > > selected_members
Definition: rtlil.h:464
RTLIL::Cell * addNot(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigSpec Sshl(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Const as_const() const
Definition: rtlil.cc:2857
RTLIL::SyncType type
Definition: rtlil.h:1144
bool operator!=(IdString rhs) const
Definition: rtlil.h:191
RTLIL::SigSpec Mul(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
std::map< RTLIL::IdString, RTLIL::Wire * > wires_
Definition: rtlil.h:595
bool as_bool() const
Definition: rtlil.cc:2818
void rewrite_sigspecs(T functor)
Definition: rtlil.h:1166
static std::string unescape_id(std::string str)
Definition: rtlil.h:257
ObjIterator & operator=(const RTLIL::ObjIterator< T > &other)
Definition: rtlil.h:364
std::set< RTLIL::SigBit > to_sigbit_set() const
Definition: rtlil.cc:2909
void scratchpad_unset(std::string varname)
Definition: rtlil.cc:286
RTLIL::Cell * addOai4Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y)
RTLIL::SigChunk extract(int offset, int length) const
Definition: rtlil.cc:1970
unsigned long hash_
Definition: rtlil.h:965
RTLIL_ATTRIBUTE_MEMBERS std::vector< RTLIL::CaseRule * > cases
Definition: rtlil.h:1134
RTLIL::Cell * addAoi3Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y)
RTLIL::Cell * addSshr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigBit & operator[](int index)
Definition: rtlil.h:1021
RTLIL::Cell * addNorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
void unpack() const
Definition: rtlil.cc:2238
RTLIL::IdString name
Definition: rtlil.h:853
bool upto
Definition: rtlil.h:827
static std::string idx(std::string str)
Definition: test_autotb.cc:57
bool operator!=(const RTLIL::SigSpecConstIterator &other) const
Definition: rtlil.h:956
std::map< RTLIL::IdString, T >::iterator it
Definition: rtlil.h:339
RTLIL::Cell * addDlatchGate(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity=true)
Definition: rtlil.cc:1723
void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal)
Definition: rtlil.cc:1789
RTLIL::SigSpec ReduceXor(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
bool port_input
Definition: rtlil.h:827
RTLIL::SigSpec Mux(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s)
RTLIL::Const const_sub(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:471
RTLIL::Const const_logic_not(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:230
RTLIL::SyncRule * clone() const
Definition: rtlil.cc:3138
RTLIL::SigBit NorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b)
RTLIL::SigSpec Sub(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::ObjRange< RTLIL::Wire * > wires()
Definition: rtlil.h:640
int width
Definition: rtlil.h:826
void check()
Definition: rtlil.cc:357
std::map< RTLIL::IdString, RTLIL::Memory * > memories
Definition: rtlil.h:601
RTLIL::Cell * addEq(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addLut(RTLIL::IdString name, RTLIL::SigSpec sig_i, RTLIL::SigSpec sig_o, RTLIL::Const lut)
Definition: rtlil.cc:1569
RTLIL::SigSpec Pmux(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s)
bool operator()(T *a, T *b) const
Definition: rtlil.h:272
void unsetParam(RTLIL::IdString paramname)
Definition: rtlil.cc:1824
std::vector< RTLIL::SigBit > bits_
Definition: rtlil.h:967
void operator=(const char *rhs)
Definition: rtlil.h:168
RTLIL::Module * module
Definition: abc.cc:94
void swap_names(RTLIL::Wire *w1, RTLIL::Wire *w2)
Definition: rtlil.cc:1214
std::set< RTLIL::IdString > avail_parameters
Definition: rtlil.h:600
RTLIL::SigSpec Xnor(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
int port_id
Definition: rtlil.h:826
const RTLIL::SigSpec * sig_p
Definition: rtlil.h:952
RTLIL::IdString type
Definition: rtlil.h:854
std::string scratchpad_get_string(std::string varname, std::string default_value=std::string()) const
Definition: rtlil.cc:340
std::map< RTLIL::IdString, RTLIL::Const > parameters
Definition: rtlil.h:856
RTLIL::SigSpec Add(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
void extend_u0(int width, bool is_signed=false)
Definition: rtlil.cc:2612
bool operator!=(const char *rhs) const
Definition: rtlil.h:199
RTLIL::SigSpec signal
Definition: rtlil.h:1145
int size
Definition: rtlil.h:836
RTLIL::Cell * addAdd(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
int size() const
Definition: rtlil.h:1019
#define RTLIL_ATTRIBUTE_MEMBERS
Definition: rtlil.h:571
void hash() const
Definition: rtlil.cc:2259
RTLIL::Const const_or(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:170
bool operator==(const RTLIL::SigSpecIterator &other) const
Definition: rtlil.h:957
bool in(T first, Args...rest)
Definition: rtlil.h:241
void select(T1 *module, T2 *member)
Definition: rtlil.h:559
int * refcount_p
Definition: rtlil.h:405
bool operator<(const RTLIL::SigSpec &other) const
Definition: rtlil.cc:2683
std::vector< RTLIL::SigSpec > compare
Definition: rtlil.h:1119
virtual void check()
Definition: rtlil.cc:948
std::vector< RTLIL::Module * > selected_whole_modules_warn() const
Definition: rtlil.cc:436
RTLIL::SigSpec Neg(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const
Definition: rtlil.cc:397
RTLIL::Cell * addNex(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigSpec ReduceXnor(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
RTLIL::SigBit OrGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b)
RTLIL::Cell * addReduceOr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Const const_ge(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:442
void select(T1 *module)
Definition: rtlil.h:473
virtual RTLIL::IdString derive(RTLIL::Design *design, std::map< RTLIL::IdString, RTLIL::Const > parameters)
Definition: rtlil.cc:467
RTLIL::SigSpec Ge(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
ObjRange(decltype(list_p) list_p, int *refcount_p)
Definition: rtlil.h:407
bool has_processes_warn() const
Definition: rtlil.cc:1086
RTLIL::Const const_and(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:165
std::vector< RTLIL::SigSig > connections_
Definition: rtlil.h:597
void rewrite_sigspecs(T functor)
Definition: rtlil.h:1179
RTLIL::SigSpec Or(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Cell * addNotGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y)
ConstFlags
Definition: rtlil.h:48
void inline_unpack() const
Definition: rtlil.h:977
int offset
Definition: rtlil.h:910
bool operator<(const RTLIL::SigChunk &other) const
Definition: rtlil.cc:1985
RTLIL::Const const_mul(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:478
bool empty() const
Definition: rtlil.h:219
int scratchpad_get_int(std::string varname, int default_value=0) const
Definition: rtlil.cc:306
int start_offset
Definition: rtlil.h:836
virtual void notify_module_add(RTLIL::Module *)
Definition: rtlil.h:493
static std::string escape_id(std::string str)
Definition: rtlil.h:251
bool port_output
Definition: rtlil.h:827
Selection(bool full=true)
Definition: rtlil.h:466
RTLIL::Cell * addLogicAnd(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addNeg(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addAnd(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addShr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
bool packed() const
Definition: rtlil.h:973
bool match(std::string pattern) const
Definition: rtlil.cc:2886
RTLIL_ATTRIBUTE_MEMBERS Module()
Definition: rtlil.cc:448
RTLIL::SigSpec Eq(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Const const_reduce_and(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:198
RTLIL::Wire * wire
Definition: rtlil.h:885
RTLIL::Cell * addXnor(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addMod(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigSpec Div(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
IdString(const IdString &str)
Definition: rtlil.h:159
ObjIterator(const RTLIL::ObjIterator< T > &other)
Definition: rtlil.h:356
RTLIL::Cell * addDlatch(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity=true)
Definition: rtlil.cc:1654
RTLIL::Cell * addReduceAnd(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addDff(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity=true)
Definition: rtlil.cc:1599
virtual void notify_blackout(RTLIL::Module *)
Definition: rtlil.h:498
void connect(const RTLIL::SigSig &conn)
Definition: rtlil.cc:1278
std::set< T > to_set() const
Definition: rtlil.h:430
void append_bit(const RTLIL::SigBit &bit)
Definition: rtlil.cc:2562
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Cell * addAndGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
std::vector< RTLIL::IdString > ports
Definition: rtlil.h:617
size_t size() const
Definition: rtlil.h:411
RTLIL::Cell * addOrGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
bool operator!=(const RTLIL::SigChunk &other) const
Definition: rtlil.cc:2008
bool full_selection() const
Definition: rtlil.h:547
bool operator<(const RTLIL::SigBit &other) const
Definition: rtlil.h:922
bool is_chunk() const
Definition: rtlil.cc:2755
RTLIL::Const const_reduce_xor(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:208
SigBit(const RTLIL::SigChunk &chunk, int index)
Definition: rtlil.h:919
bool selected(T *member) const
Definition: rtlil.h:633
int refcount_modules_
Definition: rtlil.h:506
std::map< RTLIL::IdString, RTLIL::Selection > selection_vars
Definition: rtlil.h:510
RTLIL::SigSpec signal
Definition: rtlil.h:1132
bool operator()(const char *a, const char *b) const
Definition: rtlil.h:80
RTLIL::Const const_sshl(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:310
std::vector< RTLIL::SigChunk > chunks_
Definition: rtlil.h:966
std::string as_string() const
Definition: rtlil.cc:116
RTLIL::Const const_reduce_xnor(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:213
static std::vector< int > global_free_idx_list_
Definition: rtlil.h:97
void select(T1 *module, T2 *member)
Definition: rtlil.h:480
Const(const std::vector< RTLIL::State > &bits)
Definition: rtlil.h:444
SigBit(RTLIL::Wire *wire, int offset)
Definition: rtlil.h:917
RTLIL_ATTRIBUTE_MEMBERS bool hasPort(RTLIL::IdString portname) const
Definition: rtlil.cc:1766
const RTLIL::SigSpec & getPort(RTLIL::IdString portname) const
Definition: rtlil.cc:1809
RTLIL::Cell * addShl(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
bool is_wire() const
Definition: rtlil.cc:2747
RTLIL::Cell * addLogicNot(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::ObjIterator< T > end()
Definition: rtlil.h:409
RTLIL::Const const_xnor(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:180
std::vector< RTLIL::Wire * > selected_wires() const
Definition: rtlil.cc:1093
RTLIL::SigSpecIterator begin()
Definition: rtlil.h:1024
RTLIL::Cell * addLt(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigBit NandGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b)
void optimize()
Definition: rtlil.cc:369
RTLIL::Cell * addAssert(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en)
Definition: rtlil.cc:1579
virtual void notify_connect(RTLIL::Module *, const RTLIL::SigSig &)
Definition: rtlil.h:496
RTLIL::SigSpec Xor(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::IdString name
Definition: rtlil.h:835
std::string decode_string() const
Definition: rtlil.cc:131
void operator=(const std::string &rhs)
Definition: rtlil.h:173
void fixup_ports()
Definition: rtlil.cc:1312
bool in(IdString rhs)
Definition: rtlil.h:245
RTLIL::SigSpecConstIterator begin() const
Definition: rtlil.h:1027
#define log_assert(_assert_expr_)
Definition: log.h:85
bool operator==(const RTLIL::SigBit &other) const
Definition: rtlil.h:930
RTLIL::Const const_shr(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:303
RTLIL::Const const_mod(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:498
bool is_fully_const() const
Definition: rtlil.cc:2763
bool selected(T1 *module, T2 *member) const
Definition: rtlil.h:555
RTLIL::Const const_shl(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:296
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
RTLIL::Cell * addShift(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
const RTLIL::SigBit & operator[](int index) const
Definition: rtlil.h:1022
RTLIL::IdString name
Definition: rtlil.h:599
SigSpec(RTLIL::SigSpec &&other)
Definition: rtlil.h:1001
RTLIL::SigChunk as_chunk() const
Definition: rtlil.cc:2877
static int get_reference(int idx)
Definition: rtlil.h:99
bool selected_whole_module(RTLIL::IdString mod_name) const
Definition: rtlil.cc:388
RTLIL::Cell * addEqx(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
void operator=(RTLIL::Wire &other)=delete
RTLIL::SigSpec Pos(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
std::vector< RTLIL::Cell * > selected_cells() const
Definition: rtlil.cc:1103
const RTLIL::SigSpec & operator=(const RTLIL::SigSpec &other)
Definition: rtlil.cc:2038
RTLIL::Cell * addConcat(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y)
Definition: rtlil.cc:1558
RTLIL::Cell * addMul(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addDlatchsr(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity=true, bool set_polarity=true, bool clr_polarity=true)
Definition: rtlil.cc:1665
RTLIL::Const const_le(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:368
const RTLIL::SigBit & operator*() const
Definition: rtlil.h:1108
int refcount_wires_
Definition: rtlil.h:592
static std::vector< char * > global_id_storage_
Definition: rtlil.h:95
bool full_selection
Definition: rtlil.h:462
RTLIL::Cell * addGe(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
bool scratchpad_get_bool(std::string varname, bool default_value=false) const
Definition: rtlil.cc:324
bool operator<(const RTLIL::Const &other) const
Definition: rtlil.cc:76
RTLIL::SigBit MuxGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s)
RTLIL::Cell * addAdff(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, RTLIL::Const arst_value, bool clk_polarity=true, bool arst_polarity=true)
Definition: rtlil.cc:1639
RTLIL::Process * clone() const
Definition: rtlil.cc:3153
RTLIL::Cell * addSub(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigSpec LogicAnd(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Const const_eqx(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:413
void remove2(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other)
Definition: rtlil.cc:2353
void rewrite_sigspecs(T functor)
Definition: rtlil.h:1205
RTLIL::SigBit to_single_sigbit() const
Definition: rtlil.cc:2945
bool operator!=(const RTLIL::SigSpecIterator &other) const
Definition: rtlil.h:945
void rewrite_sigspecs(T functor)
Definition: rtlil.h:1197
static std::map< char *, int, char_ptr_cmp > global_id_index_
Definition: rtlil.h:96
const RTLIL::SigSpec & operator=(RTLIL::SigSpec &&other)
Definition: rtlil.h:1008
const std::vector< RTLIL::SigBit > & bits() const
Definition: rtlil.h:1017
bool operator==(const RTLIL::SigChunk &other) const
Definition: rtlil.cc:2003
RTLIL::Const const_sshr(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:317
RTLIL::IdString name
Definition: rtlil.h:825
RTLIL::SigBit NotGate(RTLIL::IdString name, RTLIL::SigBit sig_a)
std::vector< RTLIL::SigSig > actions
Definition: rtlil.h:1146
static const char * id2cstr(const RTLIL::IdString &str)
Definition: rtlil.h:267
RTLIL::CaseRule * clone() const
Definition: rtlil.cc:3111
RTLIL::Const const_shiftx(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:352
bool operator!=(const RTLIL::SigBit &other) const
Definition: rtlil.h:934
int as_int(bool is_signed=false) const
Definition: rtlil.cc:104
void remove_const()
Definition: rtlil.cc:2464
RTLIL::Cell * addSr(RTLIL::IdString name, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_q, bool set_polarity=true, bool clr_polarity=true)
Definition: rtlil.cc:1587
IdString(const char *str)
Definition: rtlil.h:158
void operator=(const IdString &rhs)
Definition: rtlil.h:163
std::vector< RTLIL::Module * > selected_whole_modules() const
Definition: rtlil.cc:426
RTLIL::IdString name
Definition: rtlil.h:1154
RTLIL::Module * addModule(RTLIL::IdString name)
Definition: rtlil.cc:270
RTLIL::Module * module(RTLIL::IdString name)
Definition: rtlil.cc:254
std::map< RTLIL::IdString, RTLIL::Process * > processes
Definition: rtlil.h:602
int * refcount_p
Definition: rtlil.h:341
RTLIL::SigBit XnorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b)
RTLIL::Cell * addDffsr(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity=true, bool set_polarity=true, bool clr_polarity=true)
Definition: rtlil.cc:1623
std::string substr(size_t pos=0, size_t len=std::string::npos) const
Definition: rtlil.h:208
void check()
Definition: rtlil.cc:1839
bool has(RTLIL::IdString id) const
Definition: rtlil.h:519
RTLIL::ObjRange< RTLIL::Cell * > cells()
Definition: rtlil.h:641
RTLIL::Cell * addXor(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
virtual size_t count_id(RTLIL::IdString id)
Definition: rtlil.cc:472
RTLIL::ObjRange< RTLIL::Module * > modules()
Definition: rtlil.cc:249
bool operator()(const T *a, const T *b) const
Definition: rtlil.h:232
bool has_memories() const
Definition: rtlil.cc:1069
std::map< RTLIL::IdString, RTLIL::Module * > modules_
Definition: rtlil.h:507
IdString(const std::string &str)
Definition: rtlil.h:160
void replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with)
Definition: rtlil.cc:2297
void sort_and_unify()
Definition: rtlil.cc:2291
bool operator==(const std::string &rhs) const
Definition: rtlil.h:195
RTLIL::SigSpec LogicNot(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
RTLIL::Const const_logic_and(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:241
RTLIL::Cell * cell(RTLIL::IdString id)
Definition: rtlil.h:638
RTLIL::SigSpec Shift(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
#define NULL
std::map< RTLIL::IdString, RTLIL::Cell * > cells_
Definition: rtlil.h:596
RTLIL::Const const_reduce_or(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:203
#define YOSYS_NAMESPACE_BEGIN
Definition: yosys.h:99
char operator[](size_t i) const
Definition: rtlil.h:201
std::map< RTLIL::IdString, T > * list_p
Definition: rtlil.h:340
int as_int(bool is_signed=false) const
Definition: rtlil.cc:2829
RTLIL::SigSpec Sshr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Const const_nex(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:432
static int get_reference(const char *p)
Definition: rtlil.h:105
RTLIL::Const const_div(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:485
RTLIL::SigSpec Pow(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool a_signed=false, bool b_signed=false)
RTLIL::Cell * addLogicOr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Module * module
Definition: rtlil.h:824
RTLIL::Const const_lt(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:357
RTLIL::IdString uniquify(RTLIL::IdString name)
Definition: rtlil.cc:1244
RTLIL::Cell * addDffsrGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity=true, bool set_polarity=true, bool clr_polarity=true)
Definition: rtlil.cc:1700
RTLIL::SigSpec ReduceOr(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
RTLIL::Cell * addGt(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigBit Aoi3Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c)
RTLIL::Cell * addMux(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y)
std::vector< RTLIL::SyncRule * > syncs
Definition: rtlil.h:1157
RTLIL::Cell * addAoi4Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y)
RTLIL::SwitchRule * clone() const
Definition: rtlil.cc:3127
RTLIL::Cell * addShiftx(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
const RTLIL::Const & getParam(RTLIL::IdString paramname) const
Definition: rtlil.cc:1834
RTLIL::SigBit Oai3Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c)
RTLIL::Cell * addMuxGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, RTLIL::SigBit sig_y)
void operator=(RTLIL::Cell &other)=delete
SigBit(bool bit)
Definition: rtlil.h:915
RTLIL::SigSpec extract(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec *other=NULL) const
Definition: rtlil.cc:2414
RTLIL::SigSpec ReduceBool(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
RTLIL::SigSpec And(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::ObjIterator< T > begin()
Definition: rtlil.h:408
RTLIL::SigSpec * sig_p
Definition: rtlil.h:941
RTLIL::SigSpec repeat(int num) const
Definition: rtlil.cc:2631
RTLIL::Cell * addPmux(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y)
void check() const
Definition: rtlil.cc:2642
void scratchpad_set_bool(std::string varname, bool value)
Definition: rtlil.cc:296
std::vector< RTLIL::State > bits
Definition: rtlil.h:438
RTLIL::Cell * addReduceBool(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
std::string as_string() const
Definition: rtlil.cc:2840
RTLIL::Cell * addReduceXnor(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
void append(const RTLIL::SigSpec &signal)
Definition: rtlil.cc:2523
RTLIL::Const const_neg(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:570
std::vector< RTLIL::Module * > selected_modules() const
Definition: rtlil.cc:416
bool operator==(const RTLIL::Const &other) const
Definition: rtlil.cc:86
RTLIL::Cell * addNe(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::Cell * addSshl(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
SyncType
Definition: rtlil.h:38
State
Definition: rtlil.h:29
bool hasParam(RTLIL::IdString paramname) const
Definition: rtlil.cc:1819
bool in(const char *rhs)
Definition: rtlil.h:246
RTLIL::Const const_add(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:464
RTLIL::Cell * addOr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3078
virtual ~Module()
Definition: rtlil.cc:455
SigBit(const RTLIL::SigChunk &chunk)
Definition: rtlil.h:918
void extend(int width, bool is_signed=false)
Definition: rtlil.cc:2593
int start_offset
Definition: rtlil.h:826
void optimize(RTLIL::Design *design)
Definition: rtlil.cc:180
bool operator!=(const std::string &rhs) const
Definition: rtlil.h:196
std::map< RTLIL::IdString, RTLIL::SigSpec > connections_
Definition: rtlil.h:855
RTLIL::Cell * addDlatchsrGate(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity=true, bool set_polarity=true, bool clr_polarity=true)
Definition: rtlil.cc:1732
virtual ~Monitor()
Definition: rtlil.h:492
bool operator==(IdString rhs) const
Definition: rtlil.h:190
static struct RTLIL::IdString::destruct_guard_t destruct_guard
Definition: rtlil.cc:30
bool has_memories_warn() const
Definition: rtlil.cc:1079
RTLIL::SigSpec Le(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
bool operator!=(const RTLIL::Const &other) const
Definition: rtlil.cc:91
bool operator()(T *a, T *b) const
Definition: rtlil.h:278
std::string selected_active_module
Definition: rtlil.h:511
int width_
Definition: rtlil.h:964
virtual void notify_connect(RTLIL::Module *, const std::vector< RTLIL::SigSig > &)
Definition: rtlil.h:497
int width
Definition: rtlil.h:836
std::vector< RTLIL::SigSig > actions
Definition: rtlil.h:1120
RTLIL::SigSpec Shiftx(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Design * design
Definition: rtlil.h:589
std::set< RTLIL::Monitor * > monitors
Definition: rtlil.h:503
RTLIL::Cell * addXnorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
std::string id(RTLIL::IdString internal_id, bool may_rename=true)
virtual void notify_module_del(RTLIL::Module *)
Definition: rtlil.h:494
RTLIL::Const const_reduce_bool(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:225
RTLIL::Cell * addPos(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigSpec Bu0(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
RTLIL::Cell * addLe(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed=false)
RTLIL::SigSpec Mod(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
RTLIL::Cell * addDffe(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity=true, bool en_polarity=true)
Definition: rtlil.cc:1610
void pack() const
Definition: rtlil.cc:2202
bool operator==(const RTLIL::SigSpecIterator &other) const
Definition: rtlil.h:946
RTLIL::Wire * as_wire() const
Definition: rtlil.cc:2868
std::map< RTLIL::SigBit, RTLIL::SigBit > to_sigbit_map(const RTLIL::SigSpec &other) const
Definition: rtlil.cc:2929
std::vector< RTLIL::SwitchRule * > switches
Definition: rtlil.h:1121
std::vector< T > to_vector() const
Definition: rtlil.h:431
bool in(const std::string &rhs)
Definition: rtlil.h:247
std::pair< SigSpec, SigSpec > SigSig
Definition: rtlil.h:71
const std::map< RTLIL::IdString, RTLIL::SigSpec > & connections() const
Definition: rtlil.cc:1814
bool operator()(RTLIL::IdString a, RTLIL::IdString b) const
Definition: rtlil.h:284
RTLIL::Cell * addDffeGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity=true, bool en_polarity=true)
Definition: rtlil.cc:1690
RTLIL::SigSpec Not(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
SigBit(RTLIL::Wire *wire)
Definition: rtlil.h:916
RTLIL::Const const_pos(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:562
RTLIL::Const const_gt(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:453
RTLIL::SigBit & operator*() const
Definition: rtlil.h:1104
bool has_marked_bits() const
Definition: rtlil.cc:2804
std::vector< RTLIL::State > data
Definition: rtlil.h:886
const char * log_id(RTLIL::IdString str)
Definition: log.cc:283
RTLIL::Const const_shift(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:347
int size() const
Definition: rtlil.h:457
size_t size() const
Definition: rtlil.h:215
RTLIL::SigSpecIterator end()
Definition: rtlil.h:1025
RTLIL::Module * module
Definition: rtlil.h:852
static bool parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:2972
std::map< std::string, std::string > scratchpad
Definition: rtlil.h:504
std::vector< RTLIL::SigBit > to_sigbit_vector() const
Definition: rtlil.cc:2921
bool operator==(const RTLIL::SigSpec &other) const
Definition: rtlil.cc:2715
void rewrite_sigspecs(T functor)
Definition: rtlil.h:1215
RTLIL::Const const_not(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len)
Definition: calc.cc:125
RTLIL::Cell * addPow(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed=false, bool b_signed=false)
void rename(RTLIL::Wire *wire, RTLIL::IdString new_name)
Definition: rtlil.cc:1185
virtual void notify_connect(RTLIL::Cell *, const RTLIL::IdString &, const RTLIL::SigSpec &, RTLIL::SigSpec &)
Definition: rtlil.h:495
int refcount_cells_
Definition: rtlil.h:593
bool operator==(const char *rhs) const
Definition: rtlil.h:198
RTLIL::SigSpecConstIterator end() const
Definition: rtlil.h:1028
RTLIL::SigSpec ReduceAnd(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed=false)
bool has_keep_attr() const
Definition: rtlil.h:875
bool has_processes() const
Definition: rtlil.cc:1074
const std::vector< RTLIL::SigChunk > & chunks() const
Definition: rtlil.h:1016
static std::vector< int > global_refcount_storage_
Definition: rtlil.h:94
RTLIL::SigSpec Eqx(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
void scratchpad_set_string(std::string varname, std::string value)
Definition: rtlil.cc:301
RTLIL_ATTRIBUTE_MEMBERS RTLIL::CaseRule root_case
Definition: rtlil.h:1156
static void put_reference(int idx)
Definition: rtlil.h:135
RTLIL::Cell * addAdffGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool arst_value=false, bool clk_polarity=true, bool arst_polarity=true)
Definition: rtlil.cc:1712
RTLIL::SigSpec LogicOr(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)
bool in(const std::set< IdString > &rhs)
Definition: rtlil.h:248
RTLIL::Cell * addOai3Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y)
bool operator<(IdString rhs) const
Definition: rtlil.h:186
virtual RTLIL::Module * clone() const
Definition: rtlil.cc:1061
RTLIL::SigSpec Nex(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed=false)