mirror of https://github.com/YosysHQ/abc.git
Improvements and tuning of CBA.
This commit is contained in:
parent
a704e9c9ff
commit
7b1c25086b
|
|
@ -871,7 +871,7 @@ static inline Abc_Obj_t * Abc_NtkFromCellRead( Abc_Ntk_t * p, Vec_Int_t * vCopyL
|
|||
}
|
||||
Abc_Ntk_t * Abc_NtkFromCellMappedGia( Gia_Man_t * p )
|
||||
{
|
||||
int fFixDrivers = 0;
|
||||
int fFixDrivers = 1;
|
||||
int fDuplicate = 1;
|
||||
int fVerbose = 1;
|
||||
Abc_Ntk_t * pNtkNew;
|
||||
|
|
|
|||
|
|
@ -194,6 +194,8 @@ static inline int Cba_NtkPiNumAlloc( Cba_Ntk_t * p ) { r
|
|||
static inline int Cba_NtkPoNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vOutputs); }
|
||||
static inline int Cba_NtkBiNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BI); }
|
||||
static inline int Cba_NtkBoNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BO); }
|
||||
static inline int Cba_NtkCiNum( Cba_Ntk_t * p ) { return Cba_NtkPiNum(p) + Cba_NtkBoNum(p); }
|
||||
static inline int Cba_NtkCoNum( Cba_Ntk_t * p ) { return Cba_NtkPoNum(p) + Cba_NtkBiNum(p); }
|
||||
static inline int Cba_NtkBoxNum( Cba_Ntk_t * p ) { return Cba_NtkObjNum(p) - Vec_StrCountSmaller(&p->vType, (char)CBA_OBJ_BOX); }
|
||||
static inline int Cba_NtkPrimNum( Cba_Ntk_t * p ) { return Vec_StrCountLarger(&p->vType, (char)CBA_OBJ_BOX); }
|
||||
static inline int Cba_NtkUserNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BOX); }
|
||||
|
|
@ -241,7 +243,7 @@ static inline int Cba_ObjCopy( Cba_Ntk_t * p, int i ) { r
|
|||
static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjName(p, i)); }
|
||||
static inline char * Cba_ObjRangeStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjRange(p, i)); }
|
||||
static inline void Cba_ObjSetFanin( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjFanin(p, i) == -1); Vec_IntWriteEntry( &p->vFanin, i, x ); }
|
||||
static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { /*assert(Cba_ObjName(p, i) == 0);*/ Vec_IntWriteEntry( &p->vName, i, x ); }
|
||||
static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjName(p, i) == 0); Vec_IntWriteEntry( &p->vName, i, x ); }
|
||||
static inline void Cba_ObjSetRange( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjRange(p, i) == 0); Vec_IntWriteEntry( &p->vRange, i, x ); }
|
||||
static inline void Cba_ObjSetCopy( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjCopy(p, i) == -1); Vec_IntWriteEntry( &p->vCopy, i, x ); }
|
||||
|
||||
|
|
@ -445,7 +447,7 @@ static inline void Cba_NtkDupUserBoxes( Cba_Ntk_t * pNew, Cba_Ntk_t * p )
|
|||
{
|
||||
int i, iObj;
|
||||
assert( pNew != p );
|
||||
Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) );
|
||||
Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) + 3*Cba_NtkCoNum(p) );
|
||||
Cba_NtkStartCopies( p );
|
||||
if ( Cba_NtkHasNames(p) )
|
||||
Cba_NtkStartNames( pNew );
|
||||
|
|
@ -455,6 +457,12 @@ static inline void Cba_NtkDupUserBoxes( Cba_Ntk_t * pNew, Cba_Ntk_t * p )
|
|||
Cba_ObjDup( pNew, p, iObj );
|
||||
Cba_NtkForEachBoxUser( p, iObj )
|
||||
Cba_BoxDup( pNew, p, iObj );
|
||||
// connect feed-throughs
|
||||
Cba_NtkForEachCo( p, iObj )
|
||||
if ( Cba_ObjCopy(p, iObj) >= 0 &&
|
||||
Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) >= 0 &&
|
||||
Cba_ObjName(p, iObj) == Cba_ObjName(p, Cba_ObjFanin(p, iObj)) )
|
||||
Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iObj), Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) );
|
||||
}
|
||||
static inline void Cba_NtkFree( Cba_Ntk_t * p )
|
||||
{
|
||||
|
|
@ -627,7 +635,7 @@ static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose
|
|||
Cba_Ntk_t * pRoot = Cba_ManRoot( p );
|
||||
printf( "%-12s : ", Cba_ManName(p) );
|
||||
printf( "pi =%5d ", Cba_NtkPiNum(pRoot) );
|
||||
printf( "pi =%5d ", Cba_NtkPoNum(pRoot) );
|
||||
printf( "po =%5d ", Cba_NtkPoNum(pRoot) );
|
||||
printf( "mod =%6d ", Cba_ManNtkNum(p) );
|
||||
printf( "box =%7d ", Cba_ManNodeNum(p) );
|
||||
printf( "obj =%7d ", Cba_ManObjNum(p) );
|
||||
|
|
|
|||
|
|
@ -143,6 +143,10 @@ int Cba_ManExtract_rec( Gia_Man_t * pNew, Cba_Ntk_t * p, int i, int fBuffers, Ve
|
|||
Dec_Graph_t * pGraph = (Dec_Graph_t *)p->pDesign->ppGraphs[Cba_BoxNtkId(p, iBox)];
|
||||
Vec_Int_t Leaves = { nLits, nLits, pLits };
|
||||
assert( pGraph != NULL );
|
||||
if ( pGraph->nLeaves == 0 )
|
||||
{
|
||||
int s = 0;
|
||||
}
|
||||
return Gia_ManFactorGraph( pNew, pGraph, &Leaves );
|
||||
}
|
||||
else
|
||||
|
|
@ -298,23 +302,17 @@ void Cba_ManRemapBarbufs( Cba_Man_t * pNew, Cba_Man_t * p )
|
|||
void Cba_NtkCreateAndConnectBuffer( Gia_Man_t * pGia, Gia_Obj_t * pObj, Cba_Ntk_t * p, int iTerm )
|
||||
{
|
||||
int iObj;
|
||||
// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
|
||||
if ( pGia && Gia_ObjFaninId0p(pGia, pObj) > 0 )
|
||||
{
|
||||
// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, Gia_ObjFaninC0(pObj) ? CBA_BOX_INV : CBA_BOX_BUF );
|
||||
// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, Gia_ObjFanin0(pObj)->Value) );
|
||||
assert( Cba_ObjName(p, Gia_ObjFanin0(pObj)->Value) != Cba_ObjName(p, iTerm) ); // not a feedthrough
|
||||
iObj = Cba_ObjAlloc( p, CBA_OBJ_BI, 0, Gia_ObjFanin0(pObj)->Value );
|
||||
Cba_ObjSetName( p, iObj, Cba_ObjName(p, Gia_ObjFanin0(pObj)->Value) );
|
||||
Cba_ObjAlloc( p, Gia_ObjFaninC0(pObj) ? CBA_BOX_INV : CBA_BOX_BUF, -1, -1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pGia && Gia_ObjFaninC0(pObj) ? CBA_BOX_C1 : CBA_BOX_C0 );
|
||||
// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) );
|
||||
Cba_ObjAlloc( p, pGia && Gia_ObjFaninC0(pObj) ? CBA_BOX_C1 : CBA_BOX_C0, -1, -1 );
|
||||
}
|
||||
// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
|
||||
// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
|
||||
iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 );
|
||||
Cba_ObjSetName( p, iObj, Cba_ObjName(p, iTerm) );
|
||||
Cba_ObjSetFanin( p, iTerm, iObj );
|
||||
|
|
@ -335,7 +333,8 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia )
|
|||
pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, Count) );
|
||||
iTerm = Vec_IntEntry( p->vBuf2RootObj, Count );
|
||||
assert( Cba_ObjIsCo(pNtk, iTerm) );
|
||||
Cba_NtkCreateAndConnectBuffer( pGia, pObj, pNtk, iTerm );
|
||||
if ( Cba_ObjFanin(pNtk, iTerm) == -1 ) // not a feedthrough
|
||||
Cba_NtkCreateAndConnectBuffer( pGia, pObj, pNtk, iTerm );
|
||||
// prepare leaf
|
||||
pObj->Value = Vec_IntEntry( p->vBuf2LeafObj, Count++ );
|
||||
}
|
||||
|
|
@ -357,13 +356,6 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia )
|
|||
else
|
||||
Type = CBA_BOX_AND;
|
||||
// create box
|
||||
/*
|
||||
Vec_IntFillTwo( vTemp, 2, iLit0, iLit1 );
|
||||
Vec_IntWriteEntry( &pNtk->vTypes, pNtk->nObjs, CBA_OBJ_NODE );
|
||||
Vec_IntWriteEntry( &pNtk->vFuncs, pNtk->nObjs, Type );
|
||||
Vec_IntWriteEntry( &pNtk->vFanins, pNtk->nObjs, Cba_ManHandleArray(p, vTemp) );
|
||||
pNtk->nObjs++;
|
||||
*/
|
||||
iTerm = Cba_ObjAlloc( pNtk, CBA_OBJ_BI, 1, iLit1 );
|
||||
Cba_ObjSetName( pNtk, iTerm, Cba_ObjName(pNtk, iLit1) );
|
||||
iTerm = Cba_ObjAlloc( pNtk, CBA_OBJ_BI, 0, iLit0 );
|
||||
|
|
@ -387,7 +379,8 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia )
|
|||
}
|
||||
// create node and connect POs
|
||||
Gia_ManForEachPo( pGia, pObj, i )
|
||||
Cba_NtkCreateAndConnectBuffer( pGia, pObj, pRoot, Cba_NtkPo(pRoot, i) );
|
||||
if ( Cba_ObjFanin(pRoot, Cba_NtkPo(pRoot, i)) == -1 ) // not a feedthrough
|
||||
Cba_NtkCreateAndConnectBuffer( pGia, pObj, pRoot, Cba_NtkPo(pRoot, i) );
|
||||
}
|
||||
Cba_Man_t * Cba_ManInsertGia( Cba_Man_t * p, Gia_Man_t * pGia )
|
||||
{
|
||||
|
|
@ -461,33 +454,22 @@ void Cba_ManMarkNodesAbc( Cba_Man_t * p, Abc_Ntk_t * pNtk )
|
|||
void Cba_NtkCreateOrConnectFanin( Abc_Obj_t * pFanin, Cba_Ntk_t * p, int iTerm )
|
||||
{
|
||||
int iObj;
|
||||
if ( pFanin && Abc_NodeIsSeriousGate(pFanin) )
|
||||
if ( pFanin && Abc_NodeIsSeriousGate(pFanin) && Cba_ObjName(p, pFanin->iTemp) == -1 ) // gate without name
|
||||
{
|
||||
// Vec_IntWriteEntry( &p->vNameIds, pFanin->iTemp, Cba_ObjNameId(p, iTerm) );
|
||||
// Vec_IntWriteEntry( &p->vFanins, iTerm, pFanin->iTemp );
|
||||
iObj = pFanin->iTemp;
|
||||
}
|
||||
else if ( pFanin && (Abc_ObjIsPi(pFanin) || Abc_ObjIsBarBuf(pFanin)) )
|
||||
else if ( pFanin && (Abc_ObjIsPi(pFanin) || Abc_ObjIsBarBuf(pFanin) || Abc_NodeIsSeriousGate(pFanin)) ) // PI/BO or gate with name
|
||||
{
|
||||
// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
|
||||
// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, 3 ); // assuming elem gates are added first
|
||||
// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, pFanin->iTemp) );
|
||||
// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
|
||||
// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
|
||||
assert( Cba_ObjName(p, pFanin->iTemp) != Cba_ObjName(p, iTerm) ); // not a feedthrough
|
||||
iObj = Cba_ObjAlloc( p, CBA_OBJ_BI, 0, pFanin->iTemp );
|
||||
Cba_ObjSetName( p, iObj, Cba_ObjName(p, pFanin->iTemp) );
|
||||
Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[2], -1 );
|
||||
Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[2], -1 ); // buffer
|
||||
iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( !pFanin || Abc_NodeIsConst0(pFanin) || Abc_NodeIsConst1(pFanin) );
|
||||
// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
|
||||
// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pFanin && Abc_NodeIsConst1(pFanin) ? 2 : 1 ); // assuming elem gates are added first
|
||||
// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) );
|
||||
// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
|
||||
// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
|
||||
Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[(pFanin && Abc_NodeIsConst1(pFanin))], -1 );
|
||||
Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[(pFanin && Abc_NodeIsConst1(pFanin))], -1 ); // const 0/1
|
||||
iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 );
|
||||
}
|
||||
Cba_ObjSetName( p, iObj, Cba_ObjName(p, iTerm) );
|
||||
|
|
@ -530,22 +512,13 @@ void Cba_NtkInsertNtk( Cba_Man_t * p, Abc_Ntk_t * pNtk )
|
|||
pCbaNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, Count) );
|
||||
iTerm = Vec_IntEntry( p->vBuf2RootObj, Count );
|
||||
assert( Cba_ObjIsCo(pCbaNtk, iTerm) );
|
||||
Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pCbaNtk, iTerm );
|
||||
if ( Cba_ObjFanin(pCbaNtk, iTerm) == -1 ) // not a feedthrough
|
||||
Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pCbaNtk, iTerm );
|
||||
// prepare leaf
|
||||
pObj->iTemp = Vec_IntEntry( p->vBuf2LeafObj, Count++ );
|
||||
}
|
||||
else if ( Abc_NodeIsSeriousGate(pObj) )
|
||||
{
|
||||
/*
|
||||
Vec_IntClear( vTemp );
|
||||
Abc_ObjForEachFanin( pObj, pFanin, k )
|
||||
Vec_IntPush( vTemp, pFanin->iTemp );
|
||||
pCbaNtk = Cba_ManNtk( p, pObj->iTemp );
|
||||
Vec_IntWriteEntry( &pCbaNtk->vTypes, pCbaNtk->nObjs, CBA_OBJ_NODE );
|
||||
Vec_IntWriteEntry( &pCbaNtk->vFuncs, pCbaNtk->nObjs, Abc_NamStrFind(p->pMods, Mio_GateReadName((Mio_Gate_t *)pObj->pData)) );
|
||||
Vec_IntWriteEntry( &pCbaNtk->vFanins, pCbaNtk->nObjs, Cba_ManHandleArray(p, vTemp) );
|
||||
pObj->iTemp = pCbaNtk->nObjs++;
|
||||
*/
|
||||
pCbaNtk = Cba_ManNtk( p, pObj->iTemp );
|
||||
for ( k = Abc_ObjFaninNum(pObj)-1; k >= 0; k-- )
|
||||
{
|
||||
|
|
@ -571,7 +544,8 @@ void Cba_NtkInsertNtk( Cba_Man_t * p, Abc_Ntk_t * pNtk )
|
|||
}
|
||||
// create node and connect POs
|
||||
Abc_NtkForEachPo( pNtk, pObj, i )
|
||||
Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pRoot, Cba_NtkPo(pRoot, i) );
|
||||
if ( Cba_ObjFanin(pRoot, Cba_NtkPo(pRoot, i)) == -1 ) // not a feedthrough
|
||||
Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pRoot, Cba_NtkPo(pRoot, i) );
|
||||
}
|
||||
void * Cba_ManInsertAbc( Cba_Man_t * p, void * pAbc )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -196,13 +196,15 @@ int Cba_CommandRead( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
else if ( !strcmp( Extra_FileNameExtension(pFileName), "blif" ) )
|
||||
{
|
||||
vDes = Prs_ManReadBlif( pFileName );
|
||||
p = Prs_ManBuildCba( pFileName, vDes );
|
||||
if ( vDes && Vec_PtrSize(vDes) )
|
||||
p = Prs_ManBuildCba( pFileName, vDes );
|
||||
Prs_ManVecFree( vDes );
|
||||
}
|
||||
else if ( !strcmp( Extra_FileNameExtension(pFileName), "v" ) )
|
||||
{
|
||||
vDes = Prs_ManReadVerilog( pFileName );
|
||||
p = Prs_ManBuildCba( pFileName, vDes );
|
||||
if ( vDes && Vec_PtrSize(vDes) )
|
||||
p = Prs_ManBuildCba( pFileName, vDes );
|
||||
Prs_ManVecFree( vDes );
|
||||
}
|
||||
else assert( 0 );
|
||||
|
|
@ -352,12 +354,15 @@ int Cba_CommandPut( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
{
|
||||
Cba_Man_t * p = Cba_AbcGetMan(pAbc);
|
||||
Gia_Man_t * pGia = NULL;
|
||||
int c, fVerbose = 0;
|
||||
int c, fBarBufs = 1, fVerbose = 0;
|
||||
Extra_UtilGetoptReset();
|
||||
while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF )
|
||||
while ( ( c = Extra_UtilGetopt( argc, argv, "bvh" ) ) != EOF )
|
||||
{
|
||||
switch ( c )
|
||||
{
|
||||
case 'b':
|
||||
fBarBufs ^= 1;
|
||||
break;
|
||||
case 'v':
|
||||
fVerbose ^= 1;
|
||||
break;
|
||||
|
|
@ -372,7 +377,7 @@ int Cba_CommandPut( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
Abc_Print( 1, "Cba_CommandPut(): There is no current design.\n" );
|
||||
return 0;
|
||||
}
|
||||
pGia = Cba_ManExtract( p, 1, 0 );
|
||||
pGia = Cba_ManExtract( p, fBarBufs, fVerbose );
|
||||
if ( pGia == NULL )
|
||||
{
|
||||
Abc_Print( 1, "Cba_CommandPut(): Conversion to AIG has failed.\n" );
|
||||
|
|
@ -381,8 +386,9 @@ int Cba_CommandPut( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
Abc_FrameUpdateGia( pAbc, pGia );
|
||||
return 0;
|
||||
usage:
|
||||
Abc_Print( -2, "usage: @put [-mvh]\n" );
|
||||
Abc_Print( -2, "\t extracts AIG with barrier buffers from the hierarchical design\n" );
|
||||
Abc_Print( -2, "usage: @put [-bvh]\n" );
|
||||
Abc_Print( -2, "\t extracts AIG from the hierarchical design\n" );
|
||||
Abc_Print( -2, "\t-b : toggle using barrier buffers [default = %s]\n", fBarBufs? "yes": "no" );
|
||||
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" );
|
||||
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||
return 1;
|
||||
|
|
@ -517,7 +523,7 @@ int Cba_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
Cec_ParCec_t ParsCec, * pPars = &ParsCec;
|
||||
Vec_Ptr_t * vDes;
|
||||
char * FileName, * pStr, ** pArgvNew;
|
||||
int c, nArgcNew, fDumpMiter = 0, fVerbose = 0;
|
||||
int c, nArgcNew, fDumpMiter = 0;
|
||||
FILE * pFile;
|
||||
Cec_ManCecSetDefaultParams( pPars );
|
||||
Extra_UtilGetoptReset();
|
||||
|
|
@ -526,7 +532,7 @@ int Cba_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
switch ( c )
|
||||
{
|
||||
case 'v':
|
||||
fVerbose ^= 1;
|
||||
pPars->fVerbose ^= 1;
|
||||
break;
|
||||
case 'h':
|
||||
goto usage;
|
||||
|
|
@ -608,7 +614,7 @@ int Cba_CommandCec( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
usage:
|
||||
Abc_Print( -2, "usage: @cec [-vh]\n" );
|
||||
Abc_Print( -2, "\t combinational equivalence checking\n" );
|
||||
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" );
|
||||
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", pPars->fVerbose? "yes": "no" );
|
||||
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ void Cba_ManAssignInternNamesNtk( Cba_Ntk_t * p )
|
|||
continue;
|
||||
sprintf( Buffer, "%s%0*d", "_n_", nDigits, iTerm );
|
||||
NameId = Abc_NamStrFindOrAdd( p->pDesign->pStrs, Buffer, &fFound );
|
||||
assert( !fFound );
|
||||
//assert( !fFound );
|
||||
Cba_ObjSetName( p, iTerm, NameId );
|
||||
}
|
||||
// transfer names for prim BI
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include "cba.h"
|
||||
#include "cbaPrs.h"
|
||||
#include "map/mio/mio.h"
|
||||
#include "base/main/main.h"
|
||||
|
||||
ABC_NAMESPACE_IMPL_START
|
||||
|
|
@ -260,7 +261,19 @@ void Cba_ManWriteVerilogBoxes( FILE * pFile, Cba_Ntk_t * p )
|
|||
fprintf( pFile, "%s.%s(%s)", k ? ", " : "", Cba_ObjNameStr(pModel, iTerm), Cba_ObjNameStr(p, Cba_BoxBi(p, i, k)) );
|
||||
Cba_NtkForEachPo( pModel, iTerm, k )
|
||||
fprintf( pFile, "%s.%s(%s)", Cba_NtkPiNum(pModel) ? ", " : "", Cba_ObjNameStr(pModel, iTerm), Cba_ObjNameStr(p, Cba_BoxBo(p, i, k)) );
|
||||
fprintf( pFile, ")\n" );
|
||||
fprintf( pFile, ");\n" );
|
||||
}
|
||||
else if ( Cba_ObjIsGate(p, i) )
|
||||
{
|
||||
char * pGateName = Abc_NamStr(p->pDesign->pMods, Cba_BoxNtkId(p, i));
|
||||
Mio_Library_t * pLib = (Mio_Library_t *)Abc_FrameReadLibGen( Abc_FrameGetGlobalFrame() );
|
||||
Mio_Gate_t * pGate = Mio_LibraryReadGateByName( pLib, pGateName, NULL );
|
||||
fprintf( pFile, " %s (", pGateName );
|
||||
Cba_BoxForEachBi( p, i, iTerm, k )
|
||||
fprintf( pFile, "%s.%s(%s)", k ? ", " : "", Mio_GateReadPinName(pGate, k), Cba_ObjNameStr(p, iTerm) );
|
||||
Cba_BoxForEachBo( p, i, iTerm, k )
|
||||
fprintf( pFile, "%s.%s(%s)", Cba_BoxBiNum(p, i) ? ", " : "", Mio_GateReadOutName(pGate), Cba_ObjNameStr(p, iTerm) );
|
||||
fprintf( pFile, ");\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -57,23 +57,20 @@ Dec_Graph_t * Dec_Factor( char * pSop )
|
|||
Mvc_Cover_t * pCover;
|
||||
Dec_Graph_t * pFForm;
|
||||
Dec_Edge_t eRoot;
|
||||
if ( Abc_SopIsConst0(pSop) )
|
||||
return Dec_GraphCreateConst0();
|
||||
if ( Abc_SopIsConst1(pSop) )
|
||||
return Dec_GraphCreateConst1();
|
||||
|
||||
// derive the cover from the SOP representation
|
||||
pCover = Dec_ConvertSopToMvc( pSop );
|
||||
|
||||
// make sure the cover is CCS free (should be done before CST)
|
||||
Mvc_CoverContain( pCover );
|
||||
|
||||
// check for trivial functions
|
||||
if ( Mvc_CoverIsEmpty(pCover) )
|
||||
{
|
||||
Mvc_CoverFree( pCover );
|
||||
return Dec_GraphCreateConst0();
|
||||
}
|
||||
if ( Mvc_CoverIsTautology(pCover) )
|
||||
{
|
||||
Mvc_CoverFree( pCover );
|
||||
return Dec_GraphCreateConst1();
|
||||
}
|
||||
assert( !Mvc_CoverIsEmpty(pCover) );
|
||||
assert( !Mvc_CoverIsTautology(pCover) );
|
||||
|
||||
// perform CST
|
||||
Mvc_CoverInverse( pCover ); // CST
|
||||
|
|
@ -334,6 +331,7 @@ Mvc_Cover_t * Dec_ConvertSopToMvc( char * pSop )
|
|||
|
||||
// start the cover
|
||||
nVars = Abc_SopGetVarNum(pSop);
|
||||
assert( nVars > 0 );
|
||||
pMvc = Mvc_CoverAlloc( pMem, nVars * 2 );
|
||||
// check the logic function of the node
|
||||
Abc_SopForEachCube( pSop, nVars, pCube )
|
||||
|
|
|
|||
|
|
@ -296,6 +296,8 @@ int Abc_SclCheckNtk( Abc_Ntk_t * p, int fVerbose )
|
|||
if ( !Abc_NodeIsTravIdCurrent( pFanin ) )
|
||||
printf( "obj %d and its fanin %d are not in the topo order\n", Abc_ObjId(pObj), Abc_ObjId(pFanin) ), fFlag = 0;
|
||||
Abc_NodeSetTravIdCurrent( pObj );
|
||||
if ( Abc_ObjIsBarBuf(pObj) )
|
||||
continue;
|
||||
if ( Abc_ObjFanoutNum(pObj) == 0 )
|
||||
printf( "node %d has no fanout\n", Abc_ObjId(pObj) ), fFlag = 0;
|
||||
if ( !fFlag )
|
||||
|
|
|
|||
Loading…
Reference in New Issue