155 assert( !Hop_IsComplement(pNode) );
157 if ( !Hop_ObjIsAnd(pNode) )
160 if ( !Hop_ObjFaninC0(pNode) || !Hop_ObjFaninC1(pNode) )
163 pNode0 = Hop_ObjFanin0(pNode);
164 pNode1 = Hop_ObjFanin1(pNode);
166 if ( !Hop_ObjIsAnd(pNode0) || !Hop_ObjIsAnd(pNode1) )
169 return (Hop_ObjFanin0(pNode0) == Hop_ObjFanin0(pNode1) && (Hop_ObjFaninC0(pNode0) ^ Hop_ObjFaninC0(pNode1))) ||
170 (Hop_ObjFanin0(pNode0) == Hop_ObjFanin1(pNode1) && (Hop_ObjFaninC0(pNode0) ^ Hop_ObjFaninC1(pNode1))) ||
171 (Hop_ObjFanin1(pNode0) == Hop_ObjFanin0(pNode1) && (Hop_ObjFaninC1(pNode0) ^ Hop_ObjFaninC0(pNode1))) ||
172 (Hop_ObjFanin1(pNode0) == Hop_ObjFanin1(pNode1) && (Hop_ObjFaninC1(pNode0) ^ Hop_ObjFaninC1(pNode1)));
190 assert( !Hop_IsComplement(pObj) );
191 if ( !Hop_ObjIsNode(pObj) )
193 if ( Hop_ObjIsExor(pObj) )
195 *ppFan0 = Hop_ObjChild0(pObj);
196 *ppFan1 = Hop_ObjChild1(pObj);
199 assert( Hop_ObjIsAnd(pObj) );
200 p0 = Hop_ObjChild0(pObj);
201 p1 = Hop_ObjChild1(pObj);
202 if ( !Hop_IsComplement(p0) || !Hop_IsComplement(p1) )
204 p0 = Hop_Regular(p0);
205 p1 = Hop_Regular(p1);
206 if ( !Hop_ObjIsAnd(p0) || !Hop_ObjIsAnd(p1) )
208 if ( Hop_ObjFanin0(p0) != Hop_ObjFanin0(p1) || Hop_ObjFanin1(p0) != Hop_ObjFanin1(p1) )
210 if ( Hop_ObjFaninC0(p0) == Hop_ObjFaninC0(p1) || Hop_ObjFaninC1(p0) == Hop_ObjFaninC1(p1) )
212 *ppFan0 = Hop_ObjChild0(p0);
213 *ppFan1 = Hop_ObjChild1(p0);
234 assert( !Hop_IsComplement(pNode) );
237 pNode0 = Hop_ObjFanin0(pNode);
238 pNode1 = Hop_ObjFanin1(pNode);
241 if ( Hop_ObjFanin1(pNode0) == Hop_ObjFanin1(pNode1) && (Hop_ObjFaninC1(pNode0) ^ Hop_ObjFaninC1(pNode1)) )
244 if ( Hop_ObjFaninC1(pNode0) )
246 *ppNodeT = Hop_Not(Hop_ObjChild0(pNode1));
247 *ppNodeE = Hop_Not(Hop_ObjChild0(pNode0));
248 return Hop_ObjChild1(pNode1);
252 *ppNodeT = Hop_Not(Hop_ObjChild0(pNode0));
253 *ppNodeE = Hop_Not(Hop_ObjChild0(pNode1));
254 return Hop_ObjChild1(pNode0);
257 else if ( Hop_ObjFanin0(pNode0) == Hop_ObjFanin0(pNode1) && (Hop_ObjFaninC0(pNode0) ^ Hop_ObjFaninC0(pNode1)) )
260 if ( Hop_ObjFaninC0(pNode0) )
262 *ppNodeT = Hop_Not(Hop_ObjChild1(pNode1));
263 *ppNodeE = Hop_Not(Hop_ObjChild1(pNode0));
264 return Hop_ObjChild0(pNode1);
268 *ppNodeT = Hop_Not(Hop_ObjChild1(pNode0));
269 *ppNodeE = Hop_Not(Hop_ObjChild1(pNode1));
270 return Hop_ObjChild0(pNode0);
273 else if ( Hop_ObjFanin0(pNode0) == Hop_ObjFanin1(pNode1) && (Hop_ObjFaninC0(pNode0) ^ Hop_ObjFaninC1(pNode1)) )
276 if ( Hop_ObjFaninC0(pNode0) )
278 *ppNodeT = Hop_Not(Hop_ObjChild0(pNode1));
279 *ppNodeE = Hop_Not(Hop_ObjChild1(pNode0));
280 return Hop_ObjChild1(pNode1);
284 *ppNodeT = Hop_Not(Hop_ObjChild1(pNode0));
285 *ppNodeE = Hop_Not(Hop_ObjChild0(pNode1));
286 return Hop_ObjChild0(pNode0);
289 else if ( Hop_ObjFanin1(pNode0) == Hop_ObjFanin0(pNode1) && (Hop_ObjFaninC1(pNode0) ^ Hop_ObjFaninC0(pNode1)) )
292 if ( Hop_ObjFaninC1(pNode0) )
294 *ppNodeT = Hop_Not(Hop_ObjChild1(pNode1));
295 *ppNodeE = Hop_Not(Hop_ObjChild0(pNode0));
296 return Hop_ObjChild0(pNode1);
300 *ppNodeT = Hop_Not(Hop_ObjChild0(pNode0));
301 *ppNodeE = Hop_Not(Hop_ObjChild1(pNode1));
302 return Hop_ObjChild1(pNode0);
328 fCompl = Hop_IsComplement(pObj);
329 pObj = Hop_Regular(pObj);
331 if ( Hop_ObjIsConst1(pObj) )
333 fprintf( pFile,
"%d", !fCompl );
337 if ( Hop_ObjIsPi(pObj) )
339 fprintf( pFile,
"%s%s", fCompl?
"!" :
"", (
char*)pObj->
pData );
343 Vec_VecExpand( vLevels, Level );
344 vSuper = Vec_VecEntry(vLevels, Level);
346 fprintf( pFile,
"%s", (Level==0?
"" :
"(") );
349 Hop_ObjPrintEqn( pFile, Hop_NotCond(pFanin, fCompl), vLevels, Level+1 );
350 if ( i < Vec_PtrSize(vSuper) - 1 )
351 fprintf( pFile,
" %s ", fCompl?
"+" :
"*" );
353 fprintf( pFile,
"%s", (Level==0?
"" :
")") );
372 Hop_Obj_t * pFanin, * pFanin0, * pFanin1, * pFaninC;
375 fCompl = Hop_IsComplement(pObj);
376 pObj = Hop_Regular(pObj);
378 if ( Hop_ObjIsConst1(pObj) )
380 fprintf( pFile,
"1\'b%d", !fCompl );
384 if ( Hop_ObjIsPi(pObj) )
386 fprintf( pFile,
"%s%s", fCompl?
"~" :
"", (
char*)pObj->
pData );
390 if ( !fOnlyAnds && Hop_ObjIsExor(pObj) )
392 Vec_VecExpand( vLevels, Level );
393 vSuper = Vec_VecEntry( vLevels, Level );
395 fprintf( pFile,
"%s", (Level==0?
"" :
"(") );
398 Hop_ObjPrintVerilog( pFile, Hop_NotCond(pFanin, (fCompl && i==0)), vLevels, Level+1, fOnlyAnds );
399 if ( i < Vec_PtrSize(vSuper) - 1 )
400 fprintf( pFile,
" ^ " );
402 fprintf( pFile,
"%s", (Level==0?
"" :
")") );
410 fprintf( pFile,
"%s", (Level==0?
"" :
"(") );
412 fprintf( pFile,
" ^ " );
414 fprintf( pFile,
"%s", (Level==0?
"" :
")") );
419 fprintf( pFile,
"%s", (Level==0?
"" :
"(") );
421 fprintf( pFile,
" ? " );
423 fprintf( pFile,
" : " );
425 fprintf( pFile,
"%s", (Level==0?
"" :
")") );
430 Vec_VecExpand( vLevels, Level );
431 vSuper = Vec_VecEntry(vLevels, Level);
433 fprintf( pFile,
"%s", (Level==0?
"" :
"(") );
437 if ( i < Vec_PtrSize(vSuper) - 1 )
438 fprintf( pFile,
" %s ", fCompl?
"|" :
"&" );
440 fprintf( pFile,
"%s", (Level==0?
"" :
")") );
514 int i, nDigits, Counter = 0;
515 if ( Hop_ManPoNum(
p) == 0 )
517 printf(
"Hop_ManDumpBlif(): AIG manager does not have POs.\n" );
523 Hop_ManConst1(
p)->pData = (
void *)(ABC_PTRUINT_T)Counter++;
525 pObj->
pData = (
void *)(ABC_PTRUINT_T)Counter++;
527 pObj->
pData = (
void *)(ABC_PTRUINT_T)Counter++;
529 pObj->
pData = (
void *)(ABC_PTRUINT_T)Counter++;
530 nDigits = Hop_Base10Log( Counter );
532 pFile = fopen( pFileName,
"w" );
533 fprintf( pFile,
"# BLIF file written by procedure Hop_ManDumpBlif() in ABC\n" );
534 fprintf( pFile,
"# http://www.eecs.berkeley.edu/~alanmi/abc/\n" );
535 fprintf( pFile,
".model test\n" );
537 fprintf( pFile,
".inputs" );
539 fprintf( pFile,
" n%0*d", nDigits, (
int)(ABC_PTRUINT_T)pObj->
pData );
540 fprintf( pFile,
"\n" );
542 fprintf( pFile,
".outputs" );
544 fprintf( pFile,
" n%0*d", nDigits, (
int)(ABC_PTRUINT_T)pObj->
pData );
545 fprintf( pFile,
"\n" );
549 fprintf( pFile,
".names n%0*d n%0*d n%0*d\n",
550 nDigits, (
int)(ABC_PTRUINT_T)Hop_ObjFanin0(pObj)->pData,
551 nDigits, (
int)(ABC_PTRUINT_T)Hop_ObjFanin1(pObj)->pData,
552 nDigits, (
int)(ABC_PTRUINT_T)pObj->
pData );
553 fprintf( pFile,
"%d%d 1\n", !Hop_ObjFaninC0(pObj), !Hop_ObjFaninC1(pObj) );
558 fprintf( pFile,
".names n%0*d n%0*d\n",
559 nDigits, (
int)(ABC_PTRUINT_T)Hop_ObjFanin0(pObj)->pData,
560 nDigits, (
int)(ABC_PTRUINT_T)pObj->
pData );
561 fprintf( pFile,
"%d 1\n", !Hop_ObjFaninC0(pObj) );
562 if ( Hop_ObjIsConst1(Hop_ObjFanin0(pObj)) )
563 pConst1 = Hop_ManConst1(
p);
566 fprintf( pFile,
".names n%0*d\n 1\n", nDigits, (
int)(ABC_PTRUINT_T)pConst1->
pData );
567 fprintf( pFile,
".end\n\n" );
569 Vec_PtrFree( vNodes );