110 word uOn0, uOn1, uOnDc0, uOnDc1, uRes0, uRes1, uRes2;
111 word Cost0, Cost1, Cost2;
int Var;
113 assert( (uOn & ~uOnDc) == 0 );
119 if ( uOnDc == ~(
word)0 )
122 if ( pCover ) pCover[0] = 0;
123 return Abc_Cube2Cost(1);
128 if ( Abc_Tt6HasVar( uOn,
Var ) || Abc_Tt6HasVar( uOnDc,
Var ) )
132 uOn0 = Abc_Tt6Cofactor0( uOn,
Var );
133 uOn1 = Abc_Tt6Cofactor1( uOn ,
Var );
134 uOnDc0 = Abc_Tt6Cofactor0( uOnDc,
Var );
135 uOnDc1 = Abc_Tt6Cofactor1( uOnDc,
Var );
138 if ( Cost0 >= CostLim )
return CostLim;
139 Cost1 =
Abc_Isop6Cover( uOn1 & ~uOnDc0, uOnDc1, &uRes1,
Var, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
140 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
141 Cost2 =
Abc_Isop6Cover( (uOn0 & ~uRes0) | (uOn1 & ~uRes1), uOnDc0 & uOnDc1, &uRes2,
Var, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
142 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
144 *pRes = uRes2 | (uRes0 & s_Truths6Neg[
Var]) | (uRes1 & s_Truths6[
Var]);
145 assert( (uOn & ~*pRes) == 0 && (*pRes & ~uOnDc) == 0 );
146 Abc_IsopAddLits( pCover, Cost0, Cost1,
Var );
147 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
151 word uOn0, uOn1, uOn2, uOnDc2, uRes0, uRes1, uRes2;
152 word Cost0, Cost1, Cost2;
int nVars = 6;
153 assert( (pOn[0] & ~pOnDc[0]) == 0 );
154 assert( (pOn[1] & ~pOnDc[1]) == 0 );
156 uOn0 = pOn[0] & ~pOnDc[1];
157 uOn1 = pOn[1] & ~pOnDc[0];
159 Cost0 =
Abc_IsopCheck( &uOn0, pOnDc, &uRes0, nVars, CostLim, pCover );
160 if ( Cost0 >= CostLim )
return CostLim;
161 Cost1 =
Abc_IsopCheck( &uOn1, pOnDc+1, &uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
162 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
163 uOn2 = (pOn[0] & ~uRes0) | (pOn[1] & ~uRes1);
164 uOnDc2 = pOnDc[0] & pOnDc[1];
165 Cost2 =
Abc_IsopCheck( &uOn2, &uOnDc2, &uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
166 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
168 pRes[0] = uRes2 | uRes0;
169 pRes[1] = uRes2 | uRes1;
170 assert( (pOn[0] & ~pRes[0]) == 0 && (pRes[0] & ~pOnDc[0]) == 0 );
171 assert( (pOn[1] & ~pRes[1]) == 0 && (pRes[1] & ~pOnDc[1]) == 0 );
172 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
173 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
177 word uOn2[2], uOnDc2[2], uRes0[2], uRes1[2], uRes2[2];
178 word Cost0, Cost1, Cost2;
int nVars = 7;
180 uOn2[0] = pOn[0] & ~pOnDc[2];
181 uOn2[1] = pOn[1] & ~pOnDc[3];
182 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
183 if ( Cost0 >= CostLim )
return CostLim;
185 uOn2[0] = pOn[2] & ~pOnDc[0];
186 uOn2[1] = pOn[3] & ~pOnDc[1];
187 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+2, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
188 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
190 uOn2[0] = (pOn[0] & ~uRes0[0]) | (pOn[2] & ~uRes1[0]); uOnDc2[0] = pOnDc[0] & pOnDc[2];
191 uOn2[1] = (pOn[1] & ~uRes0[1]) | (pOn[3] & ~uRes1[1]); uOnDc2[1] = pOnDc[1] & pOnDc[3];
192 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
193 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
195 pRes[0] = uRes2[0] | uRes0[0];
196 pRes[1] = uRes2[1] | uRes0[1];
197 pRes[2] = uRes2[0] | uRes1[0];
198 pRes[3] = uRes2[1] | uRes1[1];
199 assert( (pOn[0] & ~pRes[0]) == 0 && (pOn[1] & ~pRes[1]) == 0 && (pOn[2] & ~pRes[2]) == 0 && (pOn[3] & ~pRes[3]) == 0 );
200 assert( (pRes[0] & ~pOnDc[0])==0 && (pRes[1] & ~pOnDc[1])==0 && (pRes[2] & ~pOnDc[2])==0 && (pRes[3] & ~pOnDc[3])==0 );
201 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
202 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
206 word uOn2[4], uOnDc2[4], uRes0[4], uRes1[4], uRes2[4];
207 word Cost0, Cost1, Cost2;
int c, nVars = 8,
nWords = 4;
209 for ( c = 0; c <
nWords; c++ )
210 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
211 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
212 if ( Cost0 >= CostLim )
return CostLim;
214 for ( c = 0; c <
nWords; c++ )
215 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
216 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
217 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
219 for ( c = 0; c <
nWords; c++ )
220 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
221 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
222 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
224 for ( c = 0; c <
nWords; c++ )
225 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
227 for ( c = 0; c < (
nWords<<1); c++ )
228 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
229 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
230 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
234 word uOn2[8], uOnDc2[8], uRes0[8], uRes1[8], uRes2[8];
235 word Cost0, Cost1, Cost2;
int c, nVars = 9,
nWords = 8;
237 for ( c = 0; c <
nWords; c++ )
238 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
239 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
240 if ( Cost0 >= CostLim )
return CostLim;
242 for ( c = 0; c <
nWords; c++ )
243 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
244 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
245 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
247 for ( c = 0; c <
nWords; c++ )
248 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
249 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
250 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
252 for ( c = 0; c <
nWords; c++ )
253 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
255 for ( c = 0; c < (
nWords<<1); c++ )
256 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
257 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
258 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
262 word uOn2[16], uOnDc2[16], uRes0[16], uRes1[16], uRes2[16];
263 word Cost0, Cost1, Cost2;
int c, nVars = 10,
nWords = 16;
265 for ( c = 0; c <
nWords; c++ )
266 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
267 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
268 if ( Cost0 >= CostLim )
return CostLim;
270 for ( c = 0; c <
nWords; c++ )
271 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
272 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
273 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
275 for ( c = 0; c <
nWords; c++ )
276 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
277 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
278 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
280 for ( c = 0; c <
nWords; c++ )
281 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
283 for ( c = 0; c < (
nWords<<1); c++ )
284 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
285 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
286 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
290 word uOn2[32], uOnDc2[32], uRes0[32], uRes1[32], uRes2[32];
291 word Cost0, Cost1, Cost2;
int c, nVars = 11,
nWords = 32;
293 for ( c = 0; c <
nWords; c++ )
294 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
295 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
296 if ( Cost0 >= CostLim )
return CostLim;
298 for ( c = 0; c <
nWords; c++ )
299 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
300 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
301 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
303 for ( c = 0; c <
nWords; c++ )
304 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
305 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
306 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
308 for ( c = 0; c <
nWords; c++ )
309 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
311 for ( c = 0; c < (
nWords<<1); c++ )
312 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
313 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
314 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
318 word uOn2[64], uOnDc2[64], uRes0[64], uRes1[64], uRes2[64];
319 word Cost0, Cost1, Cost2;
int c, nVars = 12,
nWords = 64;
321 for ( c = 0; c <
nWords; c++ )
322 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
323 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
324 if ( Cost0 >= CostLim )
return CostLim;
326 for ( c = 0; c <
nWords; c++ )
327 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
328 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
329 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
331 for ( c = 0; c <
nWords; c++ )
332 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
333 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
334 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
336 for ( c = 0; c <
nWords; c++ )
337 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
339 for ( c = 0; c < (
nWords<<1); c++ )
340 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
341 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
342 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
346 word uOn2[128], uOnDc2[128], uRes0[128], uRes1[128], uRes2[128];
347 word Cost0, Cost1, Cost2;
int c, nVars = 13,
nWords = 128;
349 for ( c = 0; c <
nWords; c++ )
350 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
351 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
352 if ( Cost0 >= CostLim )
return CostLim;
354 for ( c = 0; c <
nWords; c++ )
355 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
356 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
357 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
359 for ( c = 0; c <
nWords; c++ )
360 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
361 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
362 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
364 for ( c = 0; c <
nWords; c++ )
365 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
367 for ( c = 0; c < (
nWords<<1); c++ )
368 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
369 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
370 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
374 word uOn2[256], uOnDc2[256], uRes0[256], uRes1[256], uRes2[256];
375 word Cost0, Cost1, Cost2;
int c, nVars = 14,
nWords = 256;
377 for ( c = 0; c <
nWords; c++ )
378 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
379 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
380 if ( Cost0 >= CostLim )
return CostLim;
382 for ( c = 0; c <
nWords; c++ )
383 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
384 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
385 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
387 for ( c = 0; c <
nWords; c++ )
388 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
389 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
390 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
392 for ( c = 0; c <
nWords; c++ )
393 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
395 for ( c = 0; c < (
nWords<<1); c++ )
396 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
397 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
398 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
402 word uOn2[512], uOnDc2[512], uRes0[512], uRes1[512], uRes2[512];
403 word Cost0, Cost1, Cost2;
int c, nVars = 15,
nWords = 512;
405 for ( c = 0; c <
nWords; c++ )
406 uOn2[c] = pOn[c] & ~pOnDc[c+
nWords];
407 Cost0 =
Abc_IsopCheck( uOn2, pOnDc, uRes0, nVars, CostLim, pCover );
408 if ( Cost0 >= CostLim )
return CostLim;
410 for ( c = 0; c <
nWords; c++ )
411 uOn2[c] = pOn[c+
nWords] & ~pOnDc[c];
412 Cost1 =
Abc_IsopCheck( uOn2, pOnDc+
nWords, uRes1, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
413 if ( Cost0 + Cost1 >= CostLim )
return CostLim;
415 for ( c = 0; c <
nWords; c++ )
416 uOn2[c] = (pOn[c] & ~uRes0[c]) | (pOn[c+
nWords] & ~uRes1[c]), uOnDc2[c] = pOnDc[c] & pOnDc[c+
nWords];
417 Cost2 =
Abc_IsopCheck( uOn2, uOnDc2, uRes2, nVars, CostLim, pCover ? pCover + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1) : NULL );
418 if ( Cost0 + Cost1 + Cost2 >= CostLim )
return CostLim;
420 for ( c = 0; c <
nWords; c++ )
421 pRes[c] = uRes2[c] | uRes0[c], pRes[c+
nWords] = uRes2[c] | uRes1[c];
423 for ( c = 0; c < (
nWords<<1); c++ )
424 assert( (pOn[c] & ~pRes[c] ) == 0 && (pRes[c] & ~pOnDc[c]) == 0 );
425 Abc_IsopAddLits( pCover, Cost0, Cost1, nVars );
426 return Cost0 + Cost1 + Cost2 + Abc_CostCubes(Cost0) + Abc_CostCubes(Cost1);
430 int nVarsNew;
word Cost;
432 return Abc_Isop6Cover( *pOn, *pOnDc, pRes, nVars, CostLim, pCover );
433 for ( nVarsNew = nVars; nVarsNew > 6; nVarsNew-- )
434 if ( Abc_TtHasVar( pOn, nVars, nVarsNew-1 ) || Abc_TtHasVar( pOnDc, nVars, nVarsNew-1 ) )
437 Cost =
Abc_Isop6Cover( *pOn, *pOnDc, pRes, nVarsNew, CostLim, pCover );
439 Cost = s_pFuncIsopCover[nVarsNew]( pOn, pOnDc, pRes, CostLim, pCover );
440 Abc_TtStretch6( pRes, nVarsNew, nVars );
514 word Cost0, Cost1, Cost, CostInit = Abc_Cube2Cost(nCubeLim);
516 Vec_IntGrow( vCover, 1 << (nVars-1) );
519 Cost0 =
Abc_IsopCheck( pFunc, pFunc, pRes, nVars, CostInit, NULL );
520 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
521 Cost1 =
Abc_IsopCheck( pFunc, pFunc, pRes, nVars, Cost0, NULL );
522 Cost = Abc_MinWord( Cost0, Cost1 );
523 if ( Cost == CostInit )
525 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
530 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
531 Abc_IsopCheck( pFunc, pFunc, pRes, nVars, CostInit, Vec_IntArray(vCover) );
535 Abc_IsopCheck( pFunc, pFunc, pRes, nVars, CostInit, Vec_IntArray(vCover) );
536 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
541 Cost = Cost0 =
Abc_IsopCheck( pFunc, pFunc, pRes, nVars, CostInit, Vec_IntArray(vCover) );
542 if ( Cost == CostInit )
545 vCover->nSize = Abc_CostCubes(Cost);
546 assert( vCover->nSize <= vCover->nCap );
548 return Cost != Cost0;
565 word Cost0, Cost1, CostInit = Abc_Cube2Cost(nCubeLim);
566 int c, nCubes0, nCubes1;
568 assert( Abc_TtHasVar( pFunc, nVars, nVars - 1 ) );
570 Cost0 = s_pFuncIsopCover[nVars]( pFunc, pFunc, pRes, CostInit, pCover );
572 Cost0 =
Abc_Isop6Cover( *pFunc, *pFunc, pRes, nVars, CostInit, pCover );
573 if ( Cost0 >= CostInit )
575 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
577 Cost1 = s_pFuncIsopCover[nVars]( pFunc, pFunc, pRes, CostInit, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
579 Cost1 =
Abc_Isop6Cover( *pFunc, *pFunc, pRes, nVars, CostInit, pCover ? pCover + Abc_CostCubes(Cost0) : NULL );
580 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
581 if ( Cost0 + Cost1 >= CostInit )
583 nCubes0 = Abc_CostCubes(Cost0);
584 nCubes1 = Abc_CostCubes(Cost1);
587 for ( c = 0; c < nCubes0; c++ )
588 pCover[c] |= (1 << Abc_Var2Lit(nVars, 0));
589 for ( c = 0; c < nCubes1; c++ )
590 pCover[c+nCubes0] |= (1 << Abc_Var2Lit(nVars, 1));
592 return nCubes0 + nCubes1;
716 word r0, r1, r2, Max;
723 if ( pCover ) *pCover = 0;
724 return Abc_Cube2Cost(1);
729 if ( Abc_Tt6HasVar( t,
Var ) )
733 c0 = Abc_Tt6Cofactor0( t,
Var );
734 c1 = Abc_Tt6Cofactor1( t,
Var );
737 if ( r0 >= CostLim )
return CostLim;
738 r1 =
Abc_Esop6Cover( c1,
Var, CostLim, pCover ? pCover + Abc_CostCubes(r0) : NULL );
739 if ( r1 >= CostLim )
return CostLim;
740 r2 =
Abc_Esop6Cover( c0 ^ c1,
Var, CostLim, pCover ? pCover + Abc_CostCubes(r0) + Abc_CostCubes(r1) : NULL );
741 if ( r2 >= CostLim )
return CostLim;
742 Max = Abc_MaxWord( r0, Abc_MaxWord(r1, r2) );
743 if ( r0 + r1 + r2 - Max >= CostLim )
return CostLim;
744 return r0 + r1 + r2 - Max + Abc_EsopAddLits( pCover, r0, r1, r2, Max,
Var );
748 word r0, r1, r2, Max;
749 int c,
nWords = (1 << (nVars - 7));
751 assert( Abc_TtHasVar( pOn, nVars, nVars - 1 ) );
753 if ( r0 >= CostLim )
return CostLim;
754 r1 =
Abc_EsopCheck( pOn+
nWords, nVars-1, CostLim, pCover ? pCover + Abc_CostCubes(r0) : NULL );
755 if ( r1 >= CostLim )
return CostLim;
756 for ( c = 0; c <
nWords; c++ )
758 r2 =
Abc_EsopCheck( pOn, nVars-1, CostLim, pCover ? pCover + Abc_CostCubes(r0) + Abc_CostCubes(r1) : NULL );
759 for ( c = 0; c <
nWords; c++ )
761 if ( r2 >= CostLim )
return CostLim;
762 Max = Abc_MaxWord( r0, Abc_MaxWord(r1, r2) );
763 if ( r0 + r1 + r2 - Max >= CostLim )
return CostLim;
764 return r0 + r1 + r2 - Max + Abc_EsopAddLits( pCover, r0, r1, r2, Max, nVars-1 );
882 int pBlocks[16], nBlocks, vTwo, uTwo;
883 int nWords = Abc_TtWordNum(nVars);
884 int c, v, u, iMint,
Cube, nLits = 0;
886 Abc_TtClear( pRes,
nWords );
887 Abc_TtCopy( pOnset, pOn,
nWords, 0 );
888 Abc_TtCopy( pOffset, pOnDc,
nWords, 1 );
890 pOnset[0] >>= (64 - (1 << nVars));
891 for ( c = 0; !Abc_TtIsConst0(pOnset,
nWords); c++ )
894 iMint = Abc_TtFindFirstBit(pOnset, nVars);
895 for (
Cube = v = 0; v < nVars; v++ )
896 Cube |= (1 << Abc_Var2Lit(v, (iMint >> v) & 1));
899 for ( v = 0; v < nVars; v++ )
900 if ( (pBlocks[v] = Abc_TtGetBit(pOffset, iMint ^ (1 << v))) )
903 if ( nBlocks == nVars )
905 Abc_TtSetBit( pRes, iMint );
906 Abc_TtXorBit( pOnset, iMint );
913 if ( nBlocks < nVars - 1 )
915 for ( v = 0; v < nVars && vTwo == -1; v++ )
917 for ( u = v + 1; u < nVars; u++ )
920 if ( Abc_TtGetBit( pOffset, iMint ^ (1 << v) ^ (1 << u) ) )
930 for ( v = 0; v < nVars; v++ )
933 Abc_TtSetBit( pRes, iMint );
934 Abc_TtSetBit( pRes, iMint ^ (1 << v) );
935 Abc_TtXorBit( pOnset, iMint );
936 if ( Abc_TtGetBit(pOnset, iMint ^ (1 << v)) )
937 Abc_TtXorBit( pOnset, iMint ^ (1 << v) );
938 pCover[c] =
Cube & ~(3 << Abc_Var2Lit(v, 0));
942 if ( nBlocks == nVars - 2 && vTwo >= 0 )
944 Abc_TtSetBit( pRes, iMint );
945 Abc_TtSetBit( pRes, iMint ^ (1 << vTwo) );
946 Abc_TtSetBit( pRes, iMint ^ (1 << uTwo) );
947 Abc_TtSetBit( pRes, iMint ^ (1 << vTwo) ^ (1 << uTwo) );
948 Abc_TtXorBit( pOnset, iMint );
949 if ( Abc_TtGetBit(pOnset, iMint ^ (1 << vTwo)) )
950 Abc_TtXorBit( pOnset, iMint ^ (1 << vTwo) );
951 if ( Abc_TtGetBit(pOnset, iMint ^ (1 << uTwo)) )
952 Abc_TtXorBit( pOnset, iMint ^ (1 << uTwo) );
953 if ( Abc_TtGetBit(pOnset, iMint ^ (1 << vTwo) ^ (1 << uTwo)) )
954 Abc_TtXorBit( pOnset, iMint ^ (1 << vTwo) ^ (1 << uTwo) );
955 pCover[c] =
Cube & ~(3 << Abc_Var2Lit(vTwo, 0)) & ~(3 << Abc_Var2Lit(uTwo, 0));
960 Abc_TtClear( pCube,
nWords );
961 Abc_TtSetBit( pCube, iMint );
962 Abc_TtSetBit( pCube, iMint ^ (1 << vTwo) );
963 Abc_TtSetBit( pCube, iMint ^ (1 << uTwo) );
964 Abc_TtSetBit( pCube, iMint ^ (1 << vTwo) ^ (1 << uTwo) );
965 Cube &= ~(3 << Abc_Var2Lit(vTwo, 0)) & ~(3 << Abc_Var2Lit(uTwo, 0));
968 for ( v = 0; v < nVars; v++ )
969 if ( v != vTwo && v != uTwo )
971 int Shift = Abc_Var2Lit( v, 0 );
972 if ( (
Cube >> Shift) == 2 && Abc_TtCheckWithCubePos2Neg(pOffset, pCube,
nWords, v) )
974 Abc_TtExpandCubePos2Neg( pCube,
nWords, v );
975 Cube &= ~(3 << Shift);
977 else if ( (
Cube >> Shift) == 1 && Abc_TtCheckWithCubeNeg2Pos(pOffset, pCube,
nWords, v) )
979 Abc_TtExpandCubeNeg2Pos( pCube,
nWords, v );
980 Cube &= ~(3 << Shift);
986 Abc_TtOr( pRes, pRes, pCube,
nWords );
987 Abc_TtSharp( pOnset, pOnset, pCube,
nWords );
990 pRes[0] = Abc_Tt6Stretch( pRes[0], nVars );
991 return Abc_Cube2Cost(c) | nLits;
996 Vec_Int_t * vCover = Vec_IntAlloc( 1000 );
997 word r, t = (s_Truths6[0] & s_Truths6[1]) ^ (s_Truths6[2] & s_Truths6[3]), copy = t;
1003 vCover->nSize = Abc_CostCubes(Cost);
1004 assert( vCover->nSize <= vCover->nCap );
1005 printf(
"Cubes = %d. Lits = %d.\n", Abc_CostCubes(Cost), Abc_CostLits(Cost) );
1007 Abc_IsopVerify( ©, nVars, &r, vCover, 1, 0 );
1008 Vec_IntFree( vCover );
1025 static word TotalCost[6] = {0};
1026 static abctime TotalTime[6] = {0};
1032 if ( Counter == 9999 )
1034 Abc_PrintTime( 1,
"0", TotalTime[0] );
1035 Abc_PrintTime( 1,
"1", TotalTime[1] );
1036 Abc_PrintTime( 1,
"2", TotalTime[2] );
1037 Abc_PrintTime( 1,
"3", TotalTime[3] );
1038 Abc_PrintTime( 1,
"4", TotalTime[4] );
1039 Abc_PrintTime( 1,
"5", TotalTime[5] );
1047 vCover->nSize = Abc_CostCubes(Cost);
1048 assert( vCover->nSize <= vCover->nCap );
1050 printf(
"%5d %7d ", Abc_CostCubes(Cost), Abc_CostLits(Cost) );
1052 TotalCost[0] += Abc_CostCubes(Cost);
1053 TotalTime[0] += Abc_Clock() - clk;
1057 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
1059 Abc_TtNot( pFunc, Abc_TtWordNum(nVars) );
1060 vCover->nSize = Abc_CostCubes(Cost);
1061 assert( vCover->nSize <= vCover->nCap );
1063 printf(
"%5d %7d ", Abc_CostCubes(Cost), Abc_CostLits(Cost) );
1065 TotalCost[1] += Abc_CostCubes(Cost);
1066 TotalTime[1] += Abc_Clock() - clk;
1121 TotalCost[5] += Vec_IntSize(vCover);
1122 TotalTime[5] += Abc_Clock() - clk;
1125 printf(
" | %8d %8d %8d %8d %8d %8d", (
int)TotalCost[0], (
int)TotalCost[1], (
int)TotalCost[2], (
int)TotalCost[3], (
int)TotalCost[4], (
int)TotalCost[5] );