mirror of https://github.com/YosysHQ/abc.git
272 lines
11 KiB
C
272 lines
11 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [fraigMan.c]
|
|
|
|
PackageName [FRAIG: Functionally reduced AND-INV graphs.]
|
|
|
|
Synopsis [Implementation of the FRAIG manager.]
|
|
|
|
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 2.0. Started - October 1, 2004]
|
|
|
|
Revision [$Id: fraigMan.c,v 1.11 2005/07/08 01:01:31 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "fraigInt.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
int timeSelect;
|
|
int timeAssign;
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Sets the default parameters of the package.]
|
|
|
|
Description [This set of parameters is tuned for equivalence checking.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Fraig_ParamsSetDefault( Fraig_Params_t * pParams )
|
|
{
|
|
memset( pParams, 0, sizeof(Fraig_Params_t) );
|
|
pParams->nPatsRand = FRAIG_PATTERNS_RANDOM; // the number of words of random simulation info
|
|
pParams->nPatsDyna = FRAIG_PATTERNS_DYNAMIC; // the number of words of dynamic simulation info
|
|
pParams->nBTLimit = 99; // the max number of backtracks to perform
|
|
pParams->nSeconds = 20; // the max number of seconds to solve the miter
|
|
pParams->fFuncRed = 1; // performs only one level hashing
|
|
pParams->fFeedBack = 1; // enables solver feedback
|
|
pParams->fDist1Pats = 1; // enables distance-1 patterns
|
|
pParams->fDoSparse = 0; // performs equiv tests for sparse functions
|
|
pParams->fChoicing = 0; // enables recording structural choices
|
|
pParams->fTryProve = 1; // tries to solve the final miter
|
|
pParams->fVerbose = 0; // the verbosiness flag
|
|
pParams->fVerboseP = 0; // the verbose flag for reporting the proof
|
|
pParams->fInternal = 0; // the flag indicates the internal run
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Sets the default parameters of the package.]
|
|
|
|
Description [This set of parameters is tuned for complete FRAIGing.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Fraig_ParamsSetDefaultFull( Fraig_Params_t * pParams )
|
|
{
|
|
memset( pParams, 0, sizeof(Fraig_Params_t) );
|
|
pParams->nPatsRand = FRAIG_PATTERNS_RANDOM; // the number of words of random simulation info
|
|
pParams->nPatsDyna = FRAIG_PATTERNS_DYNAMIC; // the number of words of dynamic simulation info
|
|
pParams->nBTLimit = -1; // the max number of backtracks to perform
|
|
pParams->nSeconds = 20; // the max number of seconds to solve the miter
|
|
pParams->fFuncRed = 1; // performs only one level hashing
|
|
pParams->fFeedBack = 1; // enables solver feedback
|
|
pParams->fDist1Pats = 1; // enables distance-1 patterns
|
|
pParams->fDoSparse = 1; // performs equiv tests for sparse functions
|
|
pParams->fChoicing = 0; // enables recording structural choices
|
|
pParams->fTryProve = 0; // tries to solve the final miter
|
|
pParams->fVerbose = 0; // the verbosiness flag
|
|
pParams->fVerboseP = 0; // the verbose flag for reporting the proof
|
|
pParams->fInternal = 0; // the flag indicates the internal run
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Creates the new FRAIG manager.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Fraig_Man_t * Fraig_ManCreate( Fraig_Params_t * pParams )
|
|
{
|
|
Fraig_Params_t Params;
|
|
Fraig_Man_t * p;
|
|
|
|
// set the random seed for simulation
|
|
srand( 0xFEEDDEAF );
|
|
|
|
// set parameters for equivalence checking
|
|
if ( pParams == NULL )
|
|
Fraig_ParamsSetDefault( pParams = &Params );
|
|
// adjust the amount of simulation info
|
|
if ( pParams->nPatsRand < 128 )
|
|
pParams->nPatsRand = 128;
|
|
if ( pParams->nPatsRand > 32768 )
|
|
pParams->nPatsRand = 32768;
|
|
if ( pParams->nPatsDyna < 128 )
|
|
pParams->nPatsDyna = 128;
|
|
if ( pParams->nPatsDyna > 32768 )
|
|
pParams->nPatsDyna = 32768;
|
|
// if reduction is not performed, allocate minimum simulation info
|
|
if ( !pParams->fFuncRed )
|
|
pParams->nPatsRand = pParams->nPatsDyna = 128;
|
|
|
|
// start the manager
|
|
p = ALLOC( Fraig_Man_t, 1 );
|
|
memset( p, 0, sizeof(Fraig_Man_t) );
|
|
|
|
// set the default parameters
|
|
p->nWordsRand = FRAIG_NUM_WORDS( pParams->nPatsRand ); // the number of words of random simulation info
|
|
p->nWordsDyna = FRAIG_NUM_WORDS( pParams->nPatsDyna ); // the number of patterns for dynamic simulation info
|
|
p->nBTLimit = pParams->nBTLimit; // -1 means infinite backtrack limit
|
|
p->nSeconds = pParams->nSeconds; // the timeout for the final miter
|
|
p->fFuncRed = pParams->fFuncRed; // enables functional reduction (otherwise, only one-level hashing is performed)
|
|
p->fFeedBack = pParams->fFeedBack; // enables solver feedback (the use of counter-examples in simulation)
|
|
p->fDist1Pats = pParams->fDist1Pats; // enables solver feedback (the use of counter-examples in simulation)
|
|
p->fDoSparse = pParams->fDoSparse; // performs equivalence checking for sparse functions (whose sim-info is 0)
|
|
p->fChoicing = pParams->fChoicing; // disable accumulation of structural choices (keeps only the first choice)
|
|
p->fTryProve = pParams->fTryProve; // disable accumulation of structural choices (keeps only the first choice)
|
|
p->fVerbose = pParams->fVerbose; // disable verbose output
|
|
p->fVerboseP = pParams->fVerboseP; // disable verbose output
|
|
|
|
// start memory managers
|
|
p->mmNodes = Fraig_MemFixedStart( sizeof(Fraig_Node_t) );
|
|
p->mmSims = Fraig_MemFixedStart( sizeof(unsigned) * (p->nWordsRand + p->nWordsDyna) );
|
|
// allocate node arrays
|
|
p->vInputs = Fraig_NodeVecAlloc( 1000 ); // the array of primary inputs
|
|
p->vOutputs = Fraig_NodeVecAlloc( 1000 ); // the array of primary outputs
|
|
p->vNodes = Fraig_NodeVecAlloc( 1000 ); // the array of internal nodes
|
|
// start the tables
|
|
p->pTableS = Fraig_HashTableCreate( 1000 ); // hashing by structure
|
|
p->pTableF = Fraig_HashTableCreate( 1000 ); // hashing by function
|
|
p->pTableF0 = Fraig_HashTableCreate( 1000 ); // hashing by function (for sparse functions)
|
|
// create the constant node
|
|
p->pConst1 = Fraig_NodeCreateConst( p );
|
|
// initialize SAT solver feedback data structures
|
|
Fraig_FeedBackInit( p );
|
|
// initialize other variables
|
|
p->vProj = Msat_IntVecAlloc( 10 );
|
|
p->nTravIds = 1;
|
|
p->nTravIds2 = 1;
|
|
return p;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Deallocates the mapping manager.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Fraig_ManFree( Fraig_Man_t * p )
|
|
{
|
|
int i;
|
|
if ( p->fVerbose )
|
|
{
|
|
if ( p->fChoicing ) Fraig_ManReportChoices( p );
|
|
Fraig_ManPrintStats( p );
|
|
// Fraig_TablePrintStatsS( p );
|
|
// Fraig_TablePrintStatsF( p );
|
|
// Fraig_TablePrintStatsF0( p );
|
|
}
|
|
|
|
for ( i = 0; i < p->vNodes->nSize; i++ )
|
|
if ( p->vNodes->pArray[i]->vFanins )
|
|
{
|
|
Fraig_NodeVecFree( p->vNodes->pArray[i]->vFanins );
|
|
p->vNodes->pArray[i]->vFanins = NULL;
|
|
}
|
|
|
|
if ( p->vInputs ) Fraig_NodeVecFree( p->vInputs );
|
|
if ( p->vNodes ) Fraig_NodeVecFree( p->vNodes );
|
|
if ( p->vOutputs ) Fraig_NodeVecFree( p->vOutputs );
|
|
|
|
if ( p->pTableS ) Fraig_HashTableFree( p->pTableS );
|
|
if ( p->pTableF ) Fraig_HashTableFree( p->pTableF );
|
|
if ( p->pTableF0 ) Fraig_HashTableFree( p->pTableF0 );
|
|
|
|
if ( p->pSat ) Msat_SolverFree( p->pSat );
|
|
if ( p->vProj ) Msat_IntVecFree( p->vProj );
|
|
if ( p->vCones ) Fraig_NodeVecFree( p->vCones );
|
|
if ( p->vPatsReal ) Msat_IntVecFree( p->vPatsReal );
|
|
if ( p->pModel ) free( p->pModel );
|
|
|
|
Fraig_MemFixedStop( p->mmNodes, 0 );
|
|
Fraig_MemFixedStop( p->mmSims, 0 );
|
|
|
|
if ( p->pSuppS )
|
|
{
|
|
FREE( p->pSuppS[0] );
|
|
FREE( p->pSuppS );
|
|
}
|
|
if ( p->pSuppF )
|
|
{
|
|
FREE( p->pSuppF[0] );
|
|
FREE( p->pSuppF );
|
|
}
|
|
|
|
FREE( p->ppOutputNames );
|
|
FREE( p->ppInputNames );
|
|
FREE( p );
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Deallocates the mapping manager.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Fraig_ManPrintStats( Fraig_Man_t * p )
|
|
{
|
|
double nMemory;
|
|
int clk = clock();
|
|
nMemory = ((double)(p->vInputs->nSize + p->vNodes->nSize) *
|
|
(sizeof(Fraig_Node_t) + sizeof(unsigned)*(p->nWordsRand + p->nWordsDyna) /*+ p->nSuppWords*sizeof(unsigned)*/))/(1<<20);
|
|
printf( "Words: Random = %d. Dynamic = %d. Used = %d. Memory = %0.2f Mb.\n",
|
|
p->nWordsRand, p->nWordsDyna, p->iWordPerm, nMemory );
|
|
printf( "Proof = %d. Counter-example = %d. Fail = %d. Zero = %d.\n",
|
|
p->nSatProof, p->nSatCounter, p->nSatFails, p->nSatZeros );
|
|
printf( "Nodes: Final = %d. Total = %d. Mux = %d. (Exor = %d.) ClaVars = %d.\n",
|
|
Fraig_CountNodes(p,0), p->vNodes->nSize, Fraig_ManCountMuxes(p), Fraig_ManCountExors(p), p->nVarsClauses );
|
|
if ( p->pSat ) Msat_SolverPrintStats( p->pSat );
|
|
Fraig_PrintTime( "AIG simulation ", p->timeSims );
|
|
Fraig_PrintTime( "AIG traversal ", p->timeTrav );
|
|
Fraig_PrintTime( "Solver feedback ", p->timeFeed );
|
|
Fraig_PrintTime( "SAT solving ", p->timeSat );
|
|
Fraig_PrintTime( "Network update ", p->timeToNet );
|
|
Fraig_PrintTime( "TOTAL RUNTIME ", p->timeTotal );
|
|
if ( p->time1 > 0 ) { Fraig_PrintTime( "time1", p->time1 ); }
|
|
if ( p->time2 > 0 ) { Fraig_PrintTime( "time2", p->time2 ); }
|
|
if ( p->time3 > 0 ) { Fraig_PrintTime( "time3", p->time3 ); }
|
|
if ( p->time4 > 0 ) { Fraig_PrintTime( "time4", p->time4 ); }
|
|
// PRT( "Selection ", timeSelect );
|
|
// PRT( "Assignment", timeAssign );
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|