mirror of https://github.com/YosysHQ/abc.git
175 lines
6.0 KiB
C
175 lines
6.0 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [fraigEngine.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [And-Inverter Graph package.]
|
|
|
|
Synopsis []
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: fraigEngine.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "aig.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Simulates all nodes using random simulation for the first time.]
|
|
|
|
Description [Assigns the original simulation info and the storage for the
|
|
future simulation info.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Aig_EngineSimulateRandomFirst( Aig_Man_t * p )
|
|
{
|
|
Aig_SimInfo_t * pInfoPi, * pInfoAll;
|
|
assert( !p->pInfo && !p->pInfoTemp );
|
|
// create random PI info
|
|
pInfoPi = Aig_SimInfoAlloc( Aig_ManPiNum(p), p->pParam->nPatsRand, 0 );
|
|
Aig_SimInfoRandom( pInfoPi );
|
|
// allocate sim info for all nodes
|
|
pInfoAll = Aig_SimInfoAlloc( Aig_ManNodeNum(p), p->pParam->nPatsRand, 1 );
|
|
// simulate though the circuit
|
|
Aig_ManSimulateInfo( p, pInfoPi, pInfoAll );
|
|
// detect classes
|
|
p->vClasses = Aig_ManDeriveClassesFirst( p, pInfoAll );
|
|
Aig_SimInfoFree( pInfoAll );
|
|
// save simulation info
|
|
p->pInfo = pInfoPi;
|
|
p->pInfoPi = Aig_SimInfoAlloc( Aig_ManPiNum(p), Aig_ManPiNum(p)+1, 0 );
|
|
p->pInfoTemp = Aig_SimInfoAlloc( Aig_ManNodeNum(p), Aig_ManPiNum(p)+1, 1 );
|
|
p->pPatMask = Aig_PatternAlloc( Aig_ManPiNum(p)+1 );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Starts the simulation engine for the first time.]
|
|
|
|
Description [Tries several random patterns and their distance-1
|
|
minterms hoping to get simulation started.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Aig_EngineSimulateFirst( Aig_Man_t * p )
|
|
{
|
|
Aig_Pattern_t * pPat;
|
|
int i, Counter;
|
|
|
|
// simulate the pattern of all zeros
|
|
pPat = Aig_PatternAlloc( Aig_ManPiNum(p) );
|
|
Aig_PatternClean( pPat );
|
|
Vec_PtrPush( p->vPats, pPat );
|
|
if ( !Aig_EngineSimulate( p ) )
|
|
return;
|
|
|
|
// simulate the pattern of all ones
|
|
pPat = Aig_PatternAlloc( Aig_ManPiNum(p) );
|
|
Aig_PatternFill( pPat );
|
|
Vec_PtrPush( p->vPats, pPat );
|
|
if ( !Aig_EngineSimulate( p ) )
|
|
return;
|
|
|
|
// simulate random until the number of new patterns is reasonable
|
|
do {
|
|
// generate random PI siminfo
|
|
Aig_SimInfoRandom( p->pInfoPi );
|
|
// simulate this info
|
|
Aig_ManSimulateInfo( p, p->pInfoPi, p->pInfoTemp );
|
|
// split the classes and collect the new patterns
|
|
if ( Aig_ManUpdateClasses( p, p->pInfoTemp, p->vClasses, p->pPatMask ) )
|
|
Aig_ManCollectPatterns( p, p->pInfoTemp, p->pPatMask, NULL );
|
|
if ( Vec_VecSize(p->vClasses) == 0 )
|
|
return;
|
|
// count the number of useful patterns
|
|
Counter = Aig_PatternCount(p->pPatMask);
|
|
}
|
|
while ( Counter > p->nPatsMax/2 );
|
|
|
|
// perform targetted simulation
|
|
for ( i = 0; i < 3; i++ )
|
|
{
|
|
assert( Vec_PtrSize(p->vPats) == 0 );
|
|
// generate random PI siminfo
|
|
Aig_SimInfoRandom( p->pInfoPi );
|
|
// simulate this info
|
|
Aig_ManSimulateInfo( p, p->pInfoPi, p->pInfoTemp );
|
|
// split the classes and collect the new patterns
|
|
if ( Aig_ManUpdateClasses( p, p->pInfoTemp, p->vClasses, p->pPatMask ) )
|
|
Aig_ManCollectPatterns( p, p->pInfoTemp, p->pPatMask, p->vPats );
|
|
if ( Vec_VecSize(p->vClasses) == 0 )
|
|
return;
|
|
// simulate the remaining patters
|
|
if ( Vec_PtrSize(p->vPats) > 0 )
|
|
if ( !Aig_EngineSimulate( p ) )
|
|
return;
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Implements intelligent simulation engine.]
|
|
|
|
Description [Assumes that the good simulation patterns have been
|
|
assigned (p->vPats). Simulates until all of them are gone. Returns 1
|
|
if some classes are left. Returns 0 if there is no more classes.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Aig_EngineSimulate( Aig_Man_t * p )
|
|
{
|
|
Aig_Pattern_t * pPat;
|
|
if ( Vec_VecSize(p->vClasses) == 0 )
|
|
return 0;
|
|
assert( Vec_PtrSize(p->vPats) > 0 );
|
|
// process patterns
|
|
while ( Vec_PtrSize(p->vPats) > 0 && Vec_VecSize(p->vClasses) > 0 )
|
|
{
|
|
// get the pattern and create new siminfo
|
|
pPat = Vec_PtrPop(p->vPats);
|
|
assert( pPat->nBits == Aig_ManPiNum(p) );
|
|
// create the new siminfo
|
|
Aig_SimInfoFromPattern( p->pInfoPi, pPat );
|
|
// free the pattern
|
|
Aig_PatternFree( pPat );
|
|
|
|
// simulate this info
|
|
Aig_ManSimulateInfo( p, p->pInfoPi, p->pInfoTemp );
|
|
// split the classes and collect the new patterns
|
|
if ( Aig_ManUpdateClasses( p, p->pInfoTemp, p->vClasses, p->pPatMask ) )
|
|
Aig_ManCollectPatterns( p, p->pInfoTemp, p->pPatMask, p->vPats );
|
|
}
|
|
return Vec_VecSize(p->vClasses) > 0;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|