mirror of https://github.com/YosysHQ/abc.git
239 lines
6.8 KiB
C
239 lines
6.8 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [cnfPost.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [AIG-to-CNF conversion.]
|
|
|
|
Synopsis []
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - April 28, 2007.]
|
|
|
|
Revision [$Id: cnfPost.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "cnf.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Cnf_ManPostprocess_old( Cnf_Man_t * p )
|
|
{
|
|
// extern int Aig_ManLargeCutEval( Aig_Man_t * p, Aig_Obj_t * pRoot, Dar_Cut_t * pCutR, Dar_Cut_t * pCutL, int Leaf );
|
|
int nNew, Gain, nGain = 0, nVars = 0;
|
|
|
|
Aig_Obj_t * pObj, * pFan;
|
|
Dar_Cut_t * pCutBest, * pCut;
|
|
int i, k;//, a, b, Counter;
|
|
Aig_ManForEachObj( p->pManAig, pObj, i )
|
|
{
|
|
if ( !Aig_ObjIsNode(pObj) )
|
|
continue;
|
|
if ( pObj->nRefs == 0 )
|
|
continue;
|
|
// pCutBest = Aig_ObjBestCut(pObj);
|
|
pCutBest = NULL;
|
|
|
|
Dar_CutForEachLeaf( p->pManAig, pCutBest, pFan, k )
|
|
{
|
|
if ( !Aig_ObjIsNode(pFan) )
|
|
continue;
|
|
assert( pFan->nRefs != 0 );
|
|
if ( pFan->nRefs != 1 )
|
|
continue;
|
|
// pCut = Aig_ObjBestCut(pFan);
|
|
pCut = NULL;
|
|
/*
|
|
// find how many common variable they have
|
|
Counter = 0;
|
|
for ( a = 0; a < (int)pCut->nLeaves; a++ )
|
|
{
|
|
for ( b = 0; b < (int)pCutBest->nLeaves; b++ )
|
|
if ( pCut->pLeaves[a] == pCutBest->pLeaves[b] )
|
|
break;
|
|
if ( b == (int)pCutBest->nLeaves )
|
|
continue;
|
|
Counter++;
|
|
}
|
|
printf( "%d ", Counter );
|
|
*/
|
|
// find the new truth table after collapsing these two cuts
|
|
|
|
|
|
// nNew = Aig_ManLargeCutEval( p->pManAig, pObj, pCutBest, pCut, pFan->Id );
|
|
nNew = 0;
|
|
|
|
|
|
// printf( "%d+%d=%d:%d(%d) ", pCutBest->Cost, pCut->Cost,
|
|
// pCutBest->Cost+pCut->Cost, nNew, pCutBest->Cost+pCut->Cost-nNew );
|
|
|
|
Gain = pCutBest->Value + pCut->Value - nNew;
|
|
if ( Gain > 0 )
|
|
{
|
|
nGain += Gain;
|
|
nVars++;
|
|
}
|
|
}
|
|
}
|
|
printf( "Total gain = %d. Vars = %d.\n", nGain, nVars );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Transfers cuts of the mapped nodes into internal representation.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Cnf_ManTransferCuts( Cnf_Man_t * p )
|
|
{
|
|
Aig_Obj_t * pObj;
|
|
int i;
|
|
Aig_MmFlexRestart( p->pMemCuts );
|
|
Aig_ManForEachObj( p->pManAig, pObj, i )
|
|
{
|
|
if ( Aig_ObjIsNode(pObj) && pObj->nRefs > 0 )
|
|
pObj->pData = Cnf_CutCreate( p, pObj );
|
|
else
|
|
pObj->pData = NULL;
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Transfers cuts of the mapped nodes into internal representation.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Cnf_ManFreeCuts( Cnf_Man_t * p )
|
|
{
|
|
Aig_Obj_t * pObj;
|
|
int i;
|
|
Aig_ManForEachObj( p->pManAig, pObj, i )
|
|
if ( pObj->pData )
|
|
{
|
|
Cnf_CutFree( (Cnf_Cut_t *)pObj->pData );
|
|
pObj->pData = NULL;
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Cnf_ManPostprocess( Cnf_Man_t * p )
|
|
{
|
|
Cnf_Cut_t * pCut, * pCutFan, * pCutRes;
|
|
Aig_Obj_t * pObj, * pFan;
|
|
int Order[16], Costs[16];
|
|
int i, k, fChanges;
|
|
Aig_ManForEachNode( p->pManAig, pObj, i )
|
|
{
|
|
if ( pObj->nRefs == 0 )
|
|
continue;
|
|
pCut = Cnf_ObjBestCut(pObj);
|
|
|
|
// sort fanins according to their size
|
|
Cnf_CutForEachLeaf( p->pManAig, pCut, pFan, k )
|
|
{
|
|
Order[k] = k;
|
|
Costs[k] = Aig_ObjIsNode(pFan)? Cnf_ObjBestCut(pFan)->Cost : 0;
|
|
}
|
|
// sort the cuts by Weight
|
|
do {
|
|
int Temp;
|
|
fChanges = 0;
|
|
for ( k = 0; k < pCut->nFanins - 1; k++ )
|
|
{
|
|
if ( Costs[Order[k]] <= Costs[Order[k+1]] )
|
|
continue;
|
|
Temp = Order[k];
|
|
Order[k] = Order[k+1];
|
|
Order[k+1] = Temp;
|
|
fChanges = 1;
|
|
}
|
|
} while ( fChanges );
|
|
|
|
|
|
// Cnf_CutForEachLeaf( p->pManAig, pCut, pFan, k )
|
|
for ( k = 0; (k < (int)(pCut)->nFanins) && ((pFan) = Aig_ManObj(p->pManAig, (pCut)->pFanins[Order[k]])); k++ )
|
|
{
|
|
if ( !Aig_ObjIsNode(pFan) )
|
|
continue;
|
|
assert( pFan->nRefs != 0 );
|
|
if ( pFan->nRefs != 1 )
|
|
continue;
|
|
pCutFan = Cnf_ObjBestCut(pFan);
|
|
// try composing these two cuts
|
|
// Cnf_CutPrint( pCut );
|
|
pCutRes = Cnf_CutCompose( p, pCut, pCutFan, pFan->Id );
|
|
// Cnf_CutPrint( pCut );
|
|
// printf( "\n" );
|
|
// check if the cost if reduced
|
|
if ( pCutRes == NULL || pCutRes->Cost == 127 || pCutRes->Cost > pCut->Cost + pCutFan->Cost )
|
|
{
|
|
if ( pCutRes )
|
|
Cnf_CutFree( pCutRes );
|
|
continue;
|
|
}
|
|
// update the cut
|
|
Cnf_ObjSetBestCut( pObj, pCutRes );
|
|
Cnf_ObjSetBestCut( pFan, NULL );
|
|
Cnf_CutUpdateRefs( p, pCut, pCutFan, pCutRes );
|
|
assert( pFan->nRefs == 0 );
|
|
Cnf_CutFree( pCut );
|
|
Cnf_CutFree( pCutFan );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|