mirror of https://github.com/YosysHQ/abc.git
Improved algo for edge computation.
This commit is contained in:
parent
f91f23bed0
commit
e37ec2aac5
|
|
@ -175,8 +175,11 @@ int Gia_ManLutLevel( Gia_Man_t * p, int ** ppLevels )
|
||||||
}
|
}
|
||||||
Level = 0;
|
Level = 0;
|
||||||
Gia_ManForEachCo( p, pObj, k )
|
Gia_ManForEachCo( p, pObj, k )
|
||||||
if ( Level < pLevels[Gia_ObjFaninId0p(p, pObj)] )
|
{
|
||||||
Level = pLevels[Gia_ObjFaninId0p(p, pObj)];
|
int LevelFan = pLevels[Gia_ObjFaninId0p(p, pObj)];
|
||||||
|
Level = Abc_MaxInt( Level, LevelFan );
|
||||||
|
pLevels[Gia_ObjId(p, pObj)] = LevelFan;
|
||||||
|
}
|
||||||
if ( ppLevels )
|
if ( ppLevels )
|
||||||
*ppLevels = pLevels;
|
*ppLevels = pLevels;
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -98,16 +98,29 @@ Vec_Wec_t * Seg_ManCollectObjEdges( Vec_Int_t * vEdges, int nObjs )
|
||||||
}
|
}
|
||||||
int Seg_ManCountIntLevels( Seg_Man_t * p, int iStartVar )
|
int Seg_ManCountIntLevels( Seg_Man_t * p, int iStartVar )
|
||||||
{
|
{
|
||||||
|
Gia_Obj_t * pObj;
|
||||||
int iLut, nVars;
|
int iLut, nVars;
|
||||||
Vec_IntFill( p->vFirsts, Gia_ManObjNum(p->pGia), -1 );
|
Vec_IntFill( p->vFirsts, Gia_ManObjNum(p->pGia), -1 );
|
||||||
Vec_IntFill( p->vNvars, Gia_ManObjNum(p->pGia), 0 );
|
Vec_IntFill( p->vNvars, Gia_ManObjNum(p->pGia), 0 );
|
||||||
ABC_FREE( p->pLevels );
|
ABC_FREE( p->pLevels );
|
||||||
p->DelayMax = Gia_ManLutLevel( p->pGia, &p->pLevels );
|
if ( p->pGia->pManTime )
|
||||||
Gia_ManForEachLut( p->pGia, iLut )
|
|
||||||
{
|
{
|
||||||
|
p->DelayMax = Gia_ManLutLevelWithBoxes( p->pGia );
|
||||||
|
p->pLevels = Vec_IntReleaseArray( p->pGia->vLevels );
|
||||||
|
Vec_IntFreeP( &p->pGia->vLevels );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
p->DelayMax = Gia_ManLutLevel( p->pGia, &p->pLevels );
|
||||||
|
Gia_ManForEachObj1( p->pGia, pObj, iLut )
|
||||||
|
{
|
||||||
|
if ( Gia_ObjIsCo(pObj) )
|
||||||
|
continue;
|
||||||
|
if ( Gia_ObjIsAnd(pObj) && !Gia_ObjIsLut(p->pGia, iLut) )
|
||||||
|
continue;
|
||||||
|
assert( Gia_ObjIsCi(pObj) || Gia_ObjIsLut(p->pGia, iLut) );
|
||||||
Vec_IntWriteEntry( p->vFirsts, iLut, iStartVar );
|
Vec_IntWriteEntry( p->vFirsts, iLut, iStartVar );
|
||||||
assert( p->pLevels[iLut] > 0 );
|
//assert( p->pLevels[iLut] > 0 );
|
||||||
nVars = p->pLevels[iLut] == 1 ? 0 : p->pLevels[iLut];
|
nVars = p->pLevels[iLut] < 2 ? 0 : p->pLevels[iLut];
|
||||||
Vec_IntWriteEntry( p->vNvars, iLut, nVars );
|
Vec_IntWriteEntry( p->vNvars, iLut, nVars );
|
||||||
iStartVar += nVars;
|
iStartVar += nVars;
|
||||||
}
|
}
|
||||||
|
|
@ -189,6 +202,7 @@ void Seg_ManStop( Seg_Man_t * p )
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
void Seg_ManCreateCnf( Seg_Man_t * p, int fTwo, int fVerbose )
|
void Seg_ManCreateCnf( Seg_Man_t * p, int fTwo, int fVerbose )
|
||||||
{
|
{
|
||||||
|
Tim_Man_t * pTim = (Tim_Man_t *)p->pGia->pManTime;
|
||||||
Gia_Obj_t * pObj;
|
Gia_Obj_t * pObj;
|
||||||
Vec_Wec_t * vObjEdges;
|
Vec_Wec_t * vObjEdges;
|
||||||
Vec_Int_t * vLevel;
|
Vec_Int_t * vLevel;
|
||||||
|
|
@ -202,10 +216,76 @@ void Seg_ManCreateCnf( Seg_Man_t * p, int fTwo, int fVerbose )
|
||||||
{
|
{
|
||||||
int iFirstLut = Vec_IntEntry( p->vFirsts, iLut );
|
int iFirstLut = Vec_IntEntry( p->vFirsts, iLut );
|
||||||
int nVarsLut = Vec_IntEntry( p->vNvars, iLut );
|
int nVarsLut = Vec_IntEntry( p->vNvars, iLut );
|
||||||
|
if ( pTim && Gia_ObjIsCi(pObj) )
|
||||||
|
{
|
||||||
|
int iBox = Tim_ManBoxForCi( pTim, Gia_ObjCioId(pObj) );
|
||||||
|
if ( nVarsLut > 0 && iBox >= 0 )
|
||||||
|
{
|
||||||
|
int iCiId = Tim_ManBoxOutputFirst( pTim, iBox );
|
||||||
|
if ( iCiId == Gia_ObjCioId(pObj) ) // first input
|
||||||
|
{
|
||||||
|
int nIns = Tim_ManBoxInputNum( pTim, iBox );
|
||||||
|
int iIn0 = Tim_ManBoxInputFirst( pTim, iBox );
|
||||||
|
for ( i = 0; i < nIns-1; i++ ) // skip carry-in pin
|
||||||
|
{
|
||||||
|
Gia_Obj_t * pOut = Gia_ManCo( p->pGia, iIn0+i );
|
||||||
|
int iDriverId = Gia_ObjFaninId0p( p->pGia, pOut );
|
||||||
|
int AddOn;
|
||||||
|
|
||||||
|
iFirst = Vec_IntEntry( p->vFirsts, iDriverId );
|
||||||
|
nVars = Vec_IntEntry( p->vNvars, iDriverId );
|
||||||
|
assert( nVars < nVarsLut );
|
||||||
|
AddOn = (int)(nVars < nVarsLut);
|
||||||
|
for ( k = 0; k < nVars; k++ )
|
||||||
|
{
|
||||||
|
pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
|
||||||
|
pLits[1] = Abc_Var2Lit( iFirstLut+k+AddOn, 0 );
|
||||||
|
value = sat_solver_addclause( p->pSat, pLits, pLits+2 );
|
||||||
|
assert( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // intermediate input
|
||||||
|
{
|
||||||
|
Gia_Obj_t * pIn = Gia_ManCi( p->pGia, iCiId );
|
||||||
|
int iObjId = Gia_ObjId( p->pGia, pIn );
|
||||||
|
|
||||||
|
iFirst = Vec_IntEntry( p->vFirsts, iObjId );
|
||||||
|
nVars = Vec_IntEntry( p->vNvars, iObjId );
|
||||||
|
if ( nVars > 0 )
|
||||||
|
{
|
||||||
|
for ( k = 0; k < nVars; k++ )
|
||||||
|
{
|
||||||
|
pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
|
||||||
|
pLits[1] = Abc_Var2Lit( iFirstLut+k, 0 );
|
||||||
|
value = sat_solver_addclause( p->pSat, pLits, pLits+2 );
|
||||||
|
assert( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if ( !Gia_ObjIsLut(p->pGia, iLut) )
|
if ( !Gia_ObjIsLut(p->pGia, iLut) )
|
||||||
continue;
|
continue;
|
||||||
Gia_LutForEachFanin( p->pGia, iLut, iFanin, i )
|
Gia_LutForEachFanin( p->pGia, iLut, iFanin, i )
|
||||||
if ( Gia_ObjIsAnd(Gia_ManObj(p->pGia, iFanin)) )
|
if ( pTim && Gia_ObjIsCi(Gia_ManObj(p->pGia, iFanin)) )
|
||||||
|
{
|
||||||
|
iFirst = Vec_IntEntry( p->vFirsts, iFanin );
|
||||||
|
nVars = Vec_IntEntry( p->vNvars, iFanin );
|
||||||
|
assert( nVars <= nVarsLut );
|
||||||
|
if ( nVars > 0 )
|
||||||
|
{
|
||||||
|
for ( k = 0; k < nVars; k++ )
|
||||||
|
{
|
||||||
|
pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
|
||||||
|
pLits[1] = Abc_Var2Lit( iFirstLut+k, 0 );
|
||||||
|
value = sat_solver_addclause( p->pSat, pLits, pLits+2 );
|
||||||
|
assert( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( Gia_ObjIsAnd(Gia_ManObj(p->pGia, iFanin)) )
|
||||||
{
|
{
|
||||||
iFirst = Vec_IntEntry( p->vFirsts, iFanin );
|
iFirst = Vec_IntEntry( p->vFirsts, iFanin );
|
||||||
nVars = Vec_IntEntry( p->vNvars, iFanin );
|
nVars = Vec_IntEntry( p->vNvars, iFanin );
|
||||||
|
|
|
||||||
|
|
@ -34931,11 +34931,6 @@ int Abc_CommandAbc9Edge( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
}
|
}
|
||||||
if ( !fUseOld )
|
if ( !fUseOld )
|
||||||
{
|
{
|
||||||
if ( pAbc->pGia->pManTime != NULL && Tim_ManBoxNum((Tim_Man_t*)pAbc->pGia->pManTime) )
|
|
||||||
{
|
|
||||||
printf( "Currently this version of the algorithm does not work for designs with boxes.\n" );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
//Edg_ManAssignEdgeNew( pAbc->pGia, nEdges, fVerbose );
|
//Edg_ManAssignEdgeNew( pAbc->pGia, nEdges, fVerbose );
|
||||||
Seg_ManComputeDelay( pAbc->pGia, DelayMax, nEdges==2, fVerbose );
|
Seg_ManComputeDelay( pAbc->pGia, DelayMax, nEdges==2, fVerbose );
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue