mirror of https://github.com/YosysHQ/abc.git
215 lines
7.0 KiB
C
215 lines
7.0 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [abcDress.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Network and node package.]
|
|
|
|
Synopsis [Transfers names from one netlist to the other.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: abcDress.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "src/base/abc/abc.h"
|
|
#include "src/base/io/ioAbc.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
static stmm_table * Abc_NtkDressDeriveMapping( Abc_Ntk_t * pNtk );
|
|
static void Abc_NtkDressTransferNames( Abc_Ntk_t * pNtk, stmm_table * tMapping, int fVerbose );
|
|
|
|
extern Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fVerbose );
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Transfers names from one netlist to the other.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Abc_NtkDress( Abc_Ntk_t * pNtkLogic, char * pFileName, int fVerbose )
|
|
{
|
|
Abc_Ntk_t * pNtkOrig, * pNtkLogicOrig;
|
|
Abc_Ntk_t * pMiter, * pMiterFraig;
|
|
stmm_table * tMapping;
|
|
|
|
assert( Abc_NtkIsLogic(pNtkLogic) );
|
|
|
|
// get the original netlist
|
|
pNtkOrig = Io_ReadNetlist( pFileName, Io_ReadFileType(pFileName), 1 );
|
|
if ( pNtkOrig == NULL )
|
|
return;
|
|
assert( Abc_NtkIsNetlist(pNtkOrig) );
|
|
|
|
Abc_NtkCleanCopy(pNtkLogic);
|
|
Abc_NtkCleanCopy(pNtkOrig);
|
|
|
|
// convert it into the logic network
|
|
pNtkLogicOrig = Abc_NtkToLogic( pNtkOrig );
|
|
// check that the networks have the same PIs/POs/latches
|
|
if ( !Abc_NtkCompareSignals( pNtkLogic, pNtkLogicOrig, 1, 1 ) )
|
|
{
|
|
Abc_NtkDelete( pNtkOrig );
|
|
Abc_NtkDelete( pNtkLogicOrig );
|
|
return;
|
|
}
|
|
|
|
// convert the current logic network into an AIG
|
|
pMiter = Abc_NtkStrash( pNtkLogic, 1, 0, 0 );
|
|
|
|
// convert it into the AIG and make the netlist point to the AIG
|
|
Abc_NtkAppend( pMiter, pNtkLogicOrig, 1 );
|
|
Abc_NtkTransferCopy( pNtkOrig );
|
|
Abc_NtkDelete( pNtkLogicOrig );
|
|
|
|
if ( fVerbose )
|
|
{
|
|
printf( "After mitering:\n" );
|
|
printf( "Logic: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkLogic), Abc_NtkCountCopy(pNtkLogic) );
|
|
printf( "Orig: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkOrig), Abc_NtkCountCopy(pNtkOrig) );
|
|
}
|
|
|
|
// fraig the miter (miter nodes point to the fraiged miter)
|
|
pMiterFraig = Abc_NtkIvyFraig( pMiter, 100, 1, 0, 1, 0 );
|
|
// make netlists point to the fraiged miter
|
|
Abc_NtkTransferCopy( pNtkLogic );
|
|
Abc_NtkTransferCopy( pNtkOrig );
|
|
Abc_NtkDelete( pMiter );
|
|
|
|
if ( fVerbose )
|
|
{
|
|
printf( "After fraiging:\n" );
|
|
printf( "Logic: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkLogic), Abc_NtkCountCopy(pNtkLogic) );
|
|
printf( "Orig: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkOrig), Abc_NtkCountCopy(pNtkOrig) );
|
|
}
|
|
|
|
// derive mapping from the fraiged nodes into their prototype nodes in the original netlist
|
|
tMapping = Abc_NtkDressDeriveMapping( pNtkOrig );
|
|
|
|
// transfer the names to the new netlist
|
|
Abc_NtkDressTransferNames( pNtkLogic, tMapping, fVerbose );
|
|
|
|
// clean up
|
|
stmm_free_table( tMapping );
|
|
Abc_NtkDelete( pMiterFraig );
|
|
Abc_NtkDelete( pNtkOrig );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Returns the mapping from the fraig nodes point into the nodes of the netlist.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
stmm_table * Abc_NtkDressDeriveMapping( Abc_Ntk_t * pNtk )
|
|
{
|
|
stmm_table * tResult;
|
|
Abc_Obj_t * pNode, * pNodeMap, * pNodeFraig;
|
|
int i;
|
|
assert( Abc_NtkIsNetlist(pNtk) );
|
|
tResult = stmm_init_table(stmm_ptrcmp,stmm_ptrhash);
|
|
Abc_NtkForEachNode( pNtk, pNode, i )
|
|
{
|
|
// get the fraiged node
|
|
pNodeFraig = Abc_ObjRegular(pNode->pCopy);
|
|
// if this node is already mapped, skip
|
|
if ( stmm_is_member( tResult, (char *)pNodeFraig ) )
|
|
continue;
|
|
// get the mapping of this node
|
|
pNodeMap = Abc_ObjNotCond( pNode, Abc_ObjIsComplement(pNode->pCopy) );
|
|
// add the mapping
|
|
stmm_insert( tResult, (char *)pNodeFraig, (char *)pNodeMap );
|
|
}
|
|
return tResult;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Attaches the names of to the new netlist.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Abc_NtkDressTransferNames( Abc_Ntk_t * pNtk, stmm_table * tMapping, int fVerbose )
|
|
{
|
|
Abc_Obj_t * pNet, * pNode, * pNodeMap, * pNodeFraig;
|
|
char * pName;
|
|
int i, Counter = 0, CounterInv = 0, CounterInit = stmm_count(tMapping);
|
|
assert( Abc_NtkIsLogic(pNtk) );
|
|
Abc_NtkForEachNode( pNtk, pNode, i )
|
|
{
|
|
// if the node already has a name, quit
|
|
pName = Nm_ManFindNameById( pNtk->pManName, pNode->Id );
|
|
if ( pName != NULL )
|
|
continue;
|
|
// get the fraiged node
|
|
pNodeFraig = Abc_ObjRegular(pNode->pCopy);
|
|
// find the matching node of the original netlist
|
|
if ( !stmm_lookup( tMapping, (char *)pNodeFraig, (char **)&pNodeMap ) )
|
|
continue;
|
|
// find the true match
|
|
pNodeMap = Abc_ObjNotCond( pNodeMap, Abc_ObjIsComplement(pNode->pCopy) );
|
|
// get the name
|
|
pNet = Abc_ObjFanout0(Abc_ObjRegular(pNodeMap));
|
|
pName = Nm_ManFindNameById( pNet->pNtk->pManName, pNet->Id );
|
|
assert( pName != NULL );
|
|
// set the name
|
|
if ( Abc_ObjIsComplement(pNodeMap) )
|
|
{
|
|
Abc_ObjAssignName( pNode, pName, "_inv" );
|
|
CounterInv++;
|
|
}
|
|
else
|
|
{
|
|
Abc_ObjAssignName( pNode, pName, NULL );
|
|
Counter++;
|
|
}
|
|
// remove the name
|
|
stmm_delete( tMapping, (char **)&pNodeFraig, (char **)&pNodeMap );
|
|
}
|
|
if ( fVerbose )
|
|
{
|
|
printf( "Total number of names collected = %5d.\n", CounterInit );
|
|
printf( "Total number of names assigned = %5d. (Dir = %5d. Compl = %5d.)\n",
|
|
Counter + CounterInv, Counter, CounterInv );
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|