mirror of https://github.com/YosysHQ/abc.git
912 lines
26 KiB
C
912 lines
26 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [darScript.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [DAG-aware AIG rewriting.]
|
|
|
|
Synopsis [Rewriting scripts.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - April 28, 2007.]
|
|
|
|
Revision [$Id: darScript.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "darInt.h"
|
|
#include "proof/dch/dch.h"
|
|
#include "aig/gia/gia.h"
|
|
#include "aig/gia/giaAig.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Performs one iteration of AIG rewriting.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManRewriteDefault( Aig_Man_t * pAig )
|
|
{
|
|
Aig_Man_t * pTemp;
|
|
Dar_RwrPar_t Pars, * pPars = &Pars;
|
|
Dar_ManDefaultRwrParams( pPars );
|
|
pAig = Aig_ManDupDfs( pAig );
|
|
Dar_ManRewrite( pAig, pPars );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
return pAig;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "rwsat".]
|
|
|
|
Description []
|
|
|
|
SideEffects [This procedure does not tighten level during restructuring.]
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose )
|
|
//alias rwsat "st; rw -l; b -l; rw -l; rf -l"
|
|
{
|
|
Aig_Man_t * pTemp;
|
|
abctime Time = pAig->Time2Quit;
|
|
|
|
Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr;
|
|
Dar_RefPar_t ParsRef, * pParsRef = &ParsRef;
|
|
|
|
Dar_ManDefaultRwrParams( pParsRwr );
|
|
Dar_ManDefaultRefParams( pParsRef );
|
|
|
|
pParsRwr->fUpdateLevel = 0;
|
|
pParsRef->fUpdateLevel = 0;
|
|
|
|
pParsRwr->fVerbose = fVerbose;
|
|
pParsRef->fVerbose = fVerbose;
|
|
//printf( "1" );
|
|
pAig = Aig_ManDupDfs( pAig );
|
|
if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig );
|
|
|
|
//printf( "2" );
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig->Time2Quit = Time;
|
|
pAig = Dar_ManBalance( pTemp = pAig, 0 );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
if ( Time && Abc_Clock() > Time )
|
|
{ if ( pAig ) Aig_ManStop( pAig ); return NULL; }
|
|
}
|
|
|
|
//Aig_ManDumpBlif( pAig, "inter.blif", NULL, NULL );
|
|
//printf( "3" );
|
|
// rewrite
|
|
pAig->Time2Quit = Time;
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
if ( Time && Abc_Clock() > Time )
|
|
{ if ( pAig ) Aig_ManStop( pAig ); return NULL; }
|
|
|
|
//printf( "4" );
|
|
// refactor
|
|
pAig->Time2Quit = Time;
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig );
|
|
if ( Time && Abc_Clock() > Time )
|
|
{ if ( pAig ) Aig_ManStop( pAig ); return NULL; }
|
|
|
|
//printf( "5" );
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig->Time2Quit = Time;
|
|
pAig = Dar_ManBalance( pTemp = pAig, 0 );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
if ( Time && Abc_Clock() > Time )
|
|
{ if ( pAig ) Aig_ManStop( pAig ); return NULL; }
|
|
}
|
|
|
|
//printf( "6" );
|
|
// rewrite
|
|
pAig->Time2Quit = Time;
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
if ( Time && Abc_Clock() > Time )
|
|
{ if ( pAig ) Aig_ManStop( pAig ); return NULL; }
|
|
|
|
//printf( "7" );
|
|
return pAig;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fPower, int fVerbose )
|
|
//alias compress2 "b -l; rw -l; rwz -l; b -l; rwz -l; b -l"
|
|
{
|
|
Aig_Man_t * pTemp;
|
|
|
|
Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr;
|
|
Dar_RefPar_t ParsRef, * pParsRef = &ParsRef;
|
|
|
|
Dar_ManDefaultRwrParams( pParsRwr );
|
|
Dar_ManDefaultRefParams( pParsRef );
|
|
|
|
pParsRwr->fUpdateLevel = fUpdateLevel;
|
|
pParsRef->fUpdateLevel = fUpdateLevel;
|
|
|
|
pParsRwr->fPower = fPower;
|
|
|
|
pParsRwr->fVerbose = 0;//fVerbose;
|
|
pParsRef->fVerbose = 0;//fVerbose;
|
|
|
|
pAig = Aig_ManDupDfs( pAig );
|
|
if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig );
|
|
/*
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
*/
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// refactor
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
pParsRwr->fUseZeros = 1;
|
|
pParsRef->fUseZeros = 1;
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
return pAig;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fFanout, int fPower, int fVerbose )
|
|
//alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l"
|
|
{
|
|
Aig_Man_t * pTemp;
|
|
|
|
Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr;
|
|
Dar_RefPar_t ParsRef, * pParsRef = &ParsRef;
|
|
|
|
Dar_ManDefaultRwrParams( pParsRwr );
|
|
Dar_ManDefaultRefParams( pParsRef );
|
|
|
|
pParsRwr->fUpdateLevel = fUpdateLevel;
|
|
pParsRef->fUpdateLevel = fUpdateLevel;
|
|
pParsRwr->fFanout = fFanout;
|
|
pParsRwr->fPower = fPower;
|
|
|
|
pParsRwr->fVerbose = 0;//fVerbose;
|
|
pParsRef->fVerbose = 0;//fVerbose;
|
|
|
|
pAig = Aig_ManDupDfs( pAig );
|
|
if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig );
|
|
/*
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
*/
|
|
// rewrite
|
|
// Dar_ManRewrite( pAig, pParsRwr );
|
|
pParsRwr->fUpdateLevel = 0; // disable level update
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pParsRwr->fUpdateLevel = fUpdateLevel; // reenable level update if needed
|
|
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// refactor
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// balance
|
|
// if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
|
|
pParsRwr->fUseZeros = 1;
|
|
pParsRef->fUseZeros = 1;
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
// refactor
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RefactorZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
return pAig;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Vec_Ptr_t * Dar_ManChoiceSynthesis( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fPower, int fVerbose )
|
|
//alias resyn "b; rw; rwz; b; rwz; b"
|
|
//alias resyn2 "b; rw; rf; b; rw; rwz; b; rfz; rwz; b"
|
|
{
|
|
Vec_Ptr_t * vAigs;
|
|
|
|
vAigs = Vec_PtrAlloc( 3 );
|
|
pAig = Aig_ManDupDfs(pAig);
|
|
Vec_PtrPush( vAigs, pAig );
|
|
|
|
pAig = Dar_ManCompress(pAig, fBalance, fUpdateLevel, fPower, fVerbose);
|
|
Vec_PtrPush( vAigs, pAig );
|
|
//Aig_ManPrintStats( pAig );
|
|
|
|
pAig = Dar_ManCompress2(pAig, fBalance, fUpdateLevel, 1, fPower, fVerbose);
|
|
Vec_PtrPush( vAigs, pAig );
|
|
//Aig_ManPrintStats( pAig );
|
|
|
|
pAig = (Aig_Man_t *)Vec_PtrEntry( vAigs, 1 );
|
|
return vAigs;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManChoice( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fConstruct, int nConfMax, int nLevelMax, int fVerbose )
|
|
{
|
|
Aig_Man_t * pMan, * pTemp;
|
|
Vec_Ptr_t * vAigs;
|
|
int i;
|
|
abctime clk;
|
|
|
|
clk = Abc_Clock();
|
|
// vAigs = Dar_ManChoiceSynthesisExt();
|
|
vAigs = Dar_ManChoiceSynthesis( pAig, fBalance, fUpdateLevel, 0, fVerbose );
|
|
|
|
// swap the first and last network
|
|
// this should lead to the primary choice being "better" because of synthesis
|
|
// (it is also important when constructing choices)
|
|
if ( !fConstruct )
|
|
{
|
|
pMan = (Aig_Man_t *)Vec_PtrPop( vAigs );
|
|
Vec_PtrPush( vAigs, Vec_PtrEntry(vAigs,0) );
|
|
Vec_PtrWriteEntry( vAigs, 0, pMan );
|
|
}
|
|
|
|
if ( fVerbose )
|
|
{
|
|
ABC_PRT( "Synthesis time", Abc_Clock() - clk );
|
|
}
|
|
clk = Abc_Clock();
|
|
if ( fConstruct )
|
|
pMan = Aig_ManChoiceConstructive( vAigs, fVerbose );
|
|
else
|
|
pMan = Aig_ManChoicePartitioned( vAigs, 300, nConfMax, nLevelMax, fVerbose );
|
|
Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pTemp, i )
|
|
Aig_ManStop( pTemp );
|
|
Vec_PtrFree( vAigs );
|
|
if ( fVerbose )
|
|
{
|
|
ABC_PRT( "Choicing time ", Abc_Clock() - clk );
|
|
}
|
|
return pMan;
|
|
// return NULL;
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_NewCompress( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fPower, int fVerbose )
|
|
//alias compress2 "b -l; rw -l; rwz -l; b -l; rwz -l; b -l"
|
|
{
|
|
Aig_Man_t * pTemp;
|
|
|
|
Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr;
|
|
Dar_RefPar_t ParsRef, * pParsRef = &ParsRef;
|
|
|
|
Dar_ManDefaultRwrParams( pParsRwr );
|
|
Dar_ManDefaultRefParams( pParsRef );
|
|
|
|
pParsRwr->fUpdateLevel = fUpdateLevel;
|
|
pParsRef->fUpdateLevel = fUpdateLevel;
|
|
|
|
pParsRwr->fPower = fPower;
|
|
|
|
pParsRwr->fVerbose = 0;//fVerbose;
|
|
pParsRef->fVerbose = 0;//fVerbose;
|
|
|
|
// pAig = Aig_ManDupDfs( pAig );
|
|
if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// refactor
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
pParsRwr->fUseZeros = 1;
|
|
pParsRef->fUseZeros = 1;
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
return pAig;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_NewCompress2( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fFanout, int fPower, int fLightSynth, int fVerbose )
|
|
//alias compress2 "b -l; rw -l; rf -l; b -l; rw -l; rwz -l; b -l; rfz -l; rwz -l; b -l"
|
|
{
|
|
Aig_Man_t * pTemp;
|
|
|
|
Dar_RwrPar_t ParsRwr, * pParsRwr = &ParsRwr;
|
|
Dar_RefPar_t ParsRef, * pParsRef = &ParsRef;
|
|
|
|
Dar_ManDefaultRwrParams( pParsRwr );
|
|
Dar_ManDefaultRefParams( pParsRef );
|
|
|
|
pParsRwr->fUpdateLevel = fUpdateLevel;
|
|
pParsRef->fUpdateLevel = fUpdateLevel;
|
|
pParsRwr->fFanout = fFanout;
|
|
pParsRwr->fPower = fPower;
|
|
|
|
pParsRwr->fVerbose = 0;//fVerbose;
|
|
pParsRef->fVerbose = 0;//fVerbose;
|
|
|
|
// pAig = Aig_ManDupDfs( pAig );
|
|
if ( fVerbose ) printf( "Starting: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// skip if lighter synthesis is requested
|
|
if ( !fLightSynth )
|
|
{
|
|
// rewrite
|
|
//Dar_ManRewrite( pAig, pParsRwr );
|
|
// pParsRwr->fUpdateLevel = 0; // disable level update // this change was requested in July and later disabled
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
// pParsRwr->fUpdateLevel = fUpdateLevel; // reenable level update if needed
|
|
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// refactor
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Refactor: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
// balance
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// skip if lighter synthesis is requested
|
|
if ( !fLightSynth )
|
|
{
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Rewrite: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
pParsRwr->fUseZeros = 1;
|
|
pParsRef->fUseZeros = 1;
|
|
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// skip if lighter synthesis is requested
|
|
if ( !fLightSynth )
|
|
{
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
}
|
|
|
|
// refactor
|
|
Dar_ManRefactor( pAig, pParsRef );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RefactorZ: " ), Aig_ManPrintStats( pAig );
|
|
|
|
// skip if lighter synthesis is requested
|
|
if ( !fLightSynth )
|
|
{
|
|
// rewrite
|
|
Dar_ManRewrite( pAig, pParsRwr );
|
|
pAig = Aig_ManDupDfs( pTemp = pAig );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "RewriteZ: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
|
|
// balance
|
|
if ( fBalance )
|
|
{
|
|
pAig = Dar_ManBalance( pTemp = pAig, fUpdateLevel );
|
|
Aig_ManStop( pTemp );
|
|
if ( fVerbose ) printf( "Balance: " ), Aig_ManPrintStats( pAig );
|
|
}
|
|
return pAig;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Count the number of nodes with very high fanout count.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Dar_NewChoiceSynthesisGuard( Aig_Man_t * pAig )
|
|
{
|
|
Aig_Obj_t * pObj;
|
|
int i, Count = 0;
|
|
Aig_ManForEachNode( pAig, pObj, i )
|
|
if ( Aig_ObjRefs(pObj) > 1000 )
|
|
Count += Aig_ObjRefs(pObj) / 1000;
|
|
return (int)(Count > 10);
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description [Takes AIG manager, consumes it, and produces GIA manager.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Gia_Man_t * Dar_NewChoiceSynthesis( Aig_Man_t * pAig, int fBalance, int fUpdateLevel, int fPower, int fLightSynth, int fVerbose )
|
|
//alias resyn "b; rw; rwz; b; rwz; b"
|
|
//alias resyn2 "b; rw; rf; b; rw; rwz; b; rfz; rwz; b"
|
|
{
|
|
Vec_Ptr_t * vGias;
|
|
Gia_Man_t * pGia, * pTemp;
|
|
int i;
|
|
|
|
if ( fUpdateLevel && Dar_NewChoiceSynthesisGuard(pAig) )
|
|
{
|
|
if ( fVerbose )
|
|
printf( "Warning: Due to high fanout count of some nodes, level updating is disabled.\n" );
|
|
fUpdateLevel = 0;
|
|
}
|
|
|
|
vGias = Vec_PtrAlloc( 3 );
|
|
pGia = Gia_ManFromAig(pAig);
|
|
Vec_PtrPush( vGias, pGia );
|
|
|
|
pAig = Dar_NewCompress( pAig, fBalance, fUpdateLevel, fPower, fVerbose );
|
|
pGia = Gia_ManFromAig(pAig);
|
|
Vec_PtrPush( vGias, pGia );
|
|
//Aig_ManPrintStats( pAig );
|
|
|
|
pAig = Dar_NewCompress2( pAig, fBalance, fUpdateLevel, 1, fPower, fLightSynth, fVerbose );
|
|
pGia = Gia_ManFromAig(pAig);
|
|
Vec_PtrPush( vGias, pGia );
|
|
//Aig_ManPrintStats( pAig );
|
|
|
|
Aig_ManStop( pAig );
|
|
|
|
// swap around the first and the last
|
|
pTemp = (Gia_Man_t *)Vec_PtrPop( vGias );
|
|
Vec_PtrPush( vGias, Vec_PtrEntry(vGias,0) );
|
|
Vec_PtrWriteEntry( vGias, 0, pTemp );
|
|
|
|
// Aig_Man_t * pAig;
|
|
// int i;
|
|
// printf( "Choicing will be performed with %d AIGs:\n", Vec_PtrSize(p->vAigs) );
|
|
// Vec_PtrForEachEntry( Aig_Man_t *, p->vAigs, pAig, i )
|
|
// Aig_ManPrintStats( pAig );
|
|
|
|
// derive the miter
|
|
pGia = Gia_ManChoiceMiter( vGias );
|
|
|
|
// cleanup
|
|
Vec_PtrForEachEntry( Gia_Man_t *, vGias, pTemp, i )
|
|
Gia_ManStop( pTemp );
|
|
Vec_PtrFree( vGias );
|
|
return pGia;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
/*
|
|
Aig_Man_t * Dar_ManChoiceNew( Aig_Man_t * pAig, Dch_Pars_t * pPars )
|
|
{
|
|
extern Aig_Man_t * Dch_ComputeChoices( Vec_Ptr_t * vAigs, Dch_Pars_t * pPars );
|
|
extern Aig_Man_t * Cec_ComputeChoices( Vec_Ptr_t * vAigs, Dch_Pars_t * pPars );
|
|
|
|
int fVerbose = pPars->fVerbose;
|
|
int fConstruct = 0;
|
|
Aig_Man_t * pMan, * pTemp;
|
|
Vec_Ptr_t * vAigs;
|
|
int i;
|
|
abctime clk;
|
|
|
|
clk = Abc_Clock();
|
|
// vAigs = Dar_ManChoiceSynthesisExt();
|
|
// vAigs = Dar_ManChoiceSynthesis( pAig, 1, 1, pPars->fPower, fVerbose );
|
|
vAigs = Dar_ManChoiceSynthesis( pAig, 1, 1, pPars->fPower, 0 );
|
|
|
|
// swap the first and last network
|
|
// this should lead to the primary choice being "better" because of synthesis
|
|
// (it is also important when constructing choices)
|
|
if ( !fConstruct )
|
|
{
|
|
pMan = Vec_PtrPop( vAigs );
|
|
Vec_PtrPush( vAigs, Vec_PtrEntry(vAigs,0) );
|
|
Vec_PtrWriteEntry( vAigs, 0, pMan );
|
|
}
|
|
|
|
if ( fVerbose )
|
|
{
|
|
//ABC_PRT( "Synthesis time", Abc_Clock() - clk );
|
|
}
|
|
pPars->timeSynth = Abc_Clock() - clk;
|
|
|
|
clk = Abc_Clock();
|
|
// perform choice computation
|
|
if ( pPars->fUseGia )
|
|
pMan = Cec_ComputeChoices( vAigs, pPars );
|
|
else
|
|
pMan = Dch_ComputeChoices( vAigs, pPars );
|
|
|
|
// reconstruct the network
|
|
pMan = Aig_ManDupDfsGuided( pTemp = pMan, Vec_PtrEntry(vAigs,0) );
|
|
Aig_ManStop( pTemp );
|
|
// duplicate the timing manager
|
|
pTemp = Vec_PtrEntry( vAigs, 0 );
|
|
if ( pTemp->pManTime )
|
|
{
|
|
extern void * Tim_ManDup( void * p, int fDiscrete );
|
|
pMan->pManTime = Tim_ManDup( pTemp->pManTime, 0 );
|
|
}
|
|
// reset levels
|
|
Aig_ManChoiceLevel( pMan );
|
|
ABC_FREE( pMan->pName );
|
|
ABC_FREE( pMan->pSpec );
|
|
pMan->pName = Abc_UtilStrsav( pTemp->pName );
|
|
pMan->pSpec = Abc_UtilStrsav( pTemp->pSpec );
|
|
|
|
// cleanup
|
|
Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pTemp, i )
|
|
Aig_ManStop( pTemp );
|
|
Vec_PtrFree( vAigs );
|
|
|
|
if ( fVerbose )
|
|
{
|
|
//ABC_PRT( "Choicing time ", Abc_Clock() - clk );
|
|
}
|
|
return pMan;
|
|
// return NULL;
|
|
}
|
|
*/
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description [Consumes the input AIG to reduce memory usage.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManChoiceNewAig( Aig_Man_t * pAig, Dch_Pars_t * pPars )
|
|
{
|
|
// extern Aig_Man_t * Dch_DeriveTotalAig( Vec_Ptr_t * vAigs );
|
|
extern Aig_Man_t * Dch_ComputeChoices( Aig_Man_t * pAig, Dch_Pars_t * pPars );
|
|
int fVerbose = pPars->fVerbose;
|
|
Aig_Man_t * pMan, * pTemp;
|
|
Vec_Ptr_t * vAigs;
|
|
Vec_Ptr_t * vPios;
|
|
void * pManTime;
|
|
char * pName, * pSpec;
|
|
int i;
|
|
abctime clk;
|
|
|
|
clk = Abc_Clock();
|
|
vAigs = Dar_ManChoiceSynthesis( pAig, 1, 1, pPars->fPower, fVerbose );
|
|
pPars->timeSynth = Abc_Clock() - clk;
|
|
// swap the first and last network
|
|
// this should lead to the primary choice being "better" because of synthesis
|
|
// (it is also important when constructing choices)
|
|
pMan = (Aig_Man_t *)Vec_PtrPop( vAigs );
|
|
Vec_PtrPush( vAigs, Vec_PtrEntry(vAigs,0) );
|
|
Vec_PtrWriteEntry( vAigs, 0, pMan );
|
|
|
|
// derive the total AIG
|
|
pMan = Dch_DeriveTotalAig( vAigs );
|
|
// cleanup
|
|
Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pTemp, i )
|
|
Aig_ManStop( pTemp );
|
|
Vec_PtrFree( vAigs );
|
|
|
|
// compute choices
|
|
pMan = Dch_ComputeChoices( pTemp = pMan, pPars );
|
|
Aig_ManStop( pTemp );
|
|
|
|
// save useful things
|
|
pManTime = pAig->pManTime; pAig->pManTime = NULL;
|
|
pName = Abc_UtilStrsav( pAig->pName );
|
|
pSpec = Abc_UtilStrsav( pAig->pSpec );
|
|
|
|
// create guidence
|
|
vPios = Aig_ManOrderPios( pMan, pAig );
|
|
Aig_ManStop( pAig );
|
|
|
|
// reconstruct the network
|
|
pMan = Aig_ManDupDfsGuided( pTemp = pMan, vPios );
|
|
Aig_ManStop( pTemp );
|
|
Vec_PtrFree( vPios );
|
|
|
|
// reset levels
|
|
pMan->pManTime = pManTime;
|
|
Aig_ManChoiceLevel( pMan );
|
|
|
|
// copy names
|
|
ABC_FREE( pMan->pName );
|
|
ABC_FREE( pMan->pSpec );
|
|
pMan->pName = pName;
|
|
pMan->pSpec = pSpec;
|
|
return pMan;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Reproduces script "compress2".]
|
|
|
|
Description [Consumes the input AIG to reduce memory usage.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Aig_Man_t * Dar_ManChoiceNew( Aig_Man_t * pAig, Dch_Pars_t * pPars )
|
|
{
|
|
extern Aig_Man_t * Cec_ComputeChoices( Gia_Man_t * pGia, Dch_Pars_t * pPars );
|
|
// extern Aig_Man_t * Dch_DeriveTotalAig( Vec_Ptr_t * vAigs );
|
|
extern Aig_Man_t * Dch_ComputeChoices( Aig_Man_t * pAig, Dch_Pars_t * pPars );
|
|
// int fVerbose = pPars->fVerbose;
|
|
Aig_Man_t * pMan, * pTemp;
|
|
Gia_Man_t * pGia;
|
|
Vec_Ptr_t * vPios;
|
|
void * pManTime;
|
|
char * pName, * pSpec;
|
|
abctime clk;
|
|
|
|
// save useful things
|
|
pManTime = pAig->pManTime; pAig->pManTime = NULL;
|
|
pName = Abc_UtilStrsav( pAig->pName );
|
|
pSpec = Abc_UtilStrsav( pAig->pSpec );
|
|
|
|
// perform synthesis
|
|
clk = Abc_Clock();
|
|
pGia = Dar_NewChoiceSynthesis( Aig_ManDupDfs(pAig), 1, 1, pPars->fPower, pPars->fLightSynth, pPars->fVerbose );
|
|
pPars->timeSynth = Abc_Clock() - clk;
|
|
|
|
// perform choice computation
|
|
if ( pPars->fUseGia )
|
|
pMan = Cec_ComputeChoices( pGia, pPars );
|
|
else
|
|
{
|
|
pMan = Gia_ManToAigSkip( pGia, 3 );
|
|
Gia_ManStop( pGia );
|
|
pMan = Dch_ComputeChoices( pTemp = pMan, pPars );
|
|
Aig_ManStop( pTemp );
|
|
}
|
|
|
|
// create guidence
|
|
vPios = Aig_ManOrderPios( pMan, pAig );
|
|
Aig_ManStop( pAig );
|
|
|
|
// reconstruct the network
|
|
pMan = Aig_ManDupDfsGuided( pTemp = pMan, vPios );
|
|
Aig_ManStop( pTemp );
|
|
Vec_PtrFree( vPios );
|
|
|
|
// reset levels
|
|
pMan->pManTime = pManTime;
|
|
Aig_ManChoiceLevel( pMan );
|
|
|
|
// copy names
|
|
ABC_FREE( pMan->pName );
|
|
ABC_FREE( pMan->pSpec );
|
|
pMan->pName = pName;
|
|
pMan->pSpec = pSpec;
|
|
return pMan;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|