Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
abc
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
abc
Commits
fa6cdf9b
Unverified
Commit
fa6cdf9b
authored
Sep 19, 2022
by
alanminko
Committed by
GitHub
Sep 19, 2022
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #179 from MyskYko/ttopt
fix compile errors and warnings
parents
6c8c6aaf
124e750e
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
98 additions
and
134 deletions
+98
-134
src/aig/gia/giaTtopt.cpp
+98
-134
No files found.
src/aig/gia/giaTtopt.cpp
View file @
fa6cdf9b
// Author : Yukio Miyasaka
// Author : Yukio Miyasaka
#if 0
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <vector>
#include <list>
#include <algorithm>
#include <algorithm>
#include <numeric>
#include <random>
#include <cassert>
#include <cassert>
#include <map>
#include <bitset>
#include <bitset>
#include <unordered_map>
#endif
#include "gia.h"
#include "gia.h"
#include "misc/vec/vecHash.h"
ABC_NAMESPACE_IMPL_START
ABC_NAMESPACE_IMPL_START
#if 0
namespace
Ttopt
{
namespace
Ttopt
{
struct PairHasher {
std::size_t operator()(const std::pair<int, int> & k) const {
std::hash<int> hasher;
std::size_t seed = hasher(k.first) + 0x9e3779b9;
seed = hasher(k.second) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
return seed;
}
};
class
TruthTable
{
class
TruthTable
{
public
:
public
:
const int ww = 64
; // word width
static
const
int
ww
;
// word width
const int lww = 6
; // log word width
static
const
int
lww
;
// log word width
typedef
std
::
bitset
<
64
>
bsw
;
typedef
std
::
bitset
<
64
>
bsw
;
int
nInputs
;
int
nInputs
;
...
@@ -54,11 +32,11 @@ public:
...
@@ -54,11 +32,11 @@ public:
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>
>
>
vvRedundantIndicesSaved
;
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>
>
>
vvRedundantIndicesSaved
;
std
::
vector
<
std
::
vector
<
int
>
>
vLevelsSaved
;
std
::
vector
<
std
::
vector
<
int
>
>
vLevelsSaved
;
std::mt19937 rng;
static
const
word
ones
[];
static
const
word
ones
[];
static
const
word
swapmask
[];
static
const
word
swapmask
[];
TruthTable
(
int
nInputs
,
int
nOutputs
)
:
nInputs
(
nInputs
),
nOutputs
(
nOutputs
)
{
TruthTable
(
int
nInputs
,
int
nOutputs
)
:
nInputs
(
nInputs
),
nOutputs
(
nOutputs
)
{
srand
(
0xABC
);
if
(
nInputs
>=
lww
)
{
if
(
nInputs
>=
lww
)
{
nSize
=
1
<<
(
nInputs
-
lww
);
nSize
=
1
<<
(
nInputs
-
lww
);
nTotalSize
=
nSize
*
nOutputs
;
nTotalSize
=
nSize
*
nOutputs
;
...
@@ -69,45 +47,12 @@ public:
...
@@ -69,45 +47,12 @@ public:
t
.
resize
(
nTotalSize
);
t
.
resize
(
nTotalSize
);
}
}
vLevels
.
resize
(
nInputs
);
vLevels
.
resize
(
nInputs
);
std::iota(vLevels.begin(), vLevels.end(), 0);
for
(
int
i
=
0
;
i
<
nInputs
;
i
++
)
{
}
vLevels
[
i
]
=
i
;
std::string BinaryToString(int bin, int size) {
std::string str;
for(int i = 0; i < size; i++) {
str += (bin & 1) + '0';
bin = bin >> 1;
}
return str;
}
void GeneratePla(std::string filename) {
std::ofstream f(filename);
f << ".i " << nInputs << std::endl;
f << ".o " << nOutputs << std::endl;
if(nSize) {
for(int index = 0; index < nSize; index++) {
for(int pos = 0; pos < ww; pos++) {
int pat = (index << lww) + pos;
f << BinaryToString(pat, nInputs) << " ";
for(int i = 0; i < nOutputs; i++) {
f << ((t[nSize * i + index] >> pos) & 1);
}
f << std::endl;
}
}
} else {
for(int pos = 0; pos < (1 << nInputs); pos++) {
f << BinaryToString(pos, nInputs) << " ";
for(int i = 0; i < nOutputs; i++) {
int padding = i * (1 << nInputs);
f << ((t[padding / ww] >> (pos + padding % ww)) & 1);
}
f << std::endl;
}
}
}
}
}
virtual void Save(u
int
i) {
virtual
void
Save
(
u
nsigned
i
)
{
if
(
savedt
.
size
()
<
i
+
1
)
{
if
(
savedt
.
size
()
<
i
+
1
)
{
savedt
.
resize
(
i
+
1
);
savedt
.
resize
(
i
+
1
);
vLevelsSaved
.
resize
(
i
+
1
);
vLevelsSaved
.
resize
(
i
+
1
);
...
@@ -116,13 +61,13 @@ public:
...
@@ -116,13 +61,13 @@ public:
vLevelsSaved
[
i
]
=
vLevels
;
vLevelsSaved
[
i
]
=
vLevels
;
}
}
virtual void Load(u
int
i) {
virtual
void
Load
(
u
nsigned
i
)
{
assert
(
i
<
savedt
.
size
());
assert
(
i
<
savedt
.
size
());
t
=
savedt
[
i
];
t
=
savedt
[
i
];
vLevels
=
vLevelsSaved
[
i
];
vLevels
=
vLevelsSaved
[
i
];
}
}
virtual void SaveIndices(u
int
i) {
virtual
void
SaveIndices
(
u
nsigned
i
)
{
if
(
vvIndicesSaved
.
size
()
<
i
+
1
)
{
if
(
vvIndicesSaved
.
size
()
<
i
+
1
)
{
vvIndicesSaved
.
resize
(
i
+
1
);
vvIndicesSaved
.
resize
(
i
+
1
);
vvRedundantIndicesSaved
.
resize
(
i
+
1
);
vvRedundantIndicesSaved
.
resize
(
i
+
1
);
...
@@ -131,7 +76,7 @@ public:
...
@@ -131,7 +76,7 @@ public:
vvRedundantIndicesSaved
[
i
]
=
vvRedundantIndices
;
vvRedundantIndicesSaved
[
i
]
=
vvRedundantIndices
;
}
}
virtual void LoadIndices(u
int
i) {
virtual
void
LoadIndices
(
u
nsigned
i
)
{
vvIndices
=
vvIndicesSaved
[
i
];
vvIndices
=
vvIndicesSaved
[
i
];
vvRedundantIndices
=
vvRedundantIndicesSaved
[
i
];
vvRedundantIndices
=
vvRedundantIndicesSaved
[
i
];
}
}
...
@@ -206,7 +151,7 @@ public:
...
@@ -206,7 +151,7 @@ public:
if
(
fZero
||
fOne
)
{
if
(
fZero
||
fOne
)
{
return
-
2
^
fOne
;
return
-
2
^
fOne
;
}
}
for(u
int
j = 0; j < vvIndices[lev].size(); j++) {
for
(
u
nsigned
j
=
0
;
j
<
vvIndices
[
lev
].
size
();
j
++
)
{
int
index2
=
vvIndices
[
lev
][
j
];
int
index2
=
vvIndices
[
lev
][
j
];
bool
fEq
=
true
;
bool
fEq
=
true
;
bool
fCompl
=
true
;
bool
fCompl
=
true
;
...
@@ -226,7 +171,7 @@ public:
...
@@ -226,7 +171,7 @@ public:
if
(
!
(
value
^
ones
[
logwidth
]))
{
if
(
!
(
value
^
ones
[
logwidth
]))
{
return
-
1
;
return
-
1
;
}
}
for(u
int
j = 0; j < vvIndices[lev].size(); j++) {
for
(
u
nsigned
j
=
0
;
j
<
vvIndices
[
lev
].
size
();
j
++
)
{
int
index2
=
vvIndices
[
lev
][
j
];
int
index2
=
vvIndices
[
lev
][
j
];
word
value2
=
value
^
GetValue
(
index2
,
lev
);
word
value2
=
value
^
GetValue
(
index2
,
lev
);
if
(
!
(
value2
))
{
if
(
!
(
value2
))
{
...
@@ -260,7 +205,8 @@ public:
...
@@ -260,7 +205,8 @@ public:
}
}
virtual
void
BDDBuildLevel
(
int
lev
)
{
virtual
void
BDDBuildLevel
(
int
lev
)
{
for(int index: vvIndices[lev-1]) {
for
(
unsigned
i
=
0
;
i
<
vvIndices
[
lev
-
1
].
size
();
i
++
)
{
int
index
=
vvIndices
[
lev
-
1
][
i
];
int
cof0
=
BDDBuildOne
(
index
<<
1
,
lev
);
int
cof0
=
BDDBuildOne
(
index
<<
1
,
lev
);
int
cof1
=
BDDBuildOne
((
index
<<
1
)
^
1
,
lev
);
int
cof1
=
BDDBuildOne
((
index
<<
1
)
^
1
,
lev
);
if
(
cof0
==
cof1
)
{
if
(
cof0
==
cof1
)
{
...
@@ -292,7 +238,8 @@ public:
...
@@ -292,7 +238,8 @@ public:
}
}
if
(
lev
<
nInputs
-
2
)
{
if
(
lev
<
nInputs
-
2
)
{
vvRedundantIndices
[
lev
+
1
].
clear
();
vvRedundantIndices
[
lev
+
1
].
clear
();
for(int index: vvIndices[lev+1]) {
for
(
unsigned
i
=
0
;
i
<
vvIndices
[
lev
+
1
].
size
();
i
++
)
{
int
index
=
vvIndices
[
lev
+
1
][
i
];
if
(
IsEq
(
index
<<
1
,
(
index
<<
1
)
^
1
,
lev
+
2
))
{
if
(
IsEq
(
index
<<
1
,
(
index
<<
1
)
^
1
,
lev
+
2
))
{
vvRedundantIndices
[
lev
+
1
].
push_back
(
index
);
vvRedundantIndices
[
lev
+
1
].
push_back
(
index
);
}
}
...
@@ -303,8 +250,8 @@ public:
...
@@ -303,8 +250,8 @@ public:
virtual
void
Swap
(
int
lev
)
{
virtual
void
Swap
(
int
lev
)
{
assert
(
lev
<
nInputs
-
1
);
assert
(
lev
<
nInputs
-
1
);
auto
it0 = std::find(vLevels.begin(), vLevels.end(), lev);
std
::
vector
<
int
>::
iterator
it0
=
std
::
find
(
vLevels
.
begin
(),
vLevels
.
end
(),
lev
);
auto
it1 = std::find(vLevels.begin(), vLevels.end(), lev + 1);
std
::
vector
<
int
>::
iterator
it1
=
std
::
find
(
vLevels
.
begin
(),
vLevels
.
end
(),
lev
+
1
);
std
::
swap
(
*
it0
,
*
it1
);
std
::
swap
(
*
it0
,
*
it1
);
if
(
nInputs
-
lev
-
1
>
lww
)
{
if
(
nInputs
-
lev
-
1
>
lww
)
{
int
nScopeSize
=
1
<<
(
nInputs
-
lev
-
2
-
lww
);
int
nScopeSize
=
1
<<
(
nInputs
-
lev
-
2
-
lww
);
...
@@ -341,7 +288,7 @@ public:
...
@@ -341,7 +288,7 @@ public:
virtual
int
BDDSwap
(
int
lev
)
{
virtual
int
BDDSwap
(
int
lev
)
{
Swap
(
lev
);
Swap
(
lev
);
for
(
int
i
=
lev
+
2
;
i
<
nInputs
;
i
++
)
{
for
(
int
i
=
lev
+
2
;
i
<
nInputs
;
i
++
)
{
for(u
int
j = 0; j < vvIndices[i].size(); j++) {
for
(
u
nsigned
j
=
0
;
j
<
vvIndices
[
i
].
size
();
j
++
)
{
SwapIndex
(
vvIndices
[
i
][
j
],
i
-
(
lev
+
2
));
SwapIndex
(
vvIndices
[
i
][
j
],
i
-
(
lev
+
2
));
}
}
}
}
...
@@ -354,10 +301,23 @@ public:
...
@@ -354,10 +301,23 @@ public:
Save
(
0
);
Save
(
0
);
SaveIndices
(
0
);
SaveIndices
(
0
);
std
::
vector
<
int
>
vars
(
nInputs
);
std
::
vector
<
int
>
vars
(
nInputs
);
std::iota(vars.begin(), vars.end(), 0);
for
(
int
i
=
0
;
i
<
nInputs
;
i
++
)
{
std::sort(vars.begin(), vars.end(), [&](int i1, int i2) {return BDDNodeCountLevel(vLevels[i1]) > BDDNodeCountLevel(vLevels[i2]);});
vars
[
i
]
=
i
;
}
std
::
vector
<
unsigned
>
vCounts
(
nInputs
);
for
(
int
i
=
0
;
i
<
nInputs
;
i
++
)
{
vCounts
[
i
]
=
BDDNodeCountLevel
(
vLevels
[
i
]);
}
for
(
int
i
=
1
;
i
<
nInputs
;
i
++
)
{
int
j
=
i
;
while
(
j
>
0
&&
vCounts
[
vars
[
j
-
1
]]
<
vCounts
[
vars
[
j
]])
{
std
::
swap
(
vars
[
j
],
vars
[
j
-
1
]);
j
--
;
}
}
bool
turn
=
true
;
bool
turn
=
true
;
for(int var: vars) {
for
(
unsigned
j
=
0
;
j
<
vars
.
size
();
j
++
)
{
int
var
=
vars
[
j
];
bool
updated
=
false
;
bool
updated
=
false
;
int
lev
=
vLevels
[
var
];
int
lev
=
vLevels
[
var
];
for
(
int
i
=
lev
;
i
<
nInputs
-
1
;
i
++
)
{
for
(
int
i
=
lev
;
i
<
nInputs
-
1
;
i
++
)
{
...
@@ -411,8 +371,13 @@ public:
...
@@ -411,8 +371,13 @@ public:
Save
(
2
);
Save
(
2
);
for
(
int
i
=
0
;
i
<
nRound
;
i
++
)
{
for
(
int
i
=
0
;
i
<
nRound
;
i
++
)
{
std
::
vector
<
int
>
vLevelsNew
(
nInputs
);
std
::
vector
<
int
>
vLevelsNew
(
nInputs
);
std::iota(vLevelsNew.begin(), vLevelsNew.end(), 0);
for
(
int
j
=
0
;
j
<
nInputs
;
j
++
)
{
std::shuffle(vLevelsNew.begin(), vLevelsNew.end(), rng);
vLevelsNew
[
j
]
=
j
;
}
for
(
int
j
=
nInputs
-
1
;
j
>
0
;
j
--
)
{
int
d
=
rand
()
%
j
;
std
::
swap
(
vLevelsNew
[
j
],
vLevelsNew
[
d
]);
}
Reo
(
vLevelsNew
);
Reo
(
vLevelsNew
);
int
r
=
SiftReo
();
int
r
=
SiftReo
();
if
(
best
>
r
)
{
if
(
best
>
r
)
{
...
@@ -465,6 +430,9 @@ public:
...
@@ -465,6 +430,9 @@ public:
}
}
};
};
const
int
TruthTable
::
ww
=
64
;
const
int
TruthTable
::
lww
=
6
;
const
word
TruthTable
::
ones
[
7
]
=
{
ABC_CONST
(
0x0000000000000001
),
const
word
TruthTable
::
ones
[
7
]
=
{
ABC_CONST
(
0x0000000000000001
),
ABC_CONST
(
0x0000000000000003
),
ABC_CONST
(
0x0000000000000003
),
ABC_CONST
(
0x000000000000000f
),
ABC_CONST
(
0x000000000000000f
),
...
@@ -481,25 +449,27 @@ const word TruthTable::swapmask[5] = {ABC_CONST(0x2222222222222222),
...
@@ -481,25 +449,27 @@ const word TruthTable::swapmask[5] = {ABC_CONST(0x2222222222222222),
class
TruthTableReo
:
public
TruthTable
{
class
TruthTableReo
:
public
TruthTable
{
public
:
public
:
bool fBuilt
= false
;
bool
fBuilt
;
std
::
vector
<
std
::
vector
<
int
>
>
vvChildren
;
std
::
vector
<
std
::
vector
<
int
>
>
vvChildren
;
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>
>
>
vvChildrenSaved
;
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>
>
>
vvChildrenSaved
;
TruthTableReo(int nInputs, int nOutputs): TruthTable(nInputs, nOutputs) {}
TruthTableReo
(
int
nInputs
,
int
nOutputs
)
:
TruthTable
(
nInputs
,
nOutputs
)
{
fBuilt
=
false
;
}
void Save(u
int i) override
{
void
Save
(
u
nsigned
i
)
{
if
(
vLevelsSaved
.
size
()
<
i
+
1
)
{
if
(
vLevelsSaved
.
size
()
<
i
+
1
)
{
vLevelsSaved
.
resize
(
i
+
1
);
vLevelsSaved
.
resize
(
i
+
1
);
}
}
vLevelsSaved
[
i
]
=
vLevels
;
vLevelsSaved
[
i
]
=
vLevels
;
}
}
void Load(u
int i) override
{
void
Load
(
u
nsigned
i
)
{
assert
(
i
<
vLevelsSaved
.
size
());
assert
(
i
<
vLevelsSaved
.
size
());
vLevels
=
vLevelsSaved
[
i
];
vLevels
=
vLevelsSaved
[
i
];
}
}
void SaveIndices(u
int i) override
{
void
SaveIndices
(
u
nsigned
i
)
{
TruthTable
::
SaveIndices
(
i
);
TruthTable
::
SaveIndices
(
i
);
if
(
vvChildrenSaved
.
size
()
<
i
+
1
)
{
if
(
vvChildrenSaved
.
size
()
<
i
+
1
)
{
vvChildrenSaved
.
resize
(
i
+
1
);
vvChildrenSaved
.
resize
(
i
+
1
);
...
@@ -507,19 +477,20 @@ public:
...
@@ -507,19 +477,20 @@ public:
vvChildrenSaved
[
i
]
=
vvChildren
;
vvChildrenSaved
[
i
]
=
vvChildren
;
}
}
void LoadIndices(u
int i) override
{
void
LoadIndices
(
u
nsigned
i
)
{
TruthTable
::
LoadIndices
(
i
);
TruthTable
::
LoadIndices
(
i
);
vvChildren
=
vvChildrenSaved
[
i
];
vvChildren
=
vvChildrenSaved
[
i
];
}
}
void BDDBuildStartup()
override
{
void
BDDBuildStartup
()
{
vvChildren
.
clear
();
vvChildren
.
clear
();
vvChildren
.
resize
(
nInputs
);
vvChildren
.
resize
(
nInputs
);
TruthTable
::
BDDBuildStartup
();
TruthTable
::
BDDBuildStartup
();
}
}
void BDDBuildLevel(int lev) override {
void
BDDBuildLevel
(
int
lev
)
{
for(int index: vvIndices[lev-1]) {
for
(
unsigned
i
=
0
;
i
<
vvIndices
[
lev
-
1
].
size
();
i
++
)
{
int
index
=
vvIndices
[
lev
-
1
][
i
];
int
cof0
=
BDDBuildOne
(
index
<<
1
,
lev
);
int
cof0
=
BDDBuildOne
(
index
<<
1
,
lev
);
int
cof1
=
BDDBuildOne
((
index
<<
1
)
^
1
,
lev
);
int
cof1
=
BDDBuildOne
((
index
<<
1
)
^
1
,
lev
);
vvChildren
[
lev
-
1
].
push_back
(
cof0
);
vvChildren
[
lev
-
1
].
push_back
(
cof0
);
...
@@ -530,7 +501,7 @@ public:
...
@@ -530,7 +501,7 @@ public:
}
}
}
}
int BDDBuild()
override
{
int
BDDBuild
()
{
if
(
fBuilt
)
{
if
(
fBuilt
)
{
return
BDDNodeCount
();
return
BDDNodeCount
();
}
}
...
@@ -542,7 +513,7 @@ public:
...
@@ -542,7 +513,7 @@ public:
return
BDDNodeCount
();
return
BDDNodeCount
();
}
}
int BDDRebuildOne(int index, int cof0, int cof1, int lev,
std::unordered_map<std::pair<int, int>, int, PairHasher> &
unique, std::vector<int> &vChildrenLow) {
int
BDDRebuildOne
(
int
index
,
int
cof0
,
int
cof1
,
int
lev
,
Hash_IntMan_t
*
unique
,
std
::
vector
<
int
>
&
vChildrenLow
)
{
if
(
cof0
<
0
&&
cof0
==
cof1
)
{
if
(
cof0
<
0
&&
cof0
==
cof1
)
{
return
cof0
;
return
cof0
;
}
}
...
@@ -551,11 +522,12 @@ public:
...
@@ -551,11 +522,12 @@ public:
cof0
^=
1
;
cof0
^=
1
;
cof1
^=
1
;
cof1
^=
1
;
}
}
if(unique.count({cof0, cof1})) {
int
*
place
=
Hash_Int2ManLookup
(
unique
,
cof0
,
cof1
);
return (unique[{cof0, cof1}] << 1) ^ fCompl;
if
(
*
place
)
{
return
(
Hash_IntObjData2
(
unique
,
*
place
)
<<
1
)
^
fCompl
;
}
}
vvIndices
[
lev
].
push_back
(
index
);
vvIndices
[
lev
].
push_back
(
index
);
unique[{cof0, cof1}] = vvIndices[lev].size() - 1
;
Hash_Int2ManInsert
(
unique
,
cof0
,
cof1
,
vvIndices
[
lev
].
size
()
-
1
)
;
vChildrenLow
.
push_back
(
cof0
);
vChildrenLow
.
push_back
(
cof0
);
vChildrenLow
.
push_back
(
cof1
);
vChildrenLow
.
push_back
(
cof1
);
if
(
cof0
==
cof1
)
{
if
(
cof0
==
cof1
)
{
...
@@ -564,15 +536,14 @@ public:
...
@@ -564,15 +536,14 @@ public:
return
((
vvIndices
[
lev
].
size
()
-
1
)
<<
1
)
^
fCompl
;
return
((
vvIndices
[
lev
].
size
()
-
1
)
<<
1
)
^
fCompl
;
}
}
int BDDRebuild(int lev)
override
{
int
BDDRebuild
(
int
lev
)
{
vvRedundantIndices
[
lev
].
clear
();
vvRedundantIndices
[
lev
].
clear
();
vvRedundantIndices
[
lev
+
1
].
clear
();
vvRedundantIndices
[
lev
+
1
].
clear
();
std
::
vector
<
int
>
vChildrenHigh
;
std
::
vector
<
int
>
vChildrenHigh
;
std
::
vector
<
int
>
vChildrenLow
;
std
::
vector
<
int
>
vChildrenLow
;
std::unordered_map<std::pair<int, int>, int, PairHasher> unique;
Hash_IntMan_t
*
unique
=
Hash_IntManStart
(
2
*
vvIndices
[
lev
+
1
].
size
());
unique.reserve(2 * vvIndices[lev+1].size());
vvIndices
[
lev
+
1
].
clear
();
vvIndices
[
lev
+
1
].
clear
();
for(u
int
i = 0; i < vvIndices[lev].size(); i++) {
for
(
u
nsigned
i
=
0
;
i
<
vvIndices
[
lev
].
size
();
i
++
)
{
int
index
=
vvIndices
[
lev
][
i
];
int
index
=
vvIndices
[
lev
][
i
];
int
cof0index
=
vvChildren
[
lev
][
i
+
i
]
>>
1
;
int
cof0index
=
vvChildren
[
lev
][
i
+
i
]
>>
1
;
int
cof1index
=
vvChildren
[
lev
][
i
+
i
+
1
]
>>
1
;
int
cof1index
=
vvChildren
[
lev
][
i
+
i
+
1
]
>>
1
;
...
@@ -601,25 +572,26 @@ public:
...
@@ -601,25 +572,26 @@ public:
vvRedundantIndices
[
lev
].
push_back
(
index
);
vvRedundantIndices
[
lev
].
push_back
(
index
);
}
}
}
}
Hash_IntManStop
(
unique
);
vvChildren
[
lev
]
=
vChildrenHigh
;
vvChildren
[
lev
]
=
vChildrenHigh
;
vvChildren
[
lev
+
1
]
=
vChildrenLow
;
vvChildren
[
lev
+
1
]
=
vChildrenLow
;
return
BDDNodeCount
();
return
BDDNodeCount
();
}
}
void Swap(int lev)
override
{
void
Swap
(
int
lev
)
{
assert
(
lev
<
nInputs
-
1
);
assert
(
lev
<
nInputs
-
1
);
auto
it0 = std::find(vLevels.begin(), vLevels.end(), lev);
std
::
vector
<
int
>::
iterator
it0
=
std
::
find
(
vLevels
.
begin
(),
vLevels
.
end
(),
lev
);
auto
it1 = std::find(vLevels.begin(), vLevels.end(), lev + 1);
std
::
vector
<
int
>::
iterator
it1
=
std
::
find
(
vLevels
.
begin
(),
vLevels
.
end
(),
lev
+
1
);
std
::
swap
(
*
it0
,
*
it1
);
std
::
swap
(
*
it0
,
*
it1
);
BDDRebuild
(
lev
);
BDDRebuild
(
lev
);
}
}
int BDDSwap(int lev)
override
{
int
BDDSwap
(
int
lev
)
{
Swap
(
lev
);
Swap
(
lev
);
return
BDDNodeCount
();
return
BDDNodeCount
();
}
}
virtual void BDDGenerateAig(Gia_Man_t *pNew, Vec_Int_t *vSupp)
override
{
virtual
void
BDDGenerateAig
(
Gia_Man_t
*
pNew
,
Vec_Int_t
*
vSupp
)
{
abort
();
abort
();
}
}
};
};
...
@@ -712,7 +684,7 @@ public:
...
@@ -712,7 +684,7 @@ public:
}
}
}
}
void Save(u
int i) override
{
void
Save
(
u
nsigned
i
)
{
TruthTable
::
Save
(
i
);
TruthTable
::
Save
(
i
);
if
(
savedcare
.
size
()
<
i
+
1
)
{
if
(
savedcare
.
size
()
<
i
+
1
)
{
savedcare
.
resize
(
i
+
1
);
savedcare
.
resize
(
i
+
1
);
...
@@ -720,12 +692,12 @@ public:
...
@@ -720,12 +692,12 @@ public:
savedcare
[
i
]
=
care
;
savedcare
[
i
]
=
care
;
}
}
void Load(u
int i) override
{
void
Load
(
u
nsigned
i
)
{
TruthTable
::
Load
(
i
);
TruthTable
::
Load
(
i
);
care
=
savedcare
[
i
];
care
=
savedcare
[
i
];
}
}
void SaveIndices(u
int i) override
{
void
SaveIndices
(
u
nsigned
i
)
{
TruthTable
::
SaveIndices
(
i
);
TruthTable
::
SaveIndices
(
i
);
if
(
vvMergedIndicesSaved
.
size
()
<
i
+
1
)
{
if
(
vvMergedIndicesSaved
.
size
()
<
i
+
1
)
{
vvMergedIndicesSaved
.
resize
(
i
+
1
);
vvMergedIndicesSaved
.
resize
(
i
+
1
);
...
@@ -733,12 +705,12 @@ public:
...
@@ -733,12 +705,12 @@ public:
vvMergedIndicesSaved
[
i
]
=
vvMergedIndices
;
vvMergedIndicesSaved
[
i
]
=
vvMergedIndices
;
}
}
void LoadIndices(u
int i) override
{
void
LoadIndices
(
u
nsigned
i
)
{
TruthTable
::
LoadIndices
(
i
);
TruthTable
::
LoadIndices
(
i
);
vvMergedIndices
=
vvMergedIndicesSaved
[
i
];
vvMergedIndices
=
vvMergedIndicesSaved
[
i
];
}
}
void Swap(int lev)
override
{
void
Swap
(
int
lev
)
{
TruthTable
::
Swap
(
lev
);
TruthTable
::
Swap
(
lev
);
if
(
nInputs
-
lev
-
1
>
lww
)
{
if
(
nInputs
-
lev
-
1
>
lww
)
{
int
nScopeSize
=
1
<<
(
nInputs
-
lev
-
2
-
lww
);
int
nScopeSize
=
1
<<
(
nInputs
-
lev
-
2
-
lww
);
...
@@ -899,10 +871,10 @@ public:
...
@@ -899,10 +871,10 @@ public:
void
Merge
(
int
index1
,
int
index2
,
int
lev
,
bool
fCompl
)
{
void
Merge
(
int
index1
,
int
index2
,
int
lev
,
bool
fCompl
)
{
MergeCare
(
index1
,
index2
,
lev
);
MergeCare
(
index1
,
index2
,
lev
);
vvMergedIndices[lev].push_back(
{(index1 << 1) ^ fCompl, index2}
);
vvMergedIndices
[
lev
].
push_back
(
std
::
make_pair
((
index1
<<
1
)
^
fCompl
,
index2
)
);
}
}
int BDDBuildOne(int index, int lev)
override
{
int
BDDBuildOne
(
int
index
,
int
lev
)
{
int
r
=
BDDFind
(
index
,
lev
);
int
r
=
BDDFind
(
index
,
lev
);
if
(
r
>=
-
2
)
{
if
(
r
>=
-
2
)
{
if
(
r
>=
0
)
{
if
(
r
>=
0
)
{
...
@@ -916,13 +888,13 @@ public:
...
@@ -916,13 +888,13 @@ public:
void
CompleteMerge
()
{
void
CompleteMerge
()
{
for
(
int
i
=
nInputs
-
1
;
i
>=
0
;
i
--
)
{
for
(
int
i
=
nInputs
-
1
;
i
>=
0
;
i
--
)
{
for(
auto
it = vvMergedIndices[i].rbegin(); it != vvMergedIndices[i].rend(); it++) {
for
(
std
::
vector
<
std
::
pair
<
int
,
int
>
>::
reverse_iterator
it
=
vvMergedIndices
[
i
].
rbegin
();
it
!=
vvMergedIndices
[
i
].
rend
();
it
++
)
{
CopyFunc
((
*
it
).
second
,
(
*
it
).
first
>>
1
,
i
,
(
*
it
).
first
&
1
);
CopyFunc
((
*
it
).
second
,
(
*
it
).
first
>>
1
,
i
,
(
*
it
).
first
&
1
);
}
}
}
}
}
}
void BDDBuildStartup()
override
{
void
BDDBuildStartup
()
{
RestoreCare
();
RestoreCare
();
vvIndices
.
clear
();
vvIndices
.
clear
();
vvIndices
.
resize
(
nInputs
);
vvIndices
.
resize
(
nInputs
);
...
@@ -938,12 +910,13 @@ public:
...
@@ -938,12 +910,13 @@ public:
}
}
virtual
void
BDDRebuildByMerge
(
int
lev
)
{
virtual
void
BDDRebuildByMerge
(
int
lev
)
{
for(auto &p: vvMergedIndices[lev]) {
for
(
unsigned
i
=
0
;
i
<
vvMergedIndices
[
lev
].
size
();
i
++
)
{
std
::
pair
<
int
,
int
>
&
p
=
vvMergedIndices
[
lev
][
i
];
MergeCare
(
p
.
first
>>
1
,
p
.
second
,
lev
);
MergeCare
(
p
.
first
>>
1
,
p
.
second
,
lev
);
}
}
}
}
int BDDRebuild(int lev)
override
{
int
BDDRebuild
(
int
lev
)
{
RestoreCare
();
RestoreCare
();
for
(
int
i
=
lev
;
i
<
nInputs
;
i
++
)
{
for
(
int
i
=
lev
;
i
<
nInputs
;
i
++
)
{
vvIndices
[
i
].
clear
();
vvIndices
[
i
].
clear
();
...
@@ -969,7 +942,7 @@ public:
...
@@ -969,7 +942,7 @@ public:
return
BDDNodeCount
();
return
BDDNodeCount
();
}
}
int BDDSwap(int lev)
override
{
int
BDDSwap
(
int
lev
)
{
Swap
(
lev
);
Swap
(
lev
);
return
BDDRebuild
(
lev
);
return
BDDRebuild
(
lev
);
}
}
...
@@ -993,7 +966,8 @@ public:
...
@@ -993,7 +966,8 @@ public:
virtual
void
Optimize
()
{
virtual
void
Optimize
()
{
OptimizationStartup
();
OptimizationStartup
();
for
(
int
i
=
1
;
i
<
nInputs
;
i
++
)
{
for
(
int
i
=
1
;
i
<
nInputs
;
i
++
)
{
for(int index: vvIndices[i-1]) {
for
(
unsigned
j
=
0
;
j
<
vvIndices
[
i
-
1
].
size
();
j
++
)
{
int
index
=
vvIndices
[
i
-
1
][
j
];
BDDBuildOne
(
index
<<
1
,
i
);
BDDBuildOne
(
index
<<
1
,
i
);
BDDBuildOne
((
index
<<
1
)
^
1
,
i
);
BDDBuildOne
((
index
<<
1
)
^
1
,
i
);
}
}
...
@@ -1021,7 +995,8 @@ public:
...
@@ -1021,7 +995,8 @@ public:
if
(
fZero
||
fOne
)
{
if
(
fZero
||
fOne
)
{
return
-
2
^
fOne
;
return
-
2
^
fOne
;
}
}
for(int index2: vvIndices[lev]) {
for
(
unsigned
j
=
0
;
j
<
vvIndices
[
lev
].
size
();
j
++
)
{
int
index2
=
vvIndices
[
lev
][
j
];
bool
fEq
=
true
;
bool
fEq
=
true
;
bool
fCompl
=
true
;
bool
fCompl
=
true
;
for
(
int
i
=
0
;
i
<
nScopeSize
&&
(
fEq
||
fCompl
);
i
++
)
{
for
(
int
i
=
0
;
i
<
nScopeSize
&&
(
fEq
||
fCompl
);
i
++
)
{
...
@@ -1044,7 +1019,8 @@ public:
...
@@ -1044,7 +1019,8 @@ public:
if
(
!
((
value
^
one
)
&
cvalue
))
{
if
(
!
((
value
^
one
)
&
cvalue
))
{
return
-
1
;
return
-
1
;
}
}
for(int index2: vvIndices[lev]) {
for
(
unsigned
j
=
0
;
j
<
vvIndices
[
lev
].
size
();
j
++
)
{
int
index2
=
vvIndices
[
lev
][
j
];
word
value2
=
value
^
GetValue
(
index2
,
lev
);
word
value2
=
value
^
GetValue
(
index2
,
lev
);
word
cvalue2
=
cvalue
&
GetCare
(
index2
,
lev
);
word
cvalue2
=
cvalue
&
GetCare
(
index2
,
lev
);
if
(
!
(
value2
&
cvalue2
))
{
if
(
!
(
value2
&
cvalue2
))
{
...
@@ -1058,14 +1034,14 @@ public:
...
@@ -1058,14 +1034,14 @@ public:
return
-
3
;
return
-
3
;
}
}
int BDDBuildOne(int index, int lev)
override
{
int
BDDBuildOne
(
int
index
,
int
lev
)
{
int
r
=
BDDFindTSM
(
index
,
lev
);
int
r
=
BDDFindTSM
(
index
,
lev
);
if
(
r
>=
-
2
)
{
if
(
r
>=
-
2
)
{
if
(
r
>=
0
)
{
if
(
r
>=
0
)
{
CopyFuncMasked
(
r
>>
1
,
index
,
lev
,
r
&
1
);
CopyFuncMasked
(
r
>>
1
,
index
,
lev
,
r
&
1
);
Merge
(
r
>>
1
,
index
,
lev
,
r
&
1
);
Merge
(
r
>>
1
,
index
,
lev
,
r
&
1
);
}
else
{
}
else
{
vvMergedIndices[lev].push_back(
{r, index}
);
vvMergedIndices
[
lev
].
push_back
(
std
::
make_pair
(
r
,
index
)
);
}
}
return
r
;
return
r
;
}
}
...
@@ -1073,15 +1049,16 @@ public:
...
@@ -1073,15 +1049,16 @@ public:
return
index
<<
1
;
return
index
<<
1
;
}
}
int BDDBuild()
override
{
int
BDDBuild
()
{
TruthTable
::
Save
(
3
);
TruthTable
::
Save
(
3
);
int
r
=
TruthTable
::
BDDBuild
();
int
r
=
TruthTable
::
BDDBuild
();
TruthTable
::
Load
(
3
);
TruthTable
::
Load
(
3
);
return
r
;
return
r
;
}
}
void BDDRebuildByMerge(int lev) override {
void
BDDRebuildByMerge
(
int
lev
)
{
for(auto &p: vvMergedIndices[lev]) {
for
(
unsigned
i
=
0
;
i
<
vvMergedIndices
[
lev
].
size
();
i
++
)
{
std
::
pair
<
int
,
int
>
&
p
=
vvMergedIndices
[
lev
][
i
];
if
(
p
.
first
>=
0
)
{
if
(
p
.
first
>=
0
)
{
CopyFuncMasked
(
p
.
first
>>
1
,
p
.
second
,
lev
,
p
.
first
&
1
);
CopyFuncMasked
(
p
.
first
>>
1
,
p
.
second
,
lev
,
p
.
first
&
1
);
MergeCare
(
p
.
first
>>
1
,
p
.
second
,
lev
);
MergeCare
(
p
.
first
>>
1
,
p
.
second
,
lev
);
...
@@ -1089,7 +1066,7 @@ public:
...
@@ -1089,7 +1066,7 @@ public:
}
}
}
}
int BDDRebuild(int lev)
override
{
int
BDDRebuild
(
int
lev
)
{
TruthTable
::
Save
(
3
);
TruthTable
::
Save
(
3
);
int
r
=
TruthTableCare
::
BDDRebuild
(
lev
);
int
r
=
TruthTableCare
::
BDDRebuild
(
lev
);
TruthTable
::
Load
(
3
);
TruthTable
::
Load
(
3
);
...
@@ -1209,19 +1186,6 @@ Gia_Man_t * Gia_ManTtoptCare( Gia_Man_t * p, int nIns, int nOuts, int nRounds, c
...
@@ -1209,19 +1186,6 @@ Gia_Man_t * Gia_ManTtoptCare( Gia_Man_t * p, int nIns, int nOuts, int nRounds, c
Vec_WrdFreeP
(
&
vSimI
);
Vec_WrdFreeP
(
&
vSimI
);
return
pNew
;
return
pNew
;
}
}
#endif
extern
"C"
Gia_Man_t
*
Gia_ManTtopt
(
Gia_Man_t
*
p
,
int
nIns
,
int
nOuts
,
int
nRounds
)
{
return
NULL
;
}
extern
"C"
Gia_Man_t
*
Gia_ManTtoptCare
(
Gia_Man_t
*
p
,
int
nIns
,
int
nOuts
,
int
nRounds
,
char
*
pFileName
,
int
nRarity
)
{
return
NULL
;
}
ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_END
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment