145 int fAddFreeVars = 1;
147 Abc_Obj_t ** pValues, ** pValuesF, ** pValuesF2;
148 Abc_Obj_t * pTemp, * pTemp2, * pFanin, * pFanin2, * pNet;
149 int k, v, Def, DefIndex, Index, nValues, nValuesF, nValuesF2;
152 assert( Abc_ObjIsNode(pObj) );
153 pNet = Abc_ObjFanout0(pObj);
154 nValues = Abc_ObjMvVarNum(pNet);
156 for ( k = 0; k < nValues; k++ )
160 pSop = (
char *)pObj->
pData;
165 if ( Abc_ObjFaninNum(pObj) == 0 )
169 while ( *pSop++ !=
'\n' );
177 Index = Abc_StringGetNumber( &pSop );
178 assert( Index < nValues );
181 if ( fAddFreeVars && nValues == 2 && *pSop ==
'-' )
183 pValues[1] = Abc_NtkCreatePi(pNtkNew);
184 pValues[0] = Abc_ObjNot( pValues[1] );
203 DefIndex = Abc_StringGetNumber( &pSop );
204 assert( DefIndex < Abc_ObjFaninNum(pObj) );
206 else if ( *pSop ==
'-' )
213 Def = Abc_StringGetNumber( &pSop );
235 printf(
"Abc_NodeStrashBlifMv(): Cannot handle complement in the MV function of node %s.\n",
Abc_ObjName(Abc_ObjFanout0(pObj)) );
241 printf(
"Abc_NodeStrashBlifMv(): Cannot handle braces in the MV function of node %s.\n",
Abc_ObjName(Abc_ObjFanout0(pObj)) );
245 nValuesF = Abc_ObjMvVarNum(pFanin);
251 while ( *pSop !=
')' )
253 Index = Abc_StringGetNumber( &pSop );
254 assert( Index < nValuesF );
256 assert( *pSop ==
')' || *pSop ==
',' );
263 else if ( *pSop ==
'=' )
267 Index = Abc_StringGetNumber( &pSop );
268 assert( Index < Abc_ObjFaninNum(pObj) );
271 pFanin2 = Abc_ObjFanin( pObj, Index );
272 nValuesF2 = Abc_ObjMvVarNum(pFanin2);
275 assert( nValuesF == nValuesF2 );
277 for ( v = 0; v < nValues; v++ )
282 Index = Abc_StringGetNumber( &pSop );
283 assert( Index < nValuesF );
284 pTemp2 = pValuesF[Index];
297 Index = Abc_StringGetNumber( &pSop );
298 assert( Index < Abc_ObjFaninNum(pObj) );
300 pFanin = Abc_ObjFanin( pObj, Index );
301 nValuesF = Abc_ObjMvVarNum(pFanin);
303 assert( nValuesF == nValues );
304 for ( k = 0; k < nValuesF; k++ )
310 Index = Abc_StringGetNumber( &pSop );
311 assert( Index < nValues );
320 if ( Def >= 0 || DefIndex >= 0 )
323 for ( k = 0; k < nValues; k++ )
332 pValues[Def] = pTemp;
337 pFanin = Abc_ObjFanin( pObj, DefIndex );
338 nValuesF = Abc_ObjMvVarNum(pFanin);
340 assert( nValuesF == nValues );
341 for ( k = 0; k < nValuesF; k++ )
385 int fUsePositional = 0;
390 Abc_Obj_t * pObj, * pTemp, * pBit, * pNet;
391 int i, k, v, nValues, nValuesMax, nBits;
392 int nCount1, nCount2;
394 assert( Abc_NtkIsNetlist(pNtk) );
395 assert( Abc_NtkHasBlifMv(pNtk) );
396 assert( Abc_NtkWhiteboxNum(pNtk) == 0 );
397 assert( Abc_NtkBlackboxNum(pNtk) == 0 );
403 nValues = Abc_ObjMvVarNum(pObj);
404 if ( nValuesMax < nValues )
405 nValuesMax = nValues;
407 nBits = Abc_Base2Log( nValuesMax );
421 nCount1 = nCount2 = 0;
423 Abc_NtkIncrementTravId( pNtk );
424 if ( fUsePositional )
428 if ( !Abc_ObjIsPi(pObj) )
430 pNet = Abc_ObjFanout0(pObj);
431 nValues = Abc_ObjMvVarNum(pNet);
434 for ( v = 0; v < nValues; v++ )
436 pValues[v] = Abc_NtkCreatePi( pNtkNew );
437 if ( nValuesMax == 2 )
440 Abc_NtkConvertAssignName( pValues[v], pNet, v );
445 Abc_NodeSetTravIdCurrent( pNet );
449 if ( Abc_ObjIsPi(pObj) )
451 pNet = Abc_ObjFanout0(pObj);
452 nValues = Abc_ObjMvVarNum(pNet);
455 for ( v = 0; v < nValues; v++ )
457 pValues[v] = Abc_NtkCreateBo( pNtkNew );
458 if ( nValuesMax == 2 )
461 Abc_NtkConvertAssignName( pValues[v], pNet, v );
467 Abc_NodeSetTravIdCurrent( pNet );
474 if ( !Abc_ObjIsPi(pObj) )
476 pNet = Abc_ObjFanout0(pObj);
477 nValues = Abc_ObjMvVarNum(pNet);
480 nBits = Abc_Base2Log( nValues );
481 for ( k = 0; k < nBits; k++ )
483 pBits[k] = Abc_NtkCreatePi( pNtkNew );
484 if ( nValuesMax == 2 )
487 Abc_NtkConvertAssignName( pBits[k], pNet, k );
490 for ( v = 0; v < nValues; v++ )
493 for ( k = 0; k < nBits; k++ )
495 pBit = Abc_ObjNotCond( pBits[k], (v&(1<<k)) == 0 );
502 Abc_NodeSetTravIdCurrent( pNet );
506 if ( Abc_ObjIsPi(pObj) )
508 pNet = Abc_ObjFanout0(pObj);
509 nValues = Abc_ObjMvVarNum(pNet);
512 nBits = Abc_Base2Log( nValues );
513 for ( k = 0; k < nBits; k++ )
515 pBits[k] = Abc_NtkCreateBo( pNtkNew );
516 if ( nValuesMax == 2 )
519 Abc_NtkConvertAssignName( pBits[k], pNet, k );
523 for ( v = 0; v < nValues; v++ )
526 for ( k = 0; k < nBits; k++ )
528 pBit = Abc_ObjNotCond( pBits[k], (v&(1<<k)) == 0 );
535 Abc_NodeSetTravIdCurrent( pNet );
546 Vec_PtrFree( vNodes );
549 if ( fUsePositional )
553 if ( !Abc_ObjIsPo(pObj) )
555 pNet = Abc_ObjFanin0(pObj);
560 nValues = Abc_ObjMvVarNum(pNet);
562 for ( v = 0; v < nValues; v++ )
564 pTemp = Abc_NtkCreatePo( pNtkNew );
566 if ( nValuesMax == 2 )
569 Abc_NtkConvertAssignName( pTemp, pNet, v );
574 if ( Abc_ObjIsPo(pObj) )
576 pNet = Abc_ObjFanin0(pObj);
581 nValues = Abc_ObjMvVarNum(pNet);
583 for ( v = 0; v < nValues; v++ )
585 pTemp = Abc_NtkCreateBi( pNtkNew );
587 if ( nValuesMax == 2 )
590 Abc_NtkConvertAssignName( pTemp, pNet, v );
599 if ( !Abc_ObjIsPo(pObj) )
601 pNet = Abc_ObjFanin0(pObj);
606 nValues = Abc_ObjMvVarNum(pNet);
608 nBits = Abc_Base2Log( nValues );
609 for ( k = 0; k < nBits; k++ )
612 for ( v = 0; v < nValues; v++ )
615 pTemp = Abc_NtkCreatePo( pNtkNew );
617 if ( nValuesMax == 2 )
620 Abc_NtkConvertAssignName( pTemp, pNet, k );
625 if ( Abc_ObjIsPo(pObj) )
627 pNet = Abc_ObjFanin0(pObj);
632 nValues = Abc_ObjMvVarNum(pNet);
634 nBits = Abc_Base2Log( nValues );
635 for ( k = 0; k < nBits; k++ )
638 for ( v = 0; v < nValues; v++ )
641 pTemp = Abc_NtkCreateBi( pNtkNew );
643 if ( nValuesMax == 2 )
646 Abc_NtkConvertAssignName( pTemp, pNet, k );
652 if ( Abc_NtkLatchNum(pNtk) )
658 vTemp = Vec_PtrAlloc( Vec_PtrSize(pNtkNew->
vPis) );
661 Vec_PtrPush( vTemp, pObj );
664 Vec_PtrPush( vTemp, pObj );
665 assert( Vec_PtrSize(vTemp) == Vec_PtrSize(pNtkNew->
vPis) );
666 Vec_PtrFree( pNtkNew->
vPis );
667 pNtkNew->
vPis = vTemp;
669 vTemp = Vec_PtrAlloc( Vec_PtrSize(pNtkNew->
vCis) );
672 Vec_PtrPush( vTemp, pObj );
675 Vec_PtrPush( vTemp, pObj );
676 assert( Vec_PtrSize(vTemp) == Vec_PtrSize(pNtkNew->
vCis) );
677 Vec_PtrFree( pNtkNew->
vCis );
678 pNtkNew->
vCis = vTemp;
680 assert( nCount1 == nCount2 );
681 for ( i = 0; i < nCount1; i++ )
684 pLatch = Abc_NtkCreateLatch( pNtkNew );
685 Abc_LatchSetInit0( pLatch );
688 pObjLi = Abc_NtkCo( pNtkNew, Abc_NtkCoNum(pNtkNew)-nCount1+i );
689 pObjLo = Abc_NtkCi( pNtkNew, Abc_NtkCiNum(pNtkNew)-nCount1+i );
709 fprintf( stdout,
"Abc_NtkStrashBlifMv(): Network check has failed.\n" );
729 int fUsePositional = 0;
731 Abc_Obj_t * pObj, * pNet, * pNetNew, * pNodeNew, * pTermNew, * pBoxNew;
732 int i, k, v, nValues, nBits;
734 assert( Abc_NtkIsNetlist(pNtk) );
735 assert( Abc_NtkHasBlifMv(pNtk) );
736 assert( Abc_NtkWhiteboxNum(pNtk) == 0 );
737 assert( Abc_NtkBlackboxNum(pNtk) == 0 );
748 pBoxNew = Abc_NtkCreateWhitebox( pNtkNew );
753 pNet = Abc_ObjFanout0(pObj);
761 pNet = Abc_ObjFanin0(pObj);
762 if ( pNet->
pCopy == NULL )
771 pNet = Abc_ObjFanout0(Abc_ObjFanout0(pObj));
776 pNet = Abc_ObjFanin0(Abc_ObjFanin0(pObj));
777 if ( pNet->
pCopy == NULL )
783 Abc_NtkIncrementTravId( pNtk );
784 if ( fUsePositional )
788 pNet = Abc_ObjFanout0(pObj);
789 nValues = Abc_ObjMvVarNum(pNet);
790 for ( v = 0; v < nValues; v++ )
792 pNodeNew = Abc_NtkCreateNode( pNtkNew );
794 pNetNew = Abc_NtkCreateNet( pNtkNew );
795 pTermNew = Abc_NtkCreateBi( pNtkNew );
802 Abc_NodeSetTravIdCurrent( pNet );
809 pNet = Abc_ObjFanout0(pObj);
810 nValues = Abc_ObjMvVarNum(pNet);
811 nBits = Abc_Base2Log( nValues );
812 for ( k = 0; k < nBits; k++ )
814 pNodeNew = Abc_NtkCreateNode( pNtkNew );
816 pNetNew = Abc_NtkCreateNet( pNtkNew );
817 pTermNew = Abc_NtkCreateBi( pNtkNew );
824 Abc_NodeSetTravIdCurrent( pNet );
829 if ( fUsePositional )
833 pNet = Abc_ObjFanin0(pObj);
835 if ( Abc_NodeIsTravIdCurrent(pNet) )
837 Abc_NodeSetTravIdCurrent( pNet );
838 nValues = Abc_ObjMvVarNum(pNet);
839 pNodeNew = Abc_NtkCreateNode( pNtkNew );
841 for ( v = 0; v < nValues; v++ )
843 pTermNew = Abc_NtkCreateBo( pNtkNew );
844 pNetNew = Abc_NtkCreateNet( pNtkNew );
856 pNet = Abc_ObjFanin0(pObj);
858 if ( Abc_NodeIsTravIdCurrent(pNet) )
860 Abc_NodeSetTravIdCurrent( pNet );
861 nValues = Abc_ObjMvVarNum(pNet);
862 nBits = Abc_Base2Log( nValues );
863 pNodeNew = Abc_NtkCreateNode( pNtkNew );
865 for ( k = 0; k < nBits; k++ )
867 pTermNew = Abc_NtkCreateBo( pNtkNew );
868 pNetNew = Abc_NtkCreateNet( pNtkNew );
878 if ( Abc_NtkHasBlifMv(pNtk) && Abc_NtkMvVar(pNtk) )
880 if ( Abc_NtkMvVar( pNtkNew ) == NULL )
890 fprintf( stdout,
"Abc_NtkSkeletonBlifMv(): Network check has failed.\n" );
963 char * pSop0, * pSop1, * pBlifMv, * pCube, * pCur;
964 int Value, nCubes, nSize, i, k;
966 assert( Abc_NtkIsNetlist(pNtk) );
969 printf(
"Converting logic functions to BDDs has failed.\n" );
974 vCube = Vec_StrAlloc( 100 );
981 nSize = nCubes*(2*Abc_ObjFaninNum(pNode) + 2)+1;
1006 assert( pCur - pBlifMv == nSize );
1008 Cudd_RecursiveDeref( (DdManager *)pNtk->
pManFunc, (DdNode *)pNode->
pData );
1009 pNode->
pData = pBlifMv;
1014 Cudd_Quit( (DdManager *)pNtk->
pManFunc );
1017 Vec_StrFree( vCube );