ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
rrrBddAnalyzer.h
Go to the documentation of this file.
1#pragma once
2
3#include "rrrParameter.h"
4#include "rrrUtils.h"
5#include "rrrBddManager.h"
6
8
9namespace rrr {
10
11 template <typename Ntk>
13 private:
14 // aliases
15 using lit = int;
16 static constexpr lit LitMax = 0xffffffff;
17
18 // pointer to network
19 Ntk *pNtk;
20
21 // parameters
22 int nVerbose;
23
24 // data
25 bool fInitialized;
26 NewBdd::Man *pBdd;
27 int target;
28 std::vector<lit> vFs;
29 std::vector<lit> vGs;
30 std::vector<std::vector<lit>> vvCs;
31 bool fResim;
32 std::vector<bool> vUpdates;
33 std::vector<bool> vGUpdates;
34 std::vector<bool> vCUpdates;
35
36 // backups
37 std::vector<BddAnalyzer> vBackups;
38
39 // stats
40 uint64_t nNodesOld;
41 uint64_t nNodesAccumulated;
42 double durationSimulation;
43 double durationPf;
44 double durationCheck;
45 double durationReorder;
46
47 // BDD utils
48 void IncRef(lit x) const;
49 void DecRef(lit x) const;
50 void Assign(lit &x, lit y) const;
51 void CopyVec(std::vector<lit> &x, std::vector<lit> const &y) const;
52 void DelVec(std::vector<lit> &v) const;
53 void CopyVecVec(std::vector<std::vector<lit>> &x, std::vector<std::vector<lit>> const &y) const;
54 void DelVecVec(std::vector<std::vector<lit>> &v) const;
55 lit Xor(lit x, lit y) const;
56
57 // callback
58 void ActionCallback(Action const &action);
59
60 // allocation
61 void Allocate();
62
63 // simulation
64 void SimulateNode(int id, std::vector<lit> &v) const;
65 void Simulate();
66
67 // CSPF computation
68 bool ComputeG(int id);
69 void ComputeC(int id);
70 void CspfNode(int id);
71 void Cspf(int id = -1, bool fC = true);
72
73 // preparation
74 void Reset(bool fReuse = false);
75 void Initialize();
76
77 // save & load
78 void Save(int slot);
79 void Load(int slot);
80 void PopBack();
81
82 public:
83 // constructors
85 BddAnalyzer(Parameter const *pPar);
87 void AssignNetwork(Ntk *pNtk_, bool fReuse);
88
89 // checks
90 bool CheckRedundancy(int id, int idx);
91 bool CheckFeasibility(int id, int fi, bool c);
92
93 // summary
94 void ResetSummary();
97 };
98
99 /* {{{ BDD utils */
100
101 template <typename Ntk>
102 inline void BddAnalyzer<Ntk>::IncRef(lit x) const {
103 if(x != LitMax) {
104 pBdd->IncRef(x);
105 }
106 }
107
108 template <typename Ntk>
109 inline void BddAnalyzer<Ntk>::DecRef(lit x) const {
110 if(x != LitMax) {
111 pBdd->DecRef(x);
112 }
113 }
114
115 template <typename Ntk>
116 inline void BddAnalyzer<Ntk>::Assign(lit &x, lit y) const {
117 DecRef(x);
118 x = y;
119 IncRef(x);
120 }
121
122 template <typename Ntk>
123 inline void BddAnalyzer<Ntk>::CopyVec(std::vector<lit> &x, std::vector<lit> const &y) const {
124 for(size_t i = y.size(); i < x.size(); i++) {
125 DecRef(x[i]);
126 }
127 x.resize(y.size(), LitMax);
128 for(size_t i = 0; i < y.size(); i++) {
129 if(x[i] != y[i]) {
130 DecRef(x[i]);
131 x[i] = y[i];
132 IncRef(x[i]);
133 }
134 }
135 }
136
137 template <typename Ntk>
138 inline void BddAnalyzer<Ntk>::DelVec(std::vector<lit> &v) const {
139 for(lit x: v) {
140 DecRef(x);
141 }
142 v.clear();
143 }
144
145 template <typename Ntk>
146 inline void BddAnalyzer<Ntk>::CopyVecVec(std::vector<std::vector<lit>> &x, std::vector<std::vector<lit>> const &y) const {
147 for(size_t i = y.size(); i < x.size(); i++) {
148 DelVec(x[i]);
149 }
150 x.resize(y.size());
151 for(size_t i = 0; i < y.size(); i++) {
152 CopyVec(x[i], y[i]);
153 }
154 }
155
156 template <typename Ntk>
157 inline void BddAnalyzer<Ntk>::DelVecVec(std::vector<std::vector<lit>> &v) const {
158 for(size_t i = 0; i < v.size(); i++) {
159 DelVec(v[i]);
160 }
161 v.clear();
162 }
163
164 template <typename Ntk>
165 inline int BddAnalyzer<Ntk>::Xor(lit x, lit y) const {
166 lit f = pBdd->And(x, pBdd->LitNot(y));
167 pBdd->IncRef(f);
168 lit g = pBdd->And(pBdd->LitNot(x), y);
169 pBdd->IncRef(g);
170 lit r = pBdd->Or(f, g);
171 pBdd->DecRef(f);
172 pBdd->DecRef(g);
173 return r;
174 }
175
176 /* }}} */
177
178 /* {{{ Callback */
179
180 template <typename Ntk>
181 void BddAnalyzer<Ntk>::ActionCallback(Action const &action) {
182 switch(action.type) {
183 case REMOVE_FANIN:
184 assert(fInitialized);
185 vUpdates[action.id] = true;
186 vGUpdates[action.fi] = true;
187 DecRef(vvCs[action.id][action.idx]);
188 vvCs[action.id].erase(vvCs[action.id].begin() + action.idx);
189 if(target != action.id) {
190 // require resimulate before next fesibility check
191 // (this is not mandatory if no pending updates are in TFI of new fanin, but we would rather update than checking every time)
192 target = -1;
193 }
194 break;
195 case REMOVE_UNUSED:
196 if(fInitialized) {
197 if(vGUpdates[action.id] || vCUpdates[action.id]) {
198 for(int fi: action.vFanins) {
199 vGUpdates[fi] = true;
200 }
201 }
202 Assign(vFs[action.id], LitMax);
203 Assign(vGs[action.id], LitMax);
204 DelVec(vvCs[action.id]);
205 }
206 break;
207 case REMOVE_BUFFER:
208 if(fInitialized) {
209 if(vUpdates[action.id]) {
210 for(int fo: action.vFanouts) {
211 vUpdates[fo] = true;
212 vCUpdates[fo] = true;
213 }
214 }
215 if(vGUpdates[action.id] || vCUpdates[action.id]) {
216 vGUpdates[action.fi] = true;
217 }
218 Assign(vFs[action.id], LitMax);
219 Assign(vGs[action.id], LitMax);
220 DelVec(vvCs[action.id]);
221 }
222 break;
223 case REMOVE_CONST:
224 if(fInitialized) {
225 if(vUpdates[action.id]) {
226 for(int fo: action.vFanouts) {
227 vUpdates[fo] = true;
228 vCUpdates[fo] = true;
229 }
230 }
231 for(int fi: action.vFanins) {
232 vGUpdates[fi] = true;
233 }
234 Assign(vFs[action.id], LitMax);
235 Assign(vGs[action.id], LitMax);
236 DelVec(vvCs[action.id]);
237 }
238 break;
239 case ADD_FANIN:
240 assert(action.id == target);
241 assert(fInitialized);
242 vUpdates[action.id] = true;
243 vCUpdates[action.id] = true;
244 vvCs[action.id].insert(vvCs[action.id].begin() + action.idx, LitMax);
245 break;
246 case TRIVIAL_COLLAPSE:
247 if(fInitialized) {
248 if(vGUpdates[action.fi] || vCUpdates[action.fi]) {
249 vCUpdates[action.id] = true;
250 }
251 std::vector<lit>::iterator it = vvCs[action.id].begin() + action.idx;
252 DecRef(*it);
253 it = vvCs[action.id].erase(it);
254 vvCs[action.id].insert(it, vvCs[action.fi].begin(), vvCs[action.fi].end());
255 vvCs[action.fi].clear();
256 Assign(vFs[action.fi], LitMax);
257 Assign(vGs[action.fi], LitMax);
258 }
259 break;
261 if(fInitialized) {
262 Allocate();
263 SimulateNode(action.fi, vFs);
264 // time of this simulation is not measured for simplicity sake
265 assert(vGs[action.fi] == LitMax);
266 Assign(vGs[action.fi], vGs[action.id]);
267 std::vector<lit>::iterator it = vvCs[action.id].begin() + action.idx;
268 assert(vvCs[action.fi].empty());
269 vvCs[action.fi].insert(vvCs[action.fi].begin(), it, vvCs[action.id].end());
270 vvCs[action.id].erase(it, vvCs[action.id].end());
271 assert(vvCs[action.id].size() == action.idx);
272 vvCs[action.id].resize(action.idx + 1, LitMax);
273 Assign(vvCs[action.id][action.idx], vGs[action.fi]);
274 vUpdates[action.fi] = false;
275 vGUpdates[action.fi] = false;
276 vCUpdates[action.fi] = vCUpdates[action.id];
277 }
278 break;
279 case SORT_FANINS:
280 if(fInitialized) {
281 std::vector<lit> vCs = vvCs[action.id];
282 vvCs[action.id].clear();
283 for(int index: action.vIndices) {
284 vvCs[action.id].push_back(vCs[index]);
285 }
286 if(!fResim) {
287 fResim = true;
288 /* commenting out the following because it might not be worth checking
289 // if sorted node is in TFO of functionally updated nodes, resimulation is required
290 std::vector<int> vFanouts;
291 pNtk->ForEachInt([&](int id) {
292 if(vUpdates[id]) {
293 pNtk->ForEachFanout(id, false, [&](int fo) {
294 vFanouts.push_back(fo);
295 });
296 }
297 });
298 pNtk->ForEachTfos(vFanouts, false, [&](int fo) {
299 if(fResim) {
300 return;
301 }
302 if(fo == action.id) {
303 fResim = true;
304 }
305 });
306 */
307 }
308 vCUpdates[action.id] = true;
309 }
310 break;
311 case READ:
312 Reset(!action.fNew);
313 break;
314 case SAVE:
315 Save(action.idx);
316 break;
317 case LOAD:
318 Load(action.idx);
319 break;
320 case POP_BACK:
321 PopBack();
322 break;
323 default:
324 assert(0);
325 }
326 }
327
328 /* }}} */
329
330 /* {{{ Allocation */
331
332 template <typename Ntk>
333 void BddAnalyzer<Ntk>::Allocate() {
334 int nNodes = pNtk->GetNumNodes();
335 vFs.resize(nNodes, LitMax);
336 vGs.resize(nNodes, LitMax);
337 vvCs.resize(nNodes);
338 vUpdates.resize(nNodes);
339 vGUpdates.resize(nNodes);
340 vCUpdates.resize(nNodes);
341 }
342
343 /* }}} */
344
345 /* {{{ Simulation */
346
347 template <typename Ntk>
348 inline void BddAnalyzer<Ntk>::SimulateNode(int id, std::vector<lit> &v) const {
349 if(nVerbose) {
350 std::cout << "simulating node " << id << std::endl;
351 }
352 Assign(v[id], pBdd->Const1());
353 pNtk->ForEachFanin(id, [&](int fi, bool c) {
354 Assign(v[id], pBdd->And(v[id], pBdd->LitNotCond(v[fi], c)));
355 });
356 }
357
358 template <typename Ntk>
359 void BddAnalyzer<Ntk>::Simulate() {
360 time_point timeStart = GetCurrentTime();
361 if(nVerbose) {
362 std::cout << "symbolic simulation with BDD" << std::endl;
363 }
364 pNtk->ForEachInt([&](int id) {
365 if(vUpdates[id]) {
366 lit x = vFs[id];
367 IncRef(x);
368 SimulateNode(id, vFs);
369 DecRef(x);
370 if(!pBdd->LitIsEq(x, vFs[id])) {
371 pNtk->ForEachFanout(id, false, [&](int fo) {
372 vUpdates[fo] = true;
373 vCUpdates[fo] = true;
374 });
375 }
376 vUpdates[id] = false;
377 }
378 });
379 durationSimulation += Duration(timeStart, GetCurrentTime());
380 }
381
382 /* }}} */
383
384 /* {{{ CSPF computation */
385
386 template <typename Ntk>
387 inline bool BddAnalyzer<Ntk>::ComputeG(int id) {
388 if(pNtk->GetNumFanouts(id) == 0) {
389 if(pBdd->IsConst1(vGs[id])) {
390 return false;
391 }
392 Assign(vGs[id], pBdd->Const1());
393 return true;
394 }
395 lit x = pBdd->Const1();
396 IncRef(x);
397 pNtk->ForEachFanoutRidx(id, true, [&](int fo, int idx) {
398 Assign(x, pBdd->And(x, vvCs[fo][idx]));
399 });
400 if(pBdd->LitIsEq(vGs[id], x)) {
401 DecRef(x);
402 return false;
403 }
404 Assign(vGs[id], x);
405 DecRef(x);
406 return true;
407 }
408
409 template <typename Ntk>
410 inline void BddAnalyzer<Ntk>::ComputeC(int id) {
411 int nFanins = pNtk->GetNumFanins(id);
412 assert(vvCs[id].size() == nFanins);
413 if(pBdd->IsConst1(vGs[id])) {
414 for(int idx = 0; idx < nFanins; idx++) {
415 if(!pBdd->IsConst1(vvCs[id][idx])) {
416 Assign(vvCs[id][idx], pBdd->Const1());
417 int fi = pNtk->GetFanin(id, idx);
418 vGUpdates[fi] = true;
419 }
420 }
421 return;
422 }
423 for(int idx = 0; idx < nFanins; idx++) {
424 lit x = pBdd->Const1();
425 IncRef(x);
426 for(int idx2 = idx + 1; idx2 < nFanins; idx2++) {
427 int fi = pNtk->GetFanin(id, idx2);
428 bool c = pNtk->GetCompl(id, idx2);
429 Assign(x, pBdd->And(x, pBdd->LitNotCond(vFs[fi], c)));
430 }
431 Assign(x, pBdd->Or(pBdd->LitNot(x), vGs[id]));
432 if(!pBdd->LitIsEq(vvCs[id][idx], x)) {
433 Assign(vvCs[id][idx], x);
434 int fi = pNtk->GetFanin(id, idx);
435 vGUpdates[fi] = true;
436 }
437 DecRef(x);
438 }
439 }
440
441 template <typename Ntk>
442 void BddAnalyzer<Ntk>::CspfNode(int id) {
443 if(!vGUpdates[id] && !vCUpdates[id]) {
444 return;
445 }
446 if(vGUpdates[id]) {
447 if(nVerbose) {
448 std::cout << "computing node " << id << " G " << std::endl;
449 }
450 if(ComputeG(id)) {
451 vCUpdates[id] = true;
452 }
453 vGUpdates[id] = false;
454 }
455 if(vCUpdates[id]) {
456 if(nVerbose) {
457 std::cout << "computing node " << id << " C " << std::endl;
458 }
459 ComputeC(id);
460 vCUpdates[id] = false;
461 }
462 }
463
464 template <typename Ntk>
465 void BddAnalyzer<Ntk>::Cspf(int id, bool fC) {
466 time_point timeStart = GetCurrentTime();
467 if(id != -1) {
468 pNtk->ForEachTfoReverse(id, false, [&](int fo) {
469 CspfNode(fo);
470 });
471 bool fCUpdate = vCUpdates[id];
472 if(!fC) {
473 vCUpdates[id] = false;
474 }
475 CspfNode(id);
476 if(!fC) {
477 vCUpdates[id] = fCUpdate;
478 }
479 } else {
480 pNtk->ForEachIntReverse([&](int id) {
481 CspfNode(id);
482 });
483 }
484 durationPf += Duration(timeStart, GetCurrentTime());
485 }
486
487 /* }}} */
488
489 /* {{{ Preparation */
490
491 template <typename Ntk>
492 void BddAnalyzer<Ntk>::Reset(bool fReuse) {
493 while(!vBackups.empty()) {
494 PopBack();
495 }
496 DelVec(vFs);
497 DelVec(vGs);
498 DelVecVec(vvCs);
499 fInitialized = false;
500 target = -1;
501 fResim = false;
502 vUpdates.clear();
503 vGUpdates.clear();
504 vCUpdates.clear();
505 if(!fReuse) {
506 nNodesOld = 0;
507 if(pBdd) {
508 nNodesAccumulated += pBdd->GetNumTotalCreatedNodes();
509 }
510 delete pBdd;
511 pBdd = NULL;
512 }
513 }
514
515 template <typename Ntk>
516 void BddAnalyzer<Ntk>::Initialize() {
517 bool fUseReo = false;
518 if(!pBdd) {
519 NewBdd::Param Par;
520 Par.nObjsMaxLog = 25;
521 Par.nCacheMaxLog = 20;
522 Par.fCountOnes = false;
523 Par.nGbc = 1;
524 Par.nReo = 4000;
525 pBdd = new NewBdd::Man(pNtk->GetNumPis(), Par);
526 fUseReo = true;
527 }
528 assert(pBdd->GetNumVars() == pNtk->GetNumPis());
529 Allocate();
530 Assign(vFs[0], pBdd->Const0());
531 int idx = 0;
532 pNtk->ForEachPi([&](int id) {
533 Assign(vFs[id], pBdd->IthVar(idx));
534 idx++;
535 });
536 pNtk->ForEachInt([&](int id) {
537 vUpdates[id] = true;
538 });
539 Simulate();
540 if(fUseReo) {
541 time_point timeStart = GetCurrentTime();
542 pBdd->Reorder();
543 pBdd->TurnOffReo();
544 durationReorder += Duration(timeStart, GetCurrentTime());
545 }
546 pNtk->ForEachInt([&](int id) {
547 vvCs[id].resize(pNtk->GetNumFanins(id), LitMax);
548 });
549 pNtk->ForEachPo([&](int id) {
550 vvCs[id].resize(1, LitMax);
551 Assign(vvCs[id][0], pBdd->Const0());
552 int fi = pNtk->GetFanin(id, 0);
553 vGUpdates[fi] = true;
554 });
555 fInitialized = true;
556 }
557
558 /* }}} */
559
560 /* {{{ Save & load */
561
562 template <typename Ntk>
563 void BddAnalyzer<Ntk>::Save(int slot) {
564 if(slot >= int_size(vBackups)) {
565 vBackups.resize(slot + 1);
566 }
567 vBackups[slot].target = target;
568 CopyVec(vBackups[slot].vFs, vFs);
569 CopyVec(vBackups[slot].vGs, vGs);
570 CopyVecVec(vBackups[slot].vvCs, vvCs);
571 vBackups[slot].vUpdates = vUpdates;
572 vBackups[slot].vGUpdates = vGUpdates;
573 vBackups[slot].vCUpdates = vCUpdates;
574 }
575
576 template <typename Ntk>
577 void BddAnalyzer<Ntk>::Load(int slot) {
578 assert(slot < int_size(vBackups));
579 target = vBackups[slot].target;
580 CopyVec(vFs, vBackups[slot].vFs);
581 CopyVec(vGs, vBackups[slot].vGs);
582 CopyVecVec(vvCs, vBackups[slot].vvCs);
583 vUpdates = vBackups[slot].vUpdates;
584 vGUpdates = vBackups[slot].vGUpdates;
585 vCUpdates = vBackups[slot].vCUpdates;
586 }
587
588 template <typename Ntk>
589 void BddAnalyzer<Ntk>::PopBack() {
590 assert(!vBackups.empty());
591 DelVec(vBackups.back().vFs);
592 DelVec(vBackups.back().vGs);
593 DelVecVec(vBackups.back().vvCs);
594 vBackups.pop_back();
595 }
596
597 /* }}} */
598
599 /* {{{ Constructors */
600
601 template <typename Ntk>
603 pNtk(NULL),
604 nVerbose(0),
605 fInitialized(false),
606 pBdd(NULL),
607 target(-1),
608 fResim(false) {
609 ResetSummary();
610 }
611
612 template <typename Ntk>
614 pNtk(NULL),
615 nVerbose(pPar->nAnalyzerVerbose),
616 fInitialized(false),
617 pBdd(NULL),
618 target(-1),
619 fResim(false) {
620 ResetSummary();
621 }
622
623 template <typename Ntk>
625 Reset();
626 }
627
628 template <typename Ntk>
629 void BddAnalyzer<Ntk>::AssignNetwork(Ntk *pNtk_, bool fReuse) {
630 Reset(fReuse);
631 pNtk = pNtk_;
632 pNtk->AddCallback(std::bind(&BddAnalyzer<Ntk>::ActionCallback, this, std::placeholders::_1));
633 }
634
635 /* }}} */
636
637 /* {{{ Checks */
638
639 template <typename Ntk>
640 bool BddAnalyzer<Ntk>::CheckRedundancy(int id, int idx) {
641 if(!fInitialized) {
642 Initialize();
643 } else if(fResim) {
644 Simulate();
645 fResim = false;
646 }
647 Cspf(id);
648 time_point timeStart = GetCurrentTime();
649 bool fRedundant = false;
650 switch(pNtk->GetNodeType(id)) {
651 case AND: {
652 int fi = pNtk->GetFanin(id, idx);
653 bool c = pNtk->GetCompl(id, idx);
654 lit x = pBdd->Or(pBdd->LitNotCond(vFs[fi], c), vvCs[id][idx]);
655 if(pBdd->IsConst1(x)) {
656 fRedundant = true;
657 }
658 break;
659 }
660 default:
661 assert(0);
662 }
663 if(nVerbose) {
664 if(fRedundant) {
665 std::cout << "node " << id << " fanin " << (pNtk->GetCompl(id, idx)? "!": "") << pNtk->GetFanin(id, idx) << " index " << idx << " is redundant" << std::endl;
666 } else {
667 std::cout << "node " << id << " fanin " << (pNtk->GetCompl(id, idx)? "!": "") << pNtk->GetFanin(id, idx) << " index " << idx << " is NOT redundant" << std::endl;
668 }
669 }
670 durationCheck += Duration(timeStart, GetCurrentTime());
671 return fRedundant;
672 }
673
674 template <typename Ntk>
675 bool BddAnalyzer<Ntk>::CheckFeasibility(int id, int fi, bool c) {
676 if(!fInitialized) {
677 Initialize();
678 } else if(target != id && (target == -1 || vUpdates[target])) {
679 // resimulation is required if there are pending updates in TFI of new fanin
680 // but it seems not worthwhile to check that condition every time
681 // so we update if pending updates are not only at current target
682 Simulate();
683 }
684 target = id;
685 Cspf(id, false);
686 time_point timeStart = GetCurrentTime();
687 bool fFeasible = false;
688 switch(pNtk->GetNodeType(id)) {
689 case AND: {
690 lit x = pBdd->Or(pBdd->LitNot(vFs[id]), vGs[id]);
691 IncRef(x);
692 lit y = pBdd->Or(x, pBdd->LitNotCond(vFs[fi], c));
693 DecRef(x);
694 if(pBdd->IsConst1(y)) {
695 fFeasible = true;
696 }
697 break;
698 }
699 default:
700 assert(0);
701 }
702 if(nVerbose) {
703 if(fFeasible) {
704 std::cout << "node " << id << " fanin " << (c? "!": "") << fi << " is feasible" << std::endl;
705 } else {
706 std::cout << "node " << id << " fanin " << (c? "!": "") << fi << " is NOT feasible" << std::endl;
707 }
708 }
709 durationCheck += Duration(timeStart, GetCurrentTime());
710 return fFeasible;
711 }
712
713 /* }}} */
714
715 /* {{{ Summary */
716
717 template <typename Ntk>
719 if(pBdd) {
720 nNodesOld = pBdd->GetNumTotalCreatedNodes();
721 } else {
722 nNodesOld = 0;
723 }
724 nNodesAccumulated = 0;
725 durationSimulation = 0;
726 durationPf = 0;
727 durationCheck = 0;
728 durationReorder = 0;
729 }
730
731 template <typename Ntk>
733 summary<int> v;
734 v.emplace_back("bdd node", pBdd->GetNumTotalCreatedNodes() - nNodesOld + nNodesAccumulated);
735 return v;
736 }
737
738 template <typename Ntk>
741 v.emplace_back("bdd symbolic simulation", durationSimulation);
742 v.emplace_back("bdd care computation", durationPf);
743 v.emplace_back("bdd check", durationCheck);
744 v.emplace_back("bdd reorder", durationReorder);
745 return v;
746 }
747
748 /* }}} */
749
750}
751
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
void AssignNetwork(Ntk *pNtk_, bool fReuse)
summary< int > GetStatsSummary() const
summary< double > GetTimesSummary() const
bool CheckRedundancy(int id, int idx)
bool CheckFeasibility(int id, int fi, bool c)
unsigned long long size
Definition giaNewBdd.h:39
Definition rrr.h:16
std::vector< std::pair< std::string, T > > summary
Definition rrrTypes.h:66
@ POP_BACK
Definition rrrTypes.h:45
@ REMOVE_BUFFER
Definition rrrTypes.h:36
@ REMOVE_UNUSED
Definition rrrTypes.h:35
@ TRIVIAL_DECOMPOSE
Definition rrrTypes.h:40
@ TRIVIAL_COLLAPSE
Definition rrrTypes.h:39
@ SAVE
Definition rrrTypes.h:43
@ REMOVE_CONST
Definition rrrTypes.h:37
@ LOAD
Definition rrrTypes.h:44
@ SORT_FANINS
Definition rrrTypes.h:41
@ REMOVE_FANIN
Definition rrrTypes.h:34
@ ADD_FANIN
Definition rrrTypes.h:38
@ READ
Definition rrrTypes.h:42
std::chrono::time_point< clock_type > time_point
Definition rrrTypes.h:63
@ AND
Definition rrrTypes.h:13
#define false
Definition place_base.h:29
int lit
Definition satVec.h:130
#define assert(ex)
Definition util_old.h:213