21#ifndef ABC__aig__gia__giaNewTt_h
22#define ABC__aig__gia__giaNewTt_h
37 typedef unsigned short ref;
38 typedef unsigned long long size;
40 static inline bvar BvarMax() {
return std::numeric_limits<bvar>::max(); }
41 static inline lit LitMax() {
return std::numeric_limits<lit>::max(); }
42 static inline ref RefMax() {
return std::numeric_limits<ref>::max(); }
43 static inline size SizeMax() {
return std::numeric_limits<size>::max(); }
45 static void fatal_error(
const char* message) {
46 std::cerr << message << std::endl;
70 typedef unsigned long long word;
71 typedef std::bitset<64> bsw;
72 static inline int ww() {
return 64; }
73 static inline int lww() {
return 6; }
74 static inline word one() {
return 0xffffffffffffffffull; }
75 static inline word vars(
int i) {
76 static const word vars[] = {0xaaaaaaaaaaaaaaaaull,
77 0xccccccccccccccccull,
78 0xf0f0f0f0f0f0f0f0ull,
79 0xff00ff00ff00ff00ull,
80 0xffff0000ffff0000ull,
81 0xffffffff00000000ull};
84 static inline word ones(
int i) {
85 static const word ones[] = {0x0000000000000001ull,
86 0x0000000000000003ull,
87 0x000000000000000full,
88 0x00000000000000ffull,
89 0x000000000000ffffull,
90 0x00000000ffffffffull,
91 0xffffffffffffffffull};
102 std::vector<word> vVals;
103 std::vector<bvar> vDeads;
104 std::vector<ref> vRefs;
121 for(
size j = 0; j < nSize; j++)
122 if(vVals[nSize * a + j] ^ c)
129 for(
size j = 0; j < nSize; j++)
130 if(~(vVals[nSize * a + j] ^ c))
137 if(x == LitMax() || y == LitMax())
142 for(
size j = 0; j < nSize; j++)
143 if(vVals[nSize * xvar + j] ^ vVals[nSize * yvar + j] ^ c)
151 for(
size j = 0; j < nSize; j++)
152 count += bsw(vVals[nSize * a + j]).count();
154 count = bsw(vVals[nSize * a] & ones(nVars)).count();
164 if(nObjsAlloc == nObjsMax)
166 lit nObjsAllocLit = (
lit)nObjsAlloc << 1;
167 if(nObjsAllocLit > (
lit)BvarMax())
168 nObjsAlloc = BvarMax();
170 nObjsAlloc = (
bvar)nObjsAllocLit;
171 nTotalSize = nTotalSize << 1;
173 std::cout <<
"Reallocating " << nObjsAlloc <<
" nodes" << std::endl;
174 vVals.resize(nTotalSize);
176 vRefs.resize(nObjsAlloc);
181 std::cout <<
"Garbage collect" << std::endl;
182 for(
bvar a = nVars + 1; a < nObjs; a++)
185 return vDeads.size();
190 if(
p.nObjsMaxLog <
p.nObjsAllocLog)
191 fatal_error(
"nObjsMax must not be smaller than nObjsAlloc");
193 nSize = 1ull << (nVars - lww());
197 fatal_error(
"Memout (nVars) in init");
198 if(!(nSize <<
p.nObjsMaxLog))
199 fatal_error(
"Memout (nObjsMax) in init");
200 lit nObjsMaxLit = (
lit)1 <<
p.nObjsMaxLog;
202 fatal_error(
"Memout (nObjsMax) in init");
203 if(nObjsMaxLit > (
lit)BvarMax())
204 nObjsMax = BvarMax();
206 nObjsMax = (
bvar)nObjsMaxLit;
207 lit nObjsAllocLit = (
lit)1 <<
p.nObjsAllocLog;
209 fatal_error(
"Memout (nObjsAlloc) in init");
210 if(nObjsAllocLit > (
lit)BvarMax())
211 nObjsAlloc = BvarMax();
213 nObjsAlloc = (
bvar)nObjsAllocLit;
214 if(nObjsAlloc <= (
bvar)nVars)
215 fatal_error(
"nObjsAlloc must be larger than nVars");
216 nTotalSize = nSize <<
p.nObjsAllocLog;
217 vVals.resize(nTotalSize);
218 if(
p.fCountOnes && nVars > 63)
219 fatal_error(
"nVars must be less than 64 to count ones");
221 for(
int i = 0; i < 6 && i < nVars; i++) {
222 for(
size j = 0; j < nSize; j++)
223 vVals[nSize * nObjs + j] = vars(i);
226 for(
int i = 0; i < nVars - 6; i++) {
227 for(
size j = 0; j < nSize; j += (2ull << i))
228 for(
size k = 0; k < (1ull << i); k++)
229 vVals[nSize * nObjs + j + k] = one();
232 nVerbose =
p.nVerbose;
234 if(nGbc ||
p.nReo != BvarMax())
235 vRefs.resize(nObjsAlloc);
243 if(nObjs >= nObjsAlloc && vDeads.empty()) {
244 bool fRemoved =
false;
247 if(!
Resize() && !fRemoved && (nGbc != 1 || !
Gbc()))
248 fatal_error(
"Memout (node)");
251 if(nObjs < nObjsAlloc)
254 zvar = vDeads.back(), vDeads.resize(vDeads.size() - 1);
255 for(j = 0; j < nSize; j++)
256 vVals[nSize * zvar + j] = (vVals[nSize * xvar + j] ^ xcompl) & (vVals[nSize * yvar + j] ^ ycompl);
265 void SetRef(std::vector<lit>
const &vLits) {
267 vRefs.resize(nObjsAlloc);
268 for(
size_t i = 0; i < vLits.size(); i++)
282 for(
size j = 0; j < nSize; j++)
283 std::cout << bsw(vVals[nSize * a + j] ^ c);
284 std::cout << std::endl;
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
bvar Lit2Bvar(lit x) const
bool LitIsCompl(lit x) const
lit LitNotCond(lit x, bool c) const
bool LitIsEq(lit x, lit y) const
void PrintNode(lit x) const
bool IsConst0(lit x) const
bool IsConst1(lit x) const
lit Bvar2Lit(bvar a) const
size OneCount(lit x) const
void SetRef(std::vector< lit > const &vLits)
std::vector< int > * pVar2Level