18 using itr = std::list<int>::iterator;
19 using citr = std::list<int>::const_iterator;
20 using ritr = std::list<int>::reverse_iterator;
21 using critr = std::list<int>::const_reverse_iterator;
22 using Callback = std::function<void(
Action const &)>;
26 std::vector<int> vPis;
29 std::vector<int> vPos;
30 std::vector<std::vector<int>> vvFaninEdges;
31 std::vector<int> vRefs;
36 std::vector<unsigned> vTrav;
42 std::vector<Callback> vCallbacks;
45 std::vector<AndNetwork> vBackups;
48 int Node2Edge(
int id,
bool c)
const {
return (
id << 1) + (int)c; }
49 int Edge2Node(
int f)
const {
return f >> 1; }
50 bool EdgeIsCompl(
int f)
const {
return f & 1; }
54 void SortInts(itr it);
55 unsigned StartTraversal(
int n = 1);
57 void ForEachTfiRec(
int id, std::function<
void(
int)>
const &func);
58 void TakenAction(
Action const &action)
const;
67 void Clear(
bool fClearCallbacks =
true);
70 int AddAnd(
int id0,
int id1,
bool c0,
bool c1);
71 int AddPo(
int id,
bool c);
72 template <
typename Ntk,
typename Reader>
73 void Read(Ntk *pFrom, Reader &reader,
bool fNew =
true);
83 int GetPi(
int idx)
const;
84 int GetPo(
int idx)
const;
85 std::vector<int>
GetPis()
const;
86 std::vector<int>
GetInts()
const;
88 std::vector<int>
GetPos()
const;
91 bool IsPi(
int id)
const;
92 bool IsInt(
int id)
const;
93 bool IsPo(
int id)
const;
101 int GetFanin(
int id,
int idx)
const;
102 bool GetCompl(
int id,
int idx)
const;
105 std::vector<int>
GetNeighbors(
int id,
bool fPis,
int nHops);
106 template <
template <
typename...>
typename Container,
typename... Ts,
template <
typename...>
typename Container2,
typename... Ts2>
107 bool IsReachable(Container<Ts...>
const &srcs, Container2<Ts2...>
const &dsts);
108 template <
template <
typename...>
typename Container,
typename... Ts,
template <
typename...>
typename Container2,
typename... Ts2>
109 std::vector<int>
GetInners(Container<Ts...>
const &srcs, Container2<Ts2...>
const &dsts);
113 void ForEachPi(std::function<
void(
int)>
const &func)
const;
114 void ForEachPiIdx(std::function<
void(
int,
int)>
const &func)
const;
115 void ForEachInt(std::function<
void(
int)>
const &func)
const;
117 void ForEachPiInt(std::function<
void(
int)>
const &func)
const;
118 void ForEachPo(std::function<
void(
int)>
const &func)
const;
119 template <
typename Func>
121 template <
typename Func>
123 template <
typename Func>
125 template <
typename Func>
126 void ForEachFanout(
int id,
bool fPos, Func
const &func)
const;
127 template <
typename Func>
129 void ForEachTfi(
int id,
bool fPis, std::function<
void(
int)>
const &func);
130 template <
template <
typename...>
typename Container,
typename... Ts>
131 void ForEachTfiEnd(
int id, Container<Ts...>
const &ends, std::function<
void(
int)>
const &func);
132 void ForEachTfiUpdate(
int id,
bool fPis, std::function<
bool(
int)>
const &func);
133 template <
template <
typename...>
typename Container,
typename... Ts>
134 void ForEachTfisUpdate(Container<Ts...>
const &ids,
bool fPis, std::function<
bool(
int)>
const &func);
135 void ForEachTfo(
int id,
bool fPos, std::function<
void(
int)>
const &func);
137 void ForEachTfoUpdate(
int id,
bool fPos, std::function<
bool(
int)>
const &func);
138 template <
template <
typename...>
typename Container,
typename... Ts>
139 void ForEachTfos(Container<Ts...>
const &ids,
bool fPos, std::function<
void(
int)>
const &func);
140 template <
template <
typename...>
typename Container,
typename... Ts>
141 void ForEachTfosUpdate(Container<Ts...>
const &ids,
bool fPos, std::function<
bool(
int)>
const &func);
144 template <
template <
typename...>
typename Container,
typename... Ts>
145 AndNetwork *
Extract(Container<Ts...>
const &ids, std::vector<int>
const &vInputs, std::vector<int>
const &vOutputs);
149 void RemoveUnused(
int id,
bool fRecursive =
false,
bool fSweeping =
false);
152 void AddFanin(
int id,
int fi,
bool c);
155 template <
typename Func>
157 std::pair<std::vector<int>, std::vector<bool>>
Insert(
AndNetwork *pNtk, std::vector<int>
const &vInputs, std::vector<bool>
const &vCompls, std::vector<int>
const &vOutputs);
161 void Sweep(
bool fPropagate =
true);
164 int Save(
int slot = -1);
175 inline int AndNetwork::CreateNode() {
177 vvFaninEdges.emplace_back();
179 assert(!check_int_max(nNodes));
183 void AndNetwork::SortInts(itr it) {
185 itr it2 = std::find(it, lInts.end(), fi);
186 if(it2 != lInts.end()) {
188 it2 = lInts.insert(it, fi);
194 inline unsigned AndNetwork::StartTraversal(
int n) {
198 for(
int i = 0; i < n; i++) {
206 vTrav.resize(nNodes);
207 return iTrav - n + 1;
210 inline void AndNetwork::EndTraversal() {
215 void AndNetwork::ForEachTfiRec(
int id, std::function<
void(
int)>
const &func) {
216 for(
int fi_edge: vvFaninEdges[
id]) {
217 int fi = Edge2Node(fi_edge);
218 if(vTrav[fi] == iTrav) {
223 ForEachTfiRec(fi, func);
227 inline void AndNetwork::TakenAction(
Action const &action)
const {
228 for(Callback
const &callback: vCallbacks) {
241 fPropagating(
false) {
243 vvFaninEdges.emplace_back();
251 fPropagating(
false) {
257 vvFaninEdges = x.vvFaninEdges;
267 vvFaninEdges = x.vvFaninEdges;
282 vvFaninEdges.clear();
287 fPropagating =
false;
288 if(fClearCallbacks) {
293 vvFaninEdges.emplace_back();
299 vvFaninEdges.reserve(nReserve);
300 vRefs.reserve(nReserve);
304 vPis.push_back(nNodes);
305 vvFaninEdges.emplace_back();
307 assert(!check_int_max(nNodes));
315 lInts.push_back(nNodes);
316 sInts.insert(nNodes);
319 vvFaninEdges.emplace_back(std::initializer_list<int>({Node2Edge(id0, c0), Node2Edge(id1, c1)}));
321 assert(!check_int_max(nNodes));
327 vPos.push_back(nNodes);
329 vvFaninEdges.emplace_back(std::initializer_list<int>({Node2Edge(
id, c)}));
331 assert(!check_int_max(nNodes));
335 template <
typename Ntk,
typename Reader>
358 return int_size(vPis);
362 return int_size(lInts);
366 return int_size(vPos);
371 std::vector<int> vLevels(nNodes);
374 if(vLevels[
id] < vLevels[fi]) {
375 vLevels[id] = vLevels[fi];
379 if(nMaxLevel < vLevels[
id]) {
380 nMaxLevel = vLevels[id];
403 return std::vector<int>(lInts.begin(), lInts.end());
407 std::vector<int> vPisInts = vPis;
408 vPisInts.insert(vPisInts.end(), lInts.begin(), lInts.end());
421 return GetNumFanins(
id) == 0 && std::find(vPis.begin(), vPis.end(),
id) != vPis.end();
425 return sInts.count(
id);
429 return GetNumFanouts(
id) == 0 && std::find(vPos.begin(), vPos.end(),
id) != vPos.end();
453 assert(check_int_size(vPis));
454 std::vector<int>::const_iterator it = std::find(vPis.begin(), vPis.end(),
id);
456 return std::distance(vPis.begin(), it);
460 assert(check_int_size(lInts));
462 citr it = lInts.begin();
463 for(; it != lInts.end(); it++) {
469 assert(it != lInts.end());
475 assert(check_int_size(vPos));
476 std::vector<int>::const_iterator it = std::find(vPos.begin(), vPos.end(),
id);
478 return std::distance(vPos.begin(), it);
482 return int_size(vvFaninEdges[
id]);
490 return Edge2Node(vvFaninEdges[
id][idx]);
494 return EdgeIsCompl(vvFaninEdges[
id][idx]);
513 vTrav[fo] = iTravStart + idx;
521 citr it = lInts.begin();
522 while(vTrav[*it] < iTravStart && it != lInts.end()) {
526 for(; it != lInts.end(); it++) {
527 for(
int fi_edge: vvFaninEdges[*it]) {
528 int fi = Edge2Node(fi_edge);
529 if(vTrav[fi] >= iTravStart) {
530 if(vTrav[*it] >= iTravStart && vTrav[*it] != vTrav[fi]) {
534 vTrav[*it] = vTrav[fi];
545 std::vector<int> vPrevs, vNexts;
546 vNexts.push_back(
id);
547 for(
int i = 0; i < nHops; i++) {
549 for(
int id: vPrevs) {
551 if(vTrav[fi] != iTrav) {
552 vNexts.push_back(fi);
557 if(vTrav[fo] != iTrav) {
558 vNexts.push_back(fo);
569 if(vTrav[
id] == iTrav) {
575 if(vTrav[
id] == iTrav) {
584 template <
template <
typename...>
typename Container,
typename... Ts,
template <
typename...>
typename Container2,
typename... Ts2>
586 if(srcs.empty() || dsts.empty()) {
590 unsigned iTravStart = StartTraversal(2);
592 vTrav[id] = iTravStart;
596 if(vTrav[
id] == iTravStart) {
603 citr it = lInts.begin();
604 while(vTrav[*it] != iTrav && it != lInts.end()) {
608 for(; it != lInts.end(); it++) {
609 if(vTrav[*it] == iTrav) {
612 for(
int fi_edge: vvFaninEdges[*it]) {
613 if(vTrav[Edge2Node(fi_edge)] == iTrav) {
614 if(vTrav[*it] == iTravStart) {
624 if(vTrav[po] == iTrav) {
627 if(vTrav[
GetFanin(po, 0)] == iTrav) {
628 if(vTrav[po] == iTravStart) {
639 template <
template <
typename...>
typename Container,
typename... Ts,
template <
typename...>
typename Container2,
typename... Ts2>
642 if(srcs.empty() || dsts.empty()) {
643 return std::vector<int>();
645 unsigned iTravStart = StartTraversal(4);
646 unsigned iDst = iTravStart;
647 unsigned iTfo = iTravStart + 1;
648 unsigned iInner = iTravStart + 2;
655 if(vTrav[
id] == iDst) {
661 citr it = lInts.begin();
662 while(vTrav[*it] != iTfo && it != lInts.end()) {
665 for(; it != lInts.end(); it++) {
666 if(vTrav[*it] >= iTfo) {
669 for(
int fi_edge: vvFaninEdges[*it]) {
670 if(vTrav[Edge2Node(fi_edge)] == iTfo) {
671 if(vTrav[*it] == iDst) {
681 std::vector<int> vInners;
683 if(vTrav[
id] == iInner) {
684 vInners.push_back(
id);
686 ForEachTfiRec(
id, [&](
int fi) {
687 if(vTrav[fi] == iTfo || vTrav[fi] == iInner) {
688 vInners.push_back(fi);
713 std::vector<int> vFaninEdges = vvFaninEdges[id];
714 for(
int idx = 0; idx < int_size(vFaninEdges);) {
715 int fi_edge = vFaninEdges[idx];
716 int fi = Edge2Node(fi_edge);
717 bool c = EdgeIsCompl(fi_edge);
718 if(!
IsPi(fi) && !c && vRefs[fi] == 1) {
719 std::vector<int>::iterator it = vFaninEdges.begin() + idx;
720 it = vFaninEdges.erase(it);
721 vFaninEdges.insert(it, vvFaninEdges[fi].begin(), vvFaninEdges[fi].end());
727 std::set<int> sFanins;
728 for(
int fi_edge: vFaninEdges) {
729 sFanins.insert(Edge2Node(fi_edge));
745 for(
int idx = 0; idx <
GetNumPis(); idx++) {
746 func(idx,
GetPi(idx));
757 for(critr it = lInts.rbegin(); it != lInts.rend(); it++) {
777 template <
typename Func>
789 template <
typename Func>
792 for(
int fi_edge: vvFaninEdges[
id]) {
794 func(Edge2Node(fi_edge));
796 func(Edge2Node(fi_edge), EdgeIsCompl(fi_edge));
801 template <
typename Func>
813 template <
typename Func>
819 citr it = lInts.begin();
821 it = std::find(it, lInts.end(),
id);
822 assert(it != lInts.end());
825 int nRefs = vRefs[id];
826 for(; nRefs != 0 && it != lInts.end(); it++) {
837 if(fPos && nRefs != 0) {
852 assert(!fPos || nRefs == 0);
855 template <
typename Func>
861 citr it = lInts.begin();
863 it = std::find(it, lInts.end(),
id);
864 assert(it != lInts.end());
867 int nRefs = vRefs[id];
868 for(; nRefs != 0 && it != lInts.end(); it++) {
879 if(fPos && nRefs != 0) {
894 assert(!fPos || nRefs == 0);
905 ForEachTfiRec(
id, func);
909 template <
template <
typename...>
typename Container,
typename... Ts>
916 ForEachTfiRec(
id, func);
925 for(
int fi_edge: vvFaninEdges[
id]) {
926 vTrav[Edge2Node(fi_edge)] = iTrav;
928 critr it = std::find(lInts.rbegin(), lInts.rend(),
id);
929 assert(it != lInts.rend());
931 for(; it != lInts.rend(); it++) {
932 if(vTrav[*it] == iTrav) {
934 for(
int fi_edge: vvFaninEdges[*it]) {
935 vTrav[Edge2Node(fi_edge)] = iTrav;
942 if(vTrav[pi] == iTrav) {
950 template <
template <
typename...>
typename Container,
typename... Ts>
957 critr it = lInts.rbegin();
958 while(vTrav[*it] != iTrav && it != lInts.rend()) {
961 for(; it != lInts.rend(); it++) {
962 if(vTrav[*it] == iTrav) {
964 for(
int fi_edge: vvFaninEdges[*it]) {
965 vTrav[Edge2Node(fi_edge)] = iTrav;
972 if(vTrav[pi] == iTrav) {
987 citr it = std::find(lInts.begin(), lInts.end(),
id);
988 assert(it != lInts.end());
990 for(; it != lInts.end(); it++) {
991 for(
int fi_edge: vvFaninEdges[*it]) {
992 if(vTrav[Edge2Node(fi_edge)] == iTrav) {
1001 if(vTrav[
GetFanin(po, 0)] == iTrav) {
1012 if(vRefs[
id] == 0) {
1017 citr it = std::find(lInts.begin(), lInts.end(),
id);
1018 assert(it != lInts.end());
1020 for(; it != lInts.end(); it++) {
1021 for(
int fi_edge: vvFaninEdges[*it]) {
1022 if(vTrav[Edge2Node(fi_edge)] == iTrav) {
1030 if(vTrav[
GetFanin(po, 0)] == iTrav) {
1036 unsigned iTravTfo = iTrav;
1039 for(std::vector<int>::const_reverse_iterator it = vPos.rbegin(); it != vPos.rend(); it++) {
1040 assert(vTrav[*it] <= iTravTfo);
1041 if(vTrav[*it] == iTravTfo) {
1046 for(critr it = lInts.rbegin(); *it !=
id; it++) {
1047 assert(vTrav[*it] <= iTravTfo);
1048 if(vTrav[*it] == iTravTfo) {
1056 if(vRefs[
id] == 0) {
1061 citr it = std::find(lInts.begin(), lInts.end(),
id);
1062 assert(it != lInts.end());
1064 for(; it != lInts.end(); it++) {
1065 for(
int fi_edge: vvFaninEdges[*it]) {
1066 if(vTrav[Edge2Node(fi_edge)] == iTrav) {
1076 if(vTrav[
GetFanin(po, 0)] == iTrav) {
1086 template <
template <
typename...>
typename Container,
typename... Ts>
1093 citr it = lInts.begin();
1094 while(vTrav[*it] != iTrav && it != lInts.end()) {
1097 for(; it != lInts.end(); it++) {
1098 if(vTrav[*it] == iTrav) {
1101 for(
int fi_edge: vvFaninEdges[*it]) {
1102 if(vTrav[Edge2Node(fi_edge)] == iTrav) {
1112 if(vTrav[po] == iTrav || vTrav[
GetFanin(po, 0)] == iTrav) {
1121 template <
template <
typename...>
typename Container,
typename... Ts>
1128 citr it = lInts.begin();
1129 while(vTrav[*it] != iTrav && it != lInts.end()) {
1132 for(; it != lInts.end(); it++) {
1133 if(vTrav[*it] == iTrav) {
1138 for(
int fi_edge: vvFaninEdges[*it]) {
1139 if(vTrav[Edge2Node(fi_edge)] == iTrav) {
1150 if(vTrav[po] == iTrav) {
1154 }
else if(vTrav[
GetFanin(po, 0)] == iTrav) {
1168 template <
template <
typename...>
typename Container,
typename... Ts>
1171 pNtk->
Reserve(int_size(vInputs) + int_size(ids) + int_size(vOutputs));
1172 std::map<int, int> m;
1174 for(
int id: vInputs) {
1175 m[id] = pNtk->
AddPi();
1182 if(vTrav[
id] == iTrav) {
1183 m[id] = pNtk->CreateNode();
1184 pNtk->lInts.push_back(m[
id]);
1185 pNtk->sInts.insert(m[
id]);
1189 pNtk->vvFaninEdges[m[id]][idx] = pNtk->Node2Edge(m[fi], c);
1190 pNtk->vRefs[m[fi]]++;
1195 for(
int id: vOutputs) {
1197 pNtk->
AddPo(m[
id],
false);
1216 vvFaninEdges[id].erase(vvFaninEdges[
id].begin() + idx);
1217 TakenAction(action);
1229 vvFaninEdges[id].clear();
1231 itr it = std::find(lInts.begin(), lInts.end(),
id);
1235 TakenAction(action);
1238 if(vRefs[fi] == 0 &&
IsInt(fi)) {
1247 assert(!fPropagating || fLockTrav);
1258 if(idx2 != -1 &&
GetCompl(fo, idx2) == (c ^ foc)) {
1272 action.vFanouts.push_back(fo);
1277 vvFaninEdges[fo][idx] = Node2Edge(
GetConst0(), 0);
1282 vvFaninEdges[fo][idx] = Node2Edge(fi, c ^ foc);
1289 vvFaninEdges[id].clear();
1291 itr it = std::find(lInts.begin(), lInts.end(),
id);
1295 TakenAction(action);
1300 assert(!fPropagating || fLockTrav);
1317 action.vFanouts.push_back(fo);
1319 vvFaninEdges[fo][idx] = Node2Edge(
GetConst0(), c ^ foc);
1328 action.vFanins.push_back(fi);
1330 vvFaninEdges[id].clear();
1332 itr it = std::find(lInts.begin(), lInts.end(),
id);
1336 TakenAction(action);
1348 itr it = std::find(lInts.begin(), lInts.end(),
id);
1349 itr it2 = std::find(it, lInts.end(), fi);
1350 if(it2 != lInts.end()) {
1352 it2 = lInts.insert(it, fi);
1356 vvFaninEdges[id].push_back(Node2Edge(fi, c));
1357 TakenAction(action);
1362 int fi_edge = vvFaninEdges[id][idx];
1363 int fi = Edge2Node(fi_edge);
1364 bool c = EdgeIsCompl(fi_edge);
1365 if(!
IsPi(fi) && !c && vRefs[fi] == 1) {
1372 std::vector<int>::iterator it = vvFaninEdges[id].begin() + idx;
1373 it = vvFaninEdges[id].erase(it);
1374 vvFaninEdges[id].insert(it, vvFaninEdges[fi].begin(), vvFaninEdges[fi].end());
1380 vvFaninEdges[fi].clear();
1381 lInts.erase(std::find(lInts.begin(), lInts.end(), fi));
1383 TakenAction(action);
1396 int new_fi = CreateNode();
1398 int fi_edge1 = vvFaninEdges[id].back();
1399 vvFaninEdges[id].pop_back();
1400 int fi_edge0 = vvFaninEdges[id].back();
1401 vvFaninEdges[id].pop_back();
1402 vvFaninEdges[new_fi].push_back(fi_edge0);
1403 action.
vFanins.push_back(Edge2Node(fi_edge0));
1404 vvFaninEdges[new_fi].push_back(fi_edge1);
1405 action.
vFanins.push_back(Edge2Node(fi_edge1));
1406 vvFaninEdges[id].push_back(Node2Edge(new_fi,
false));
1408 itr it = std::find(lInts.begin(), lInts.end(),
id);
1409 lInts.insert(it, new_fi);
1410 sInts.insert(new_fi);
1411 TakenAction(action);
1415 template <
typename Func>
1418 std::vector<int> vFaninEdges = vvFaninEdges[id];
1419 std::sort(vvFaninEdges[
id].begin(), vvFaninEdges[
id].end(), [&](
int i,
int j) {
1421 return comp(Edge2Node(i), Edge2Node(j));
1423 return comp(Edge2Node(i), EdgeIsCompl(i), Edge2Node(j), EdgeIsCompl(j));
1426 if(vFaninEdges == vvFaninEdges[
id]) {
1432 assert(check_int_size(vFaninEdges));
1433 for(
int fanin_edge: vvFaninEdges[
id]) {
1434 std::vector<int>::const_iterator it = std::find(vFaninEdges.begin(), vFaninEdges.end(), fanin_edge);
1435 action.
vIndices.push_back(std::distance(vFaninEdges.cbegin(), it));
1437 TakenAction(action);
1440 std::pair<std::vector<int>, std::vector<bool>>
AndNetwork::Insert(
AndNetwork *pNtk, std::vector<int>
const &vInputs, std::vector<bool>
const &vCompls, std::vector<int>
const &vOutputs) {
1442 std::map<int, std::pair<int, bool>> m;
1445 assert(vInputs.size() == vCompls.size());
1446 for(
int i = 0; i < pNtk->
GetNumPis(); i++) {
1448 m[pNtk->
GetPi(i)] = std::make_pair(vInputs[i], vCompls[i]);
1451 int id2 = CreateNode();
1452 lInts.push_back(id2);
1457 vvFaninEdges[id2][idx] = Node2Edge(m[fi].first, c ^ m[fi].second);
1458 vRefs[m[fi].first]++;
1460 m[id] = std::make_pair(id2,
false);
1463 std::vector<int> vNewOutputs(pNtk->
GetNumPos());
1464 std::vector<bool> vNewCompls(pNtk->
GetNumPos());
1465 for(
int i = 0; i < pNtk->
GetNumPos(); i++) {
1466 int id = vOutputs[i];
1467 int po = pNtk->
GetPo(i);
1469 int fi = m[pNtk->
GetFanin(po, 0)].first;
1472 vNewOutputs[i] = fi;
1477 if(idx2 != -1 &&
GetCompl(fo, idx2) == (c ^ foc)) {
1486 vvFaninEdges[fo][idx] = Node2Edge(
GetConst0(), 0);
1488 vvFaninEdges[fo][idx] = Node2Edge(fi, c ^ foc);
1491 itr it = std::find(lInts.begin(), lInts.end(),
id);
1492 itr it2 = std::find(it, lInts.end(), fi);
1493 if(it2 != lInts.end()) {
1495 it2 = lInts.insert(it, fi);
1506 TakenAction(action);
1507 for(
int id: vOutputs) {
1510 return std::make_pair(std::move(vNewOutputs), std::move(vNewCompls));
1527 while(vTrav[*it] != iTrav && it != lInts.end()) {
1532 it = std::find(lInts.begin(), lInts.end(),
id);
1534 fPropagating =
true;
1535 while(it != lInts.end()) {
1536 if(vTrav[*it] == iTrav) {
1542 it = lInts.erase(it);
1547 fPropagating =
false;
1555 for(ritr it = lInts.rbegin(); it != lInts.rend();) {
1556 if(vRefs[*it] == 0) {
1558 it = ritr(lInts.erase(--it.base()));
1573 slot = int_size(vBackups);
1574 vBackups.push_back(*
this);
1575 assert(check_int_size(vBackups));
1577 assert(slot < int_size(vBackups));
1578 vBackups[slot] = *
this;
1581 TakenAction(action);
1587 assert(slot < int_size(vBackups));
1591 *
this = vBackups[slot];
1592 TakenAction(action);
1596 assert(!vBackups.empty());
1599 action.
idx = int_size(vBackups) - 1;
1600 vBackups.pop_back();
1601 TakenAction(action);
1609 vCallbacks.push_back(callback);
1613 std::cout <<
"inputs: " << vPis << std::endl;
1615 std::cout <<
"node " <<
id <<
": ";
1617 std::cout <<
" (ref = " << vRefs[id] <<
")";
1618 std::cout << std::endl;
1620 std::cout <<
"outputs: ";
1622 std::cout << std::endl;
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
void ForEachPi(std::function< void(int)> const &func) const
int GetNumFanins(int id) const
void ForEachFanout(int id, bool fPos, Func const &func) const
void ForEachPoDriver(Func const &func) const
std::set< int > GetExtendedFanins(int id)
int GetFanin(int id, int idx) const
int GetPiIndex(int id) const
std::vector< int > GetNeighbors(int id, bool fPis, int nHops)
int GetNumFanouts(int id) const
NodeType GetNodeType(int id) const
bool GetCompl(int id, int idx) const
void ForEachTfi(int id, bool fPis, std::function< void(int)> const &func)
bool IsReachable(Container< Ts... > const &srcs, Container2< Ts2... > const &dsts)
int FindFanin(int id, int fi) const
void TrivialCollapse(int id)
void RemoveUnused(int id, bool fRecursive=false, bool fSweeping=false)
void ForEachTfiUpdate(int id, bool fPis, std::function< bool(int)> const &func)
void ForEachPiInt(std::function< void(int)> const &func) const
void SortFanins(int id, Func const &cost)
void Propagate(int id=-1)
std::vector< int > GetInners(Container< Ts... > const &srcs, Container2< Ts2... > const &dsts)
std::vector< int > GetPos() const
void ForEachTfo(int id, bool fPos, std::function< void(int)> const &func)
void ForEachFanin(int id, Func const &func) const
bool IsReconvergent(int id)
bool IsPoDriver(int id) const
void ForEachTfosUpdate(Container< Ts... > const &ids, bool fPos, std::function< bool(int)> const &func)
void ForEachTfos(Container< Ts... > const &ids, bool fPos, std::function< void(int)> const &func)
std::vector< int > GetPisInts() const
void ForEachFaninIdx(int id, Func const &func) const
void ForEachInt(std::function< void(int)> const &func) const
void ForEachTfisUpdate(Container< Ts... > const &ids, bool fPis, std::function< bool(int)> const &func)
int GetPoIndex(int id) const
void Clear(bool fClearCallbacks=true)
int GetIntIndex(int id) const
void ForEachTfoReverse(int id, bool fPos, std::function< void(int)> const &func)
void TrivialDecompose(int id)
void Read(Ntk *pFrom, Reader &reader, bool fNew=true)
int AddPo(int id, bool c)
void RemoveFanin(int id, int idx)
void Sweep(bool fPropagate=true)
void AddCallback(Callback const &callback)
void AddFanin(int id, int fi, bool c)
std::vector< int > GetPis() const
void ForEachTfiEnd(int id, Container< Ts... > const &ends, std::function< void(int)> const &func)
void ForEachTfoUpdate(int id, bool fPos, std::function< bool(int)> const &func)
void Reserve(int nReserve)
void RemoveBuffer(int id)
int AddAnd(int id0, int id1, bool c0, bool c1)
void ForEachPiIdx(std::function< void(int, int)> const &func) const
std::pair< std::vector< int >, std::vector< bool > > Insert(AndNetwork *pNtk, std::vector< int > const &vInputs, std::vector< bool > const &vCompls, std::vector< int > const &vOutputs)
void ForEachFanoutRidx(int id, bool fPos, Func const &func) const
void ForEachPo(std::function< void(int)> const &func) const
bool UseComplementedEdges() const
AndNetwork & operator=(AndNetwork const &x)
std::vector< int > GetInts() const
AndNetwork * Extract(Container< Ts... > const &ids, std::vector< int > const &vInputs, std::vector< int > const &vOutputs)
void ForEachIntReverse(std::function< void(int)> const &func) const
void PrintComplementedEdges(std::function< void(std::function< void(int, bool)> const &)> const &ForEachEdge)
std::vector< int > vFanouts
std::vector< int > vIndices
std::vector< int > vFanins