| /**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 | |