yosys-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
sigtools.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 #ifndef SIGTOOLS_H
21 #define SIGTOOLS_H
22 
23 #include "kernel/yosys.h"
24 
26 
27 struct SigPool
28 {
29  struct bitDef_t : public std::pair<RTLIL::Wire*, int> {
30  bitDef_t() : std::pair<RTLIL::Wire*, int>(NULL, 0) { }
31  bitDef_t(const RTLIL::SigBit &bit) : std::pair<RTLIL::Wire*, int>(bit.wire, bit.offset) { }
32  };
33 
34  std::set<bitDef_t> bits;
35 
36  void clear()
37  {
38  bits.clear();
39  }
40 
41  void add(RTLIL::SigSpec sig)
42  {
43  for (auto &bit : sig)
44  if (bit.wire != NULL)
45  bits.insert(bit);
46  }
47 
48  void add(const SigPool &other)
49  {
50  for (auto &bit : other.bits)
51  bits.insert(bit);
52  }
53 
54  void del(RTLIL::SigSpec sig)
55  {
56  for (auto &bit : sig)
57  if (bit.wire != NULL)
58  bits.erase(bit);
59  }
60 
61  void del(const SigPool &other)
62  {
63  for (auto &bit : other.bits)
64  bits.erase(bit);
65  }
66 
68  {
69  log_assert(GetSize(from) == GetSize(to));
70  for (int i = 0; i < GetSize(from); i++) {
71  bitDef_t bit_from(from[i]), bit_to(to[i]);
72  if (bit_from.first != NULL && bit_to.first != NULL && bits.count(bit_from) > 0)
73  bits.insert(bit_to);
74  }
75  }
76 
78  {
79  RTLIL::SigSpec result;
80  for (auto &bit : sig)
81  if (bit.wire != NULL && bits.count(bit))
82  result.append_bit(bit);
83  return result;
84  }
85 
87  {
88  RTLIL::SigSpec result;
89  for (auto &bit : sig)
90  if (bit.wire != NULL && bits.count(bit) == 0)
91  result.append(bit);
92  return result;
93  }
94 
95  bool check(RTLIL::SigBit bit)
96  {
97  return bit.wire != NULL && bits.count(bit);
98  }
99 
101  {
102  for (auto &bit : sig)
103  if (bit.wire != NULL && bits.count(bit))
104  return true;
105  return false;
106  }
107 
109  {
110  for (auto &bit : sig)
111  if (bit.wire != NULL && bits.count(bit) == 0)
112  return false;
113  return true;
114  }
115 
117  {
118  for (auto &bit : bits)
119  return RTLIL::SigSpec(bit.first, bit.second);
120  return RTLIL::SigSpec();
121  }
122 
124  {
125  std::set<RTLIL::SigBit> sig;
126  for (auto &bit : bits)
127  sig.insert(RTLIL::SigBit(bit.first, bit.second));
128  return sig;
129  }
130 
131  size_t size()
132  {
133  return bits.size();
134  }
135 };
136 
137 template <typename T, class Compare = std::less<T>>
138 struct SigSet
139 {
140  struct bitDef_t : public std::pair<RTLIL::Wire*, int> {
141  bitDef_t() : std::pair<RTLIL::Wire*, int>(NULL, 0) { }
142  bitDef_t(const RTLIL::SigBit &bit) : std::pair<RTLIL::Wire*, int>(bit.wire, bit.offset) { }
143  };
144 
145  std::map<bitDef_t, std::set<T, Compare>> bits;
146 
147  void clear()
148  {
149  bits.clear();
150  }
151 
152  void insert(RTLIL::SigSpec sig, T data)
153  {
154  for (auto &bit : sig)
155  if (bit.wire != NULL)
156  bits[bit].insert(data);
157  }
158 
159  void insert(RTLIL::SigSpec sig, const std::set<T> &data)
160  {
161  for (auto &bit : sig)
162  if (bit.wire != NULL)
163  bits[bit].insert(data.begin(), data.end());
164  }
165 
167  {
168  for (auto &bit : sig)
169  if (bit.wire != NULL)
170  bits[bit].clear();
171  }
172 
173  void erase(RTLIL::SigSpec sig, T data)
174  {
175  for (auto &bit : sig)
176  if (bit.wire != NULL)
177  bits[bit].erase(data);
178  }
179 
180  void erase(RTLIL::SigSpec sig, const std::set<T> &data)
181  {
182  for (auto &bit : sig)
183  if (bit.wire != NULL)
184  bits[bit].erase(data.begin(), data.end());
185  }
186 
187  void find(RTLIL::SigSpec sig, std::set<T> &result)
188  {
189  for (auto &bit : sig)
190  if (bit.wire != NULL) {
191  auto &data = bits[bit];
192  result.insert(data.begin(), data.end());
193  }
194  }
195 
196  std::set<T> find(RTLIL::SigSpec sig)
197  {
198  std::set<T> result;
199  find(sig, result);
200  return result;
201  }
202 
203  bool has(RTLIL::SigSpec sig)
204  {
205  for (auto &bit : sig)
206  if (bit.wire != NULL && bits.count(bit))
207  return true;
208  return false;
209  }
210 };
211 
212 struct SigMap
213 {
214  struct bitDef_t : public std::pair<RTLIL::Wire*, int> {
215  bitDef_t() : std::pair<RTLIL::Wire*, int>(NULL, 0) { }
216  bitDef_t(const RTLIL::SigBit &bit) : std::pair<RTLIL::Wire*, int>(bit.wire, bit.offset) { }
217  };
218 
221  std::set<bitDef_t> bits;
222  };
223 
224  std::map<bitDef_t, shared_bit_data_t*> bits;
225 
227  {
228  if (module != NULL)
229  set(module);
230  }
231 
232  SigMap(const SigMap &other)
233  {
234  copy(other);
235  }
236 
237  const SigMap &operator=(const SigMap &other)
238  {
239  copy(other);
240  return *this;
241  }
242 
243  void copy(const SigMap &other)
244  {
245  clear();
246  for (auto &bit : other.bits) {
247  bits[bit.first] = new shared_bit_data_t;
248  bits[bit.first]->map_to = bit.second->map_to;
249  bits[bit.first]->bits = bit.second->bits;
250  }
251  }
252 
253  void swap(SigMap &other)
254  {
255  bits.swap(other.bits);
256  }
257 
259  {
260  clear();
261  }
262 
263  void clear()
264  {
265  std::set<shared_bit_data_t*> all_bd_ptr;
266  for (auto &it : bits)
267  all_bd_ptr.insert(it.second);
268  for (auto bd_ptr : all_bd_ptr)
269  delete bd_ptr;
270  bits.clear();
271  }
272 
274  {
275  clear();
276  for (auto &it : module->connections())
277  add(it.first, it.second);
278  }
279 
280  // internal helper function
281  void register_bit(const RTLIL::SigBit &bit)
282  {
283  if (bit.wire && bits.count(bit) == 0) {
285  bd->map_to = bit;
286  bd->bits.insert(bit);
287  bits[bit] = bd;
288  }
289  }
290 
291  // internal helper function
292  void unregister_bit(const RTLIL::SigBit &bit)
293  {
294  if (bit.wire && bits.count(bit) > 0) {
295  shared_bit_data_t *bd = bits[bit];
296  bd->bits.erase(bit);
297  if (bd->bits.size() == 0)
298  delete bd;
299  bits.erase(bit);
300  }
301  }
302 
303  // internal helper function
304  void merge_bit(const RTLIL::SigBit &bit1, const RTLIL::SigBit &bit2)
305  {
306  log_assert(bit1.wire != NULL && bit2.wire != NULL);
307 
308  shared_bit_data_t *bd1 = bits[bit1];
309  shared_bit_data_t *bd2 = bits[bit2];
310  log_assert(bd1 != NULL && bd2 != NULL);
311 
312  if (bd1 == bd2)
313  return;
314 
315  if (bd1->bits.size() < bd2->bits.size())
316  {
317  for (auto &bit : bd1->bits)
318  bits[bit] = bd2;
319  bd2->bits.insert(bd1->bits.begin(), bd1->bits.end());
320  delete bd1;
321  }
322  else
323  {
324  bd1->map_to = bd2->map_to;
325  for (auto &bit : bd2->bits)
326  bits[bit] = bd1;
327  bd1->bits.insert(bd2->bits.begin(), bd2->bits.end());
328  delete bd2;
329  }
330  }
331 
332  // internal helper function
333  void set_bit(const RTLIL::SigBit &bit1, const RTLIL::SigBit &bit2)
334  {
335  log_assert(bit1.wire != NULL);
336  log_assert(bits.count(bit1) > 0);
337  bits[bit1]->map_to = bit2;
338  }
339 
340  // internal helper function
341  void map_bit(RTLIL::SigBit &bit) const
342  {
343  if (bit.wire && bits.count(bit) > 0)
344  bit = bits.at(bit)->map_to;
345  }
346 
348  {
349  log_assert(GetSize(from) == GetSize(to));
350 
351  for (int i = 0; i < GetSize(from); i++)
352  {
353  RTLIL::SigBit &bf = from[i];
354  RTLIL::SigBit &bt = to[i];
355 
356  if (bf.wire == NULL)
357  continue;
358 
359  register_bit(bf);
360  register_bit(bt);
361 
362  if (bt.wire != NULL)
363  merge_bit(bf, bt);
364  else
365  set_bit(bf, bt);
366  }
367  }
368 
369  void add(RTLIL::SigSpec sig)
370  {
371  for (auto &bit : sig) {
372  register_bit(bit);
373  set_bit(bit, bit);
374  }
375  }
376 
377  void del(RTLIL::SigSpec sig)
378  {
379  for (auto &bit : sig)
380  unregister_bit(bit);
381  }
382 
383  void apply(RTLIL::SigBit &bit) const
384  {
385  map_bit(bit);
386  }
387 
388  void apply(RTLIL::SigSpec &sig) const
389  {
390  for (auto &bit : sig)
391  map_bit(bit);
392  }
393 
395  {
396  apply(bit);
397  return bit;
398  }
399 
401  {
402  apply(sig);
403  return sig;
404  }
405 
407  {
408  RTLIL::SigSpec sig(wire);
409  apply(sig);
410  return sig;
411  }
412 };
413 
415 
416 #endif /* SIGTOOLS_H */
void insert(RTLIL::SigSpec sig, const std::set< T > &data)
Definition: sigtools.h:159
RTLIL::Wire * wire
Definition: rtlil.h:907
RTLIL::SigSpec extract(RTLIL::SigSpec sig)
Definition: sigtools.h:77
bitDef_t(const RTLIL::SigBit &bit)
Definition: sigtools.h:31
bitDef_t(const RTLIL::SigBit &bit)
Definition: sigtools.h:216
std::map< bitDef_t, shared_bit_data_t * > bits
Definition: sigtools.h:224
SigMap(RTLIL::Module *module=NULL)
Definition: sigtools.h:226
bool has(RTLIL::SigSpec sig)
Definition: sigtools.h:203
void expand(RTLIL::SigSpec from, RTLIL::SigSpec to)
Definition: sigtools.h:67
size_t size()
Definition: sigtools.h:131
RTLIL::SigSpec export_one()
Definition: sigtools.h:116
void add(const SigPool &other)
Definition: sigtools.h:48
void del(RTLIL::SigSpec sig)
Definition: sigtools.h:377
void merge_bit(const RTLIL::SigBit &bit1, const RTLIL::SigBit &bit2)
Definition: sigtools.h:304
void map_bit(RTLIL::SigBit &bit) const
Definition: sigtools.h:341
const std::vector< RTLIL::SigSig > & connections() const
Definition: rtlil.cc:1307
#define YOSYS_NAMESPACE_END
Definition: yosys.h:100
void erase(RTLIL::SigSpec sig)
Definition: sigtools.h:166
void clear()
Definition: sigtools.h:263
RTLIL::Module * module
Definition: abc.cc:94
SigMap(const SigMap &other)
Definition: sigtools.h:232
void add(RTLIL::SigSpec sig)
Definition: sigtools.h:369
bitDef_t(const RTLIL::SigBit &bit)
Definition: sigtools.h:142
void swap(SigMap &other)
Definition: sigtools.h:253
void clear()
Definition: sigtools.h:36
void erase(RTLIL::SigSpec sig, T data)
Definition: sigtools.h:173
void apply(RTLIL::SigBit &bit) const
Definition: sigtools.h:383
void set(RTLIL::Module *module)
Definition: sigtools.h:273
bool check_any(RTLIL::SigSpec sig)
Definition: sigtools.h:100
void append_bit(const RTLIL::SigBit &bit)
Definition: rtlil.cc:2562
void clear()
Definition: sigtools.h:147
int GetSize(RTLIL::Wire *wire)
Definition: yosys.cc:334
void unregister_bit(const RTLIL::SigBit &bit)
Definition: sigtools.h:292
#define log_assert(_assert_expr_)
Definition: log.h:85
RTLIL::SigSpec export_all()
Definition: sigtools.h:123
std::set< bitDef_t > bits
Definition: sigtools.h:221
bool check_all(RTLIL::SigSpec sig)
Definition: sigtools.h:108
void copy(const SigMap &other)
Definition: sigtools.h:243
void set_bit(const RTLIL::SigBit &bit1, const RTLIL::SigBit &bit2)
Definition: sigtools.h:333
void del(const SigPool &other)
Definition: sigtools.h:61
void add(RTLIL::SigSpec sig)
Definition: sigtools.h:41
bool check(RTLIL::SigBit bit)
Definition: sigtools.h:95
void erase(RTLIL::SigSpec sig, const std::set< T > &data)
Definition: sigtools.h:180
std::set< T > find(RTLIL::SigSpec sig)
Definition: sigtools.h:196
RTLIL::SigBit operator()(RTLIL::SigBit bit) const
Definition: sigtools.h:394
#define NULL
#define YOSYS_NAMESPACE_BEGIN
Definition: yosys.h:99
~SigMap()
Definition: sigtools.h:258
void apply(RTLIL::SigSpec &sig) const
Definition: sigtools.h:388
std::set< bitDef_t > bits
Definition: sigtools.h:34
void append(const RTLIL::SigSpec &signal)
Definition: rtlil.cc:2523
void register_bit(const RTLIL::SigBit &bit)
Definition: sigtools.h:281
void add(RTLIL::SigSpec from, RTLIL::SigSpec to)
Definition: sigtools.h:347
std::map< bitDef_t, std::set< T, Compare > > bits
Definition: sigtools.h:145
RTLIL::SigSpec operator()(RTLIL::SigSpec sig) const
Definition: sigtools.h:400
void del(RTLIL::SigSpec sig)
Definition: sigtools.h:54
RTLIL::SigBit map_to
Definition: sigtools.h:220
RTLIL::SigSpec operator()(RTLIL::Wire *wire) const
Definition: sigtools.h:406
void find(RTLIL::SigSpec sig, std::set< T > &result)
Definition: sigtools.h:187
void insert(RTLIL::SigSpec sig, T data)
Definition: sigtools.h:152
const SigMap & operator=(const SigMap &other)
Definition: sigtools.h:237