ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaNewTt.h
Go to the documentation of this file.
1
20
21#ifndef ABC__aig__gia__giaNewTt_h
22#define ABC__aig__gia__giaNewTt_h
23
24#include <cstdlib>
25#include <limits>
26#include <iomanip>
27#include <iostream>
28#include <vector>
29#include <bitset>
30
32
33namespace NewTt {
34
35 typedef int bvar;
36 typedef unsigned lit;
37 typedef unsigned short ref;
38 typedef unsigned long long size;
39
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(); }
44
45 static void fatal_error(const char* message) {
46 std::cerr << message << std::endl;
47 std::abort();
48 }
49
50 struct Param {
55 int nGbc;
56 int nReo; // dummy
57 std::vector<int> *pVar2Level; // dummy
59 nObjsAllocLog = 15;
60 nObjsMaxLog = 20;
61 nVerbose = 0;
62 fCountOnes = false;
63 nGbc = 0;
64 nReo = BvarMax();
65 }
66 };
67
68 class Man {
69 private:
70 typedef unsigned long long word;
71 typedef std::bitset<64> bsw;
72 static inline int ww() { return 64; } // word width
73 static inline int lww() { return 6; } // log word width
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};
82 return vars[i];
83 }
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};
92 return ones[i];
93 }
94
95 private:
96 int nVars;
97 bvar nObjs;
98 bvar nObjsAlloc;
99 bvar nObjsMax;
100 size nSize;
101 size nTotalSize;
102 std::vector<word> vVals;
103 std::vector<bvar> vDeads;
104 std::vector<ref> vRefs;
105 int nGbc;
106 int nVerbose;
107
108 public:
109 inline lit Bvar2Lit(bvar a) const { return (lit)a << 1; }
110 inline bvar Lit2Bvar(lit x) const { return (bvar)(x >> 1); }
111 inline lit IthVar(int v) const { return ((lit)v + 1) << 1; }
112 inline lit LitNot(lit x) const { return x ^ (lit)1; }
113 inline lit LitNotCond(lit x, bool c) const { return x ^ (lit)c; }
114 inline bool LitIsCompl(lit x) const { return x & (lit)1; }
115 inline ref Ref(lit x) const { return vRefs[Lit2Bvar(x)]; }
116 inline lit Const0() const { return (lit)0; }
117 inline lit Const1() const { return (lit)1; }
118 inline bool IsConst0(lit x) const {
119 bvar a = Lit2Bvar(x);
120 word c = LitIsCompl(x)? one(): 0;
121 for(size j = 0; j < nSize; j++)
122 if(vVals[nSize * a + j] ^ c)
123 return false;
124 return true;
125 }
126 inline bool IsConst1(lit x) const {
127 bvar a = Lit2Bvar(x);
128 word c = LitIsCompl(x)? one(): 0;
129 for(size j = 0; j < nSize; j++)
130 if(~(vVals[nSize * a + j] ^ c))
131 return false;
132 return true;
133 }
134 inline bool LitIsEq(lit x, lit y) const {
135 if(x == y)
136 return true;
137 if(x == LitMax() || y == LitMax())
138 return false;
139 bvar xvar = Lit2Bvar(x);
140 bvar yvar = Lit2Bvar(y);
141 word c = LitIsCompl(x) ^ LitIsCompl(y)? one(): 0;
142 for(size j = 0; j < nSize; j++)
143 if(vVals[nSize * xvar + j] ^ vVals[nSize * yvar + j] ^ c)
144 return false;
145 return true;
146 }
147 inline size OneCount(lit x) const {
148 bvar a = Lit2Bvar(x);
149 size count = 0;
150 if(nVars > 6) {
151 for(size j = 0; j < nSize; j++)
152 count += bsw(vVals[nSize * a + j]).count();
153 } else
154 count = bsw(vVals[nSize * a] & ones(nVars)).count();
155 return LitIsCompl(x)? ((size)1 << nVars) - count: count;
156 }
157
158 public:
159 inline void IncRef(lit x) { if(!vRefs.empty() && Ref(x) != RefMax()) vRefs[Lit2Bvar(x)]++; }
160 inline void DecRef(lit x) { if(!vRefs.empty() && Ref(x) != RefMax()) vRefs[Lit2Bvar(x)]--; }
161
162 public:
163 bool Resize() {
164 if(nObjsAlloc == nObjsMax)
165 return false;
166 lit nObjsAllocLit = (lit)nObjsAlloc << 1;
167 if(nObjsAllocLit > (lit)BvarMax())
168 nObjsAlloc = BvarMax();
169 else
170 nObjsAlloc = (bvar)nObjsAllocLit;
171 nTotalSize = nTotalSize << 1;
172 if(nVerbose >= 2)
173 std::cout << "Reallocating " << nObjsAlloc << " nodes" << std::endl;
174 vVals.resize(nTotalSize);
175 if(!vRefs.empty())
176 vRefs.resize(nObjsAlloc);
177 return true;
178 }
179 bool Gbc() {
180 if(nVerbose >= 2)
181 std::cout << "Garbage collect" << std::endl;
182 for(bvar a = nVars + 1; a < nObjs; a++)
183 if(!vRefs[a])
184 vDeads.push_back(a);
185 return vDeads.size();
186 }
187
188 public:
189 Man(int nVars, Param p): nVars(nVars) {
190 if(p.nObjsMaxLog < p.nObjsAllocLog)
191 fatal_error("nObjsMax must not be smaller than nObjsAlloc");
192 if(nVars >= lww())
193 nSize = 1ull << (nVars - lww());
194 else
195 nSize = 1;
196 if(!nSize)
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;
201 if(!nObjsMaxLit)
202 fatal_error("Memout (nObjsMax) in init");
203 if(nObjsMaxLit > (lit)BvarMax())
204 nObjsMax = BvarMax();
205 else
206 nObjsMax = (bvar)nObjsMaxLit;
207 lit nObjsAllocLit = (lit)1 << p.nObjsAllocLog;
208 if(!nObjsAllocLit)
209 fatal_error("Memout (nObjsAlloc) in init");
210 if(nObjsAllocLit > (lit)BvarMax())
211 nObjsAlloc = BvarMax();
212 else
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");
220 nObjs = 1;
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);
224 nObjs++;
225 }
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();
230 nObjs++;
231 }
232 nVerbose = p.nVerbose;
233 nGbc = p.nGbc;
234 if(nGbc || p.nReo != BvarMax())
235 vRefs.resize(nObjsAlloc);
236 }
237 inline lit And(lit x, lit y) {
238 bvar xvar = Lit2Bvar(x);
239 bvar yvar = Lit2Bvar(y);
240 word xcompl = LitIsCompl(x)? one(): 0;
241 word ycompl = LitIsCompl(y)? one(): 0;
242 unsigned j;
243 if(nObjs >= nObjsAlloc && vDeads.empty()) {
244 bool fRemoved = false;
245 if(nGbc > 1)
246 fRemoved = Gbc();
247 if(!Resize() && !fRemoved && (nGbc != 1 || !Gbc()))
248 fatal_error("Memout (node)");
249 }
250 bvar zvar;
251 if(nObjs < nObjsAlloc)
252 zvar = nObjs++;
253 else
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);
257 return zvar << 1;
258 }
259 inline lit Or(lit x, lit y) {
260 return LitNot(And(LitNot(x), LitNot(y)));
261 }
262 void Reorder() {} // dummy
263
264 public:
265 void SetRef(std::vector<lit> const &vLits) {
266 vRefs.clear();
267 vRefs.resize(nObjsAlloc);
268 for(size_t i = 0; i < vLits.size(); i++)
269 IncRef(vLits[i]);
270 }
272 if(!nGbc)
273 vRefs.clear();
274 }
275 void TurnOffReo() {}
276 int GetNumVars() const {
277 return nVars;
278 }
279 void PrintNode(lit x) const {
280 bvar a = Lit2Bvar(x);
281 word c = LitIsCompl(x)? one(): 0;
282 for(size j = 0; j < nSize; j++)
283 std::cout << bsw(vVals[nSize * a + j] ^ c);
284 std::cout << std::endl;
285 }
286 };
287
288}
289
291
292#endif
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
void Reorder()
Definition giaNewTt.h:262
lit Or(lit x, lit y)
Definition giaNewTt.h:259
int GetNumVars() const
Definition giaNewTt.h:276
void TurnOffReo()
Definition giaNewTt.h:275
bvar Lit2Bvar(lit x) const
Definition giaNewTt.h:110
lit LitNot(lit x) const
Definition giaNewTt.h:112
lit And(lit x, lit y)
Definition giaNewTt.h:237
bool Gbc()
Definition giaNewTt.h:179
bool LitIsCompl(lit x) const
Definition giaNewTt.h:114
void IncRef(lit x)
Definition giaNewTt.h:159
lit LitNotCond(lit x, bool c) const
Definition giaNewTt.h:113
lit Const0() const
Definition giaNewTt.h:116
bool LitIsEq(lit x, lit y) const
Definition giaNewTt.h:134
lit IthVar(int v) const
Definition giaNewTt.h:111
void RemoveRefIfUnused()
Definition giaNewTt.h:271
void PrintNode(lit x) const
Definition giaNewTt.h:279
bool IsConst0(lit x) const
Definition giaNewTt.h:118
lit Const1() const
Definition giaNewTt.h:117
Man(int nVars, Param p)
Definition giaNewTt.h:189
void DecRef(lit x)
Definition giaNewTt.h:160
ref Ref(lit x) const
Definition giaNewTt.h:115
bool IsConst1(lit x) const
Definition giaNewTt.h:126
lit Bvar2Lit(bvar a) const
Definition giaNewTt.h:109
bool Resize()
Definition giaNewTt.h:163
size OneCount(lit x) const
Definition giaNewTt.h:147
void SetRef(std::vector< lit > const &vLits)
Definition giaNewTt.h:265
Cube * p
Definition exorList.c:222
int bvar
Definition giaNewTt.h:35
unsigned lit
Definition giaNewTt.h:36
unsigned long long size
Definition giaNewTt.h:38
unsigned short ref
Definition giaNewTt.h:37
int lit
Definition satVec.h:130
int nObjsAllocLog
Definition giaNewTt.h:51
bool fCountOnes
Definition giaNewTt.h:54
int nObjsMaxLog
Definition giaNewTt.h:52
std::vector< int > * pVar2Level
Definition giaNewTt.h:57