diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2008-05-15 08:01:00 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2008-05-15 08:01:00 -0700 |
commit | 74ff01bfb54e9f0a68ac88b827521a422269a144 (patch) | |
tree | 240c07b87e355dba9caa1e6187d6673b92996eac | |
parent | 37b6c727f1276d9d97a79a8f40271aee446a4ba4 (diff) | |
download | abc-74ff01bfb54e9f0a68ac88b827521a422269a144.tar.gz abc-74ff01bfb54e9f0a68ac88b827521a422269a144.tar.bz2 abc-74ff01bfb54e9f0a68ac88b827521a422269a144.zip |
Version abc80515
-rw-r--r-- | abc.rc | 1 | ||||
-rw-r--r-- | src/aig/fra/fra.h | 27 | ||||
-rw-r--r-- | src/aig/fra/fraSec.c | 154 | ||||
-rw-r--r-- | src/aig/ioa/ioaUtil.c | 19 | ||||
-rw-r--r-- | src/aig/nwk/nwkMan.c | 15 | ||||
-rw-r--r-- | src/aig/saig/saigBmc.c | 2 | ||||
-rw-r--r-- | src/aig/saig/saigInter.c | 5 | ||||
-rw-r--r-- | src/base/abc/1.txt | 21 | ||||
-rw-r--r-- | src/base/abc/abcBlifMv.c | 103 | ||||
-rw-r--r-- | src/base/abc/abcBlifMv.zip | bin | 0 -> 6552 bytes | |||
-rw-r--r-- | src/base/abc/abcFanio.c | 4 | ||||
-rw-r--r-- | src/base/abci/abc.c | 188 | ||||
-rw-r--r-- | src/base/abci/abcDar.c | 37 | ||||
-rw-r--r-- | src/base/io/io.c | 13 | ||||
-rw-r--r-- | src/misc/extra/extraUtilFile.c | 19 | ||||
-rw-r--r-- | src/sat/bsat/satSolver.c | 2 |
16 files changed, 349 insertions, 261 deletions
@@ -56,6 +56,7 @@ alias r3f retime -M 3 -f alias r3b retime -M 3 -b alias ren renode alias rh read_hie +alias ri read_init alias rl read_blif alias rb read_bench alias ret retime diff --git a/src/aig/fra/fra.h b/src/aig/fra/fra.h index f7ad40dd..7cb846fa 100644 --- a/src/aig/fra/fra.h +++ b/src/aig/fra/fra.h @@ -51,6 +51,7 @@ extern "C" { typedef struct Fra_Par_t_ Fra_Par_t; typedef struct Fra_Ssw_t_ Fra_Ssw_t; +typedef struct Fra_Sec_t_ Fra_Sec_t; typedef struct Fra_Man_t_ Fra_Man_t; typedef struct Fra_Cla_t_ Fra_Cla_t; typedef struct Fra_Sml_t_ Fra_Sml_t; @@ -87,7 +88,7 @@ struct Fra_Par_t_ int fDontShowBar; // does not show progressbar during fraiging }; -// seq SAT sweeping parametesr +// seq SAT sweeping parameters struct Fra_Ssw_t_ { int nPartSize; // size of the partition @@ -107,6 +108,27 @@ struct Fra_Ssw_t_ float TimeLimit; // the runtime budget for this call }; +// SEC parametesr +struct Fra_Sec_t_ +{ + int fTryComb; // try CEC call as a preprocessing step + int fTryBmc; // try BMC call as a preprocessing step + int nFramesMax; // the max number of frames used for induction + int fPhaseAbstract; // enables phase abstraction + int fRetimeFirst; // enables most-forward retiming at the beginning + int fRetimeRegs; // enables min-register retiming at the beginning + int fFraiging; // enables fraiging at the beginning + int fInterpolation; // enables interpolation + int fReachability; // enables BDD based reachability + int fStopOnFirstFail; // enables stopping after first output of a miter has failed to prove + int fVerbose; // enables verbose reporting of statistics + int fVeryVerbose; // enables very verbose reporting + int TimeLimit; // enables the timeout + // internal parameters + int fRecursive; // set to 1 when SEC is called recursively + int fReportSolution; // enables report solution in a special form +}; + // FRAIG equivalence classes struct Fra_Cla_t_ { @@ -329,7 +351,8 @@ extern int Fra_NodesAreImp( Fra_Man_t * p, Aig_Obj_t * pOld, Aig extern int Fra_NodesAreClause( Fra_Man_t * p, Aig_Obj_t * pOld, Aig_Obj_t * pNew, int fComplL, int fComplR ); extern int Fra_NodeIsConst( Fra_Man_t * p, Aig_Obj_t * pNew ); /*=== fraSec.c ========================================================*/ -extern int Fra_FraigSec( Aig_Man_t * p, int nFrames, int fPhaseAbstract, int fRetimeFirst, int fRetimeRegs, int fFraiging, int fVerbose, int fVeryVerbose, int TimeLimit ); +extern void Fra_SecSetDefaultParams( Fra_Sec_t * p ); +extern int Fra_FraigSec( Aig_Man_t * p, Fra_Sec_t * pParSec ); /*=== fraSim.c ========================================================*/ extern int Fra_SmlNodeHash( Aig_Obj_t * pObj, int nTableSize ); extern int Fra_SmlNodeIsConst( Aig_Obj_t * pObj ); diff --git a/src/aig/fra/fraSec.c b/src/aig/fra/fraSec.c index db8027d9..b8f93f57 100644 --- a/src/aig/fra/fraSec.c +++ b/src/aig/fra/fraSec.c @@ -40,12 +40,44 @@ SeeAlso [] ***********************************************************************/ -int Fra_FraigSec( Aig_Man_t * p, int nFramesMax, int fPhaseAbstract, int fRetimeFirst, int fRetimeRegs, int fFraiging, int fVerbose, int fVeryVerbose, int TimeLimit ) +void Fra_SecSetDefaultParams( Fra_Sec_t * p ) +{ + memset( p, 0, sizeof(Fra_Sec_t) ); + p->fTryComb = 1; // try CEC call as a preprocessing step + p->fTryBmc = 1; // try BMC call as a preprocessing step + p->nFramesMax = 2; // the max number of frames used for induction + p->fPhaseAbstract = 1; // enables phase abstraction + p->fRetimeFirst = 1; // enables most-forward retiming at the beginning + p->fRetimeRegs = 1; // enables min-register retiming at the beginning + p->fFraiging = 1; // enables fraiging at the beginning + p->fInterpolation = 1; // enables interpolation + p->fReachability = 1; // enables BDD based reachability + p->fStopOnFirstFail = 1; // enables stopping after first output of a miter has failed to prove + p->fVerbose = 0; // enables verbose reporting of statistics + p->fVeryVerbose = 0; // enables very verbose reporting + p->TimeLimit = 0; // enables the timeout + // internal parameters + p->fReportSolution = 1; // enables specialized format for reporting solution +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Fra_FraigSec( Aig_Man_t * p, Fra_Sec_t * pParSec ) { Fra_Ssw_t Pars, * pPars = &Pars; Fra_Sml_t * pSml; Aig_Man_t * pNew, * pTemp; int nFrames, RetValue, nIter, clk, clkTotal = clock(); + int TimeOut = 0; int fLatchCorr = 0; float TimeLeft = 0.0; @@ -58,8 +90,8 @@ int Fra_FraigSec( Aig_Man_t * p, int nFramesMax, int fPhaseAbstract, int fRetime // prepare parameters memset( pPars, 0, sizeof(Fra_Ssw_t) ); pPars->fLatchCorr = fLatchCorr; - pPars->fVerbose = fVeryVerbose; - if ( fVerbose ) + pPars->fVerbose = pParSec->fVeryVerbose; + if ( pParSec->fVerbose ) { printf( "Original miter: Latches = %5d. Nodes = %6d.\n", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -72,7 +104,7 @@ clk = clock(); pNew = Aig_ManReduceLaches( pNew, 0 ); if ( pNew->nRegs ) pNew = Aig_ManConstReduce( pNew, 0 ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Sequential cleanup: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -84,14 +116,14 @@ PRT( "Time", clock() - clk ); // perform phase abstraction clk = clock(); - if ( fPhaseAbstract ) + if ( pParSec->fPhaseAbstract ) { extern Aig_Man_t * Saig_ManPhaseAbstractAuto( Aig_Man_t * p, int fVerbose ); pNew->nTruePis = Aig_ManPiNum(pNew) - Aig_ManRegNum(pNew); pNew->nTruePos = Aig_ManPoNum(pNew) - Aig_ManRegNum(pNew); pNew = Saig_ManPhaseAbstractAuto( pTemp = pNew, 0 ); Aig_ManStop( pTemp ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Phase abstraction: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -100,12 +132,12 @@ PRT( "Time", clock() - clk ); } // perform forward retiming - if ( fRetimeFirst && pNew->nRegs ) + if ( pParSec->fRetimeFirst && pNew->nRegs ) { clk = clock(); pNew = Rtm_ManRetime( pTemp = pNew, 1, 1000, 0 ); Aig_ManStop( pTemp ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Forward retiming: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -120,22 +152,24 @@ clk = clock(); pNew = Aig_ManDupOrdered( pTemp = pNew ); // pNew = Aig_ManDupDfs( pTemp = pNew ); Aig_ManStop( pTemp ); - if ( RetValue == -1 && TimeLimit ) + if ( RetValue == -1 && pParSec->TimeLimit ) { - TimeLeft = (float)TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); + TimeLeft = (float)pParSec->TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); TimeLeft = AIG_MAX( TimeLeft, 0.0 ); if ( TimeLeft == 0.0 ) { printf( "Runtime limit exceeded.\n" ); RetValue = -1; + TimeOut = 1; goto finish; } } - pNew = Fra_FraigLatchCorrespondence( pTemp = pNew, 0, 1000, 1, fVeryVerbose, &nIter, TimeLeft ); + pNew = Fra_FraigLatchCorrespondence( pTemp = pNew, 0, 1000, 1, pParSec->fVeryVerbose, &nIter, TimeLeft ); if ( pNew == NULL ) { pNew = pTemp; RetValue = -1; + TimeOut = 1; goto finish; } p->pSeqModel = pTemp->pSeqModel; pTemp->pSeqModel = NULL; @@ -148,7 +182,7 @@ PRT( "Time", clock() - clkTotal ); return RetValue; } - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Latch-corr (I=%3d): Latches = %5d. Nodes = %6d. ", nIter, Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -156,25 +190,26 @@ PRT( "Time", clock() - clk ); } } - if ( RetValue == -1 && TimeLimit ) + if ( RetValue == -1 && pParSec->TimeLimit ) { - TimeLeft = (float)TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); + TimeLeft = (float)pParSec->TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); TimeLeft = AIG_MAX( TimeLeft, 0.0 ); if ( TimeLeft == 0.0 ) { printf( "Runtime limit exceeded.\n" ); RetValue = -1; + TimeOut = 1; goto finish; } } // perform fraiging - if ( fFraiging ) + if ( pParSec->fFraiging ) { clk = clock(); pNew = Fra_FraigEquivence( pTemp = pNew, 100, 0 ); Aig_ManStop( pTemp ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Fraiging: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -189,20 +224,21 @@ PRT( "Time", clock() - clk ); if ( RetValue >= 0 ) goto finish; - if ( RetValue == -1 && TimeLimit ) + if ( RetValue == -1 && pParSec->TimeLimit ) { - TimeLeft = (float)TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); + TimeLeft = (float)pParSec->TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); TimeLeft = AIG_MAX( TimeLeft, 0.0 ); if ( TimeLeft == 0.0 ) { printf( "Runtime limit exceeded.\n" ); RetValue = -1; + TimeOut = 1; goto finish; } } // perform min-area retiming - if ( fRetimeRegs && pNew->nRegs ) + if ( pParSec->fRetimeRegs && pNew->nRegs ) { extern Aig_Man_t * Saig_ManRetimeMinArea( Aig_Man_t * p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose ); clk = clock(); @@ -213,7 +249,7 @@ clk = clock(); Aig_ManStop( pTemp ); pNew = Aig_ManDupOrdered( pTemp = pNew ); Aig_ManStop( pTemp ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Min-reg retiming: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -224,16 +260,17 @@ PRT( "Time", clock() - clk ); // perform seq sweeping while increasing the number of frames RetValue = Fra_FraigMiterStatus( pNew ); if ( RetValue == -1 ) - for ( nFrames = 1; nFrames <= nFramesMax; nFrames *= 2 ) + for ( nFrames = 1; nFrames <= pParSec->nFramesMax; nFrames *= 2 ) { - if ( RetValue == -1 && TimeLimit ) + if ( RetValue == -1 && pParSec->TimeLimit ) { - TimeLeft = (float)TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); + TimeLeft = (float)pParSec->TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); TimeLeft = AIG_MAX( TimeLeft, 0.0 ); if ( TimeLeft == 0.0 ) { printf( "Runtime limit exceeded.\n" ); RetValue = -1; + TimeOut = 1; goto finish; } } @@ -246,11 +283,12 @@ clk = clock(); { pNew = pTemp; RetValue = -1; + TimeOut = 1; goto finish; } Aig_ManStop( pTemp ); RetValue = Fra_FraigMiterStatus( pNew ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "K-step (K=%2d,I=%3d): Latches = %5d. Nodes = %6d. ", nFrames, pPars->nIters, Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -260,7 +298,7 @@ PRT( "Time", clock() - clk ); break; // perform retiming -// if ( fRetimeFirst && pNew->nRegs ) +// if ( pParSec->fRetimeFirst && pNew->nRegs ) if ( pNew->nRegs ) { extern Aig_Man_t * Saig_ManRetimeMinArea( Aig_Man_t * p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose ); @@ -272,7 +310,7 @@ clk = clock(); Aig_ManStop( pTemp ); pNew = Aig_ManDupOrdered( pTemp = pNew ); Aig_ManStop( pTemp ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Min-reg retiming: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -290,7 +328,7 @@ clk = clock(); // pNew = Dar_ManRewriteDefault( pTemp = pNew ); pNew = Dar_ManCompress2( pTemp = pNew, 1, 0, 1, 0 ); Aig_ManStop( pTemp ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Rewriting: Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -302,7 +340,7 @@ PRT( "Time", clock() - clk ); { clk = clock(); pSml = Fra_SmlSimulateSeq( pNew, 0, 128 * nFrames, 1 + 16/(1+Aig_ManNodeNum(pNew)/1000) ); - if ( fVerbose ) + if ( pParSec->fVerbose ) { printf( "Seq simulation : Latches = %5d. Nodes = %6d. ", Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) ); @@ -327,14 +365,14 @@ PRT( "Time", clock() - clkTotal ); // try interplation clk = clock(); - if ( RetValue == -1 && Aig_ManRegNum(pNew) > 0 && Aig_ManPoNum(pNew)-Aig_ManRegNum(pNew) == 1 ) + if ( pParSec->fInterpolation && RetValue == -1 && Aig_ManRegNum(pNew) > 0 && Aig_ManPoNum(pNew)-Aig_ManRegNum(pNew) == 1 ) { extern int Saig_Interpolate( Aig_Man_t * pAig, int nConfLimit, int fRewrite, int fTransLoop, int fVerbose, int * pDepth ); int Depth; pNew->nTruePis = Aig_ManPiNum(pNew) - Aig_ManRegNum(pNew); pNew->nTruePos = Aig_ManPoNum(pNew) - Aig_ManRegNum(pNew); - RetValue = Saig_Interpolate( pNew, 5000, 0, 1, fVeryVerbose, &Depth ); - if ( fVerbose ) + RetValue = Saig_Interpolate( pNew, 5000, 0, 1, pParSec->fVeryVerbose, &Depth ); + if ( pParSec->fVerbose ) { if ( RetValue == 1 ) printf( "Property proved using interpolation. " ); @@ -349,7 +387,7 @@ PRT( "Time", clock() - clk ); } // try reachability analysis - if ( RetValue == -1 && Aig_ManRegNum(pNew) < 200 && Aig_ManRegNum(pNew) > 0 ) + if ( pParSec->fReachability && RetValue == -1 && Aig_ManRegNum(pNew) > 0 && Aig_ManRegNum(pNew) < 150 ) { extern int Aig_ManVerifyUsingBdds( Aig_Man_t * p, int nBddMax, int nIterMax, int fPartition, int fReorder, int fVerbose ); pNew->nTruePis = Aig_ManPiNum(pNew) - Aig_ManRegNum(pNew); @@ -371,14 +409,16 @@ PRT( "Time", clock() - clk ); iCount = 0; for ( i = 0; i < Aig_ManPoNum(pNew)-Aig_ManRegNum(pNew); i++ ) { + int TimeLimitCopy = 0; // get the remaining time for this output - if ( TimeLimit ) + if ( pParSec->TimeLimit ) { - TimeLeft = (float)TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); + TimeLeft = (float)pParSec->TimeLimit - ((float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)); TimeLeft = AIG_MAX( TimeLeft, 0.0 ); if ( TimeLeft == 0.0 ) { printf( "Runtime limit exceeded.\n" ); + TimeOut = 1; goto finish; } TimeLimit2 = 1 + (int)TimeLeft; @@ -390,12 +430,23 @@ PRT( "Time", clock() - clk ); iCount++; printf( "*** Running output %d of the miter (number %d out of %d unsolved).\n", i, iCount, Counter ); pNew2 = Aig_ManDupOneOutput( pNew, i ); - RetValue2 = Fra_FraigSec( pNew2, nFramesMax, fPhaseAbstract, fRetimeFirst, fRetimeRegs, fFraiging, fVerbose, fVeryVerbose, TimeLimit2 ); + + TimeLimitCopy = pParSec->TimeLimit; + pParSec->TimeLimit = TimeLimit2; + pParSec->fRecursive = 1; + RetValue2 = Fra_FraigSec( pNew2, pParSec ); + pParSec->fRecursive = 0; + pParSec->TimeLimit = TimeLimitCopy; + Aig_ManStop( pNew2 ); if ( RetValue2 == 0 ) goto finish; if ( RetValue2 == -1 ) + { fOneUnsolved = 1; + if ( pParSec->fStopOnFirstFail ) + break; + } } if ( fOneUnsolved ) RetValue = -1; @@ -410,23 +461,42 @@ finish: { printf( "Networks are equivalent. " ); PRT( "Time", clock() - clkTotal ); + if ( pParSec->fReportSolution && !pParSec->fRecursive ) + { + printf( "SOLUTION: PASS " ); +PRT( "Time", clock() - clkTotal ); + } } else if ( RetValue == 0 ) { printf( "Networks are NOT EQUIVALENT. " ); PRT( "Time", clock() - clkTotal ); + if ( pParSec->fReportSolution && !pParSec->fRecursive ) + { + printf( "SOLUTION: FAIL " ); +PRT( "Time", clock() - clkTotal ); + } } - else + else { - static int Counter = 1; - char pFileName[1000]; printf( "Networks are UNDECIDED. " ); PRT( "Time", clock() - clkTotal ); - sprintf( pFileName, "sm%03d.aig", Counter++ ); - Ioa_WriteAiger( pNew, pFileName, 0, 0 ); - printf( "The unsolved reduced miter is written into file \"%s\".\n", pFileName ); + if ( pParSec->fReportSolution && !pParSec->fRecursive ) + { + printf( "SOLUTION: UNDECIDED " ); +PRT( "Time", clock() - clkTotal ); + } + if ( !TimeOut ) + { + static int Counter = 1; + char pFileName[1000]; + sprintf( pFileName, "sm%03d.aig", Counter++ ); + Ioa_WriteAiger( pNew, pFileName, 0, 0 ); + printf( "The unsolved reduced miter is written into file \"%s\".\n", pFileName ); + } } - Aig_ManStop( pNew ); + if ( pNew ) + Aig_ManStop( pNew ); return RetValue; } diff --git a/src/aig/ioa/ioaUtil.c b/src/aig/ioa/ioaUtil.c index 6063d8be..b0e5618b 100644 --- a/src/aig/ioa/ioaUtil.c +++ b/src/aig/ioa/ioaUtil.c @@ -69,20 +69,10 @@ int Ioa_FileSize( char * pFileName ) ***********************************************************************/ char * Ioa_FileNameGeneric( char * FileName ) { - char * pDot; - char * pUnd; - char * pRes; - - // find the generic name of the file + char * pDot, * pRes; pRes = Aig_UtilStrsav( FileName ); - // find the pointer to the "." symbol in the file name -// pUnd = strstr( FileName, "_" ); - pUnd = NULL; - pDot = strstr( FileName, "." ); - if ( pUnd ) - pRes[pUnd - FileName] = 0; - else if ( pDot ) - pRes[pDot - FileName] = 0; + if ( (pDot = strrchr( pRes, '.' )) ) + *pDot = 0; return pRes; } @@ -107,8 +97,7 @@ char * Ioa_FileNameGenericAppend( char * pBase, char * pSuffix ) return Buffer; } strcpy( Buffer, pBase ); - pDot = strstr( Buffer, "." ); - if ( pDot ) + if ( (pDot = strrchr( Buffer, '.' )) ) *pDot = 0; strcat( Buffer, pSuffix ); // find the last occurrance of slash diff --git a/src/aig/nwk/nwkMan.c b/src/aig/nwk/nwkMan.c index 55c5354c..da402f21 100644 --- a/src/aig/nwk/nwkMan.c +++ b/src/aig/nwk/nwkMan.c @@ -174,19 +174,10 @@ int Nwk_ManCompareAndSaveBest( Nwk_Man_t * pNtk, void * pNtl ) ***********************************************************************/ char * Nwk_FileNameGeneric( char * FileName ) { - char * pDot; - char * pUnd; - char * pRes; - // find the generic name of the file + char * pDot, * pRes; pRes = Aig_UtilStrsav( FileName ); - // find the pointer to the "." symbol in the file name -// pUnd = strstr( FileName, "_" ); - pUnd = NULL; - pDot = strstr( FileName, "." ); - if ( pUnd ) - pRes[pUnd - FileName] = 0; - else if ( pDot ) - pRes[pDot - FileName] = 0; + if ( (pDot = strrchr( pRes, '.' )) ) + *pDot = 0; return pRes; } diff --git a/src/aig/saig/saigBmc.c b/src/aig/saig/saigBmc.c index f6a42c8b..952094ce 100644 --- a/src/aig/saig/saigBmc.c +++ b/src/aig/saig/saigBmc.c @@ -182,7 +182,6 @@ int Saig_ManBmcSimple( Aig_Man_t * pAig, int nFrames, int nSizeMax, int nConfLim Aig_Man_t * pFrames, * pAigTemp; Aig_Obj_t * pObj; int status, clk, Lit, i, RetValue = 1; - *piFrame = -1; // derive the timeframes clk = clock(); if ( nSizeMax > 0 ) @@ -192,6 +191,7 @@ int Saig_ManBmcSimple( Aig_Man_t * pAig, int nFrames, int nSizeMax, int nConfLim } else pFrames = Saig_ManFramesBmc( pAig, nFrames ); + *piFrame = nFrames; if ( fVerbose ) { printf( "AIG: PI/PO/Reg = %d/%d/%d. Node = %6d. Lev = %5d.\n", diff --git a/src/aig/saig/saigInter.c b/src/aig/saig/saigInter.c index 3adcc568..889e6298 100644 --- a/src/aig/saig/saigInter.c +++ b/src/aig/saig/saigInter.c @@ -178,6 +178,7 @@ Aig_Man_t * Saig_ManTransformed( Aig_Man_t * p ) Saig_ManForEachLiLo( p, pObjLi, pObjLo, i ) { pObj = Aig_Mux( pNew, pCtrl, pObjLo->pData, Aig_ObjChild0Copy(pObjLi) ); +// pObj = Aig_Mux( pNew, pCtrl, Aig_ManConst0(pNew), Aig_ObjChild0Copy(pObjLi) ); Aig_ObjCreatePo( pNew, pObj ); } Aig_ManCleanup( pNew ); @@ -566,10 +567,10 @@ p->timeCnf += clock() - clk; // iterate the interpolation procedure for ( i = 0; ; i++ ) { - if ( p->nFrames + i >= 100 ) + if ( p->nFrames + i >= 75 ) { if ( fVerbose ) - printf( "Reached limit (%d) on the number of timeframes.\n", 100 ); + printf( "Reached limit (%d) on the number of timeframes.\n", 75 ); p->timeTotal = clock() - clkTotal; Saig_ManagerFree( p ); return -1; diff --git a/src/base/abc/1.txt b/src/base/abc/1.txt deleted file mode 100644 index c0765c2b..00000000 --- a/src/base/abc/1.txt +++ /dev/null @@ -1,21 +0,0 @@ -Comparing files abcDfs.c and C:\_PROJECTS\AARON\FRETIME\SRC\BASE\ABC\ABCDFS.C -***** abcDfs.c - return pNode->Level; - assert( Abc_ObjIsNode( pNode ) ); - // if this node is already visited, return -***** C:\_PROJECTS\AARON\FRETIME\SRC\BASE\ABC\ABCDFS.C - return pNode->Level; - assert( Abc_ObjIsNode( pNode ) || pNode->Type == ABC_OBJ_CONST1); - // if this node is already visited, return -***** - -***** abcDfs.c - return pNode->Level; - assert( Abc_ObjIsNode( pNode ) ); - // if this node is already visited, return -***** C:\_PROJECTS\AARON\FRETIME\SRC\BASE\ABC\ABCDFS.C - return pNode->Level; - assert( Abc_ObjIsNode( pNode ) || pNode->Type == ABC_OBJ_CONST1); - // if this node is already visited, return -***** - diff --git a/src/base/abc/abcBlifMv.c b/src/base/abc/abcBlifMv.c index 428fc6af..f945696e 100644 --- a/src/base/abc/abcBlifMv.c +++ b/src/base/abc/abcBlifMv.c @@ -135,6 +135,7 @@ static inline int Abc_StringGetNumber( char ** ppStr ) ***********************************************************************/ int Abc_NodeStrashBlifMv( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj ) { + int fAddFreeVars = 1; char * pSop; Abc_Obj_t ** pValues, ** pValuesF, ** pValuesF2; Abc_Obj_t * pTemp, * pTemp2, * pFanin, * pFanin2, * pNet; @@ -168,7 +169,17 @@ int Abc_NodeStrashBlifMv( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pObj ) else Index = Abc_StringGetNumber( &pSop ); assert( Index < nValues ); - pValues[Index] = Abc_AigConst1(pNtkNew); + //////////////////////////////////////////// + // adding free variables for binary ND-constants + if ( fAddFreeVars && nValues == 2 && *pSop == '-' ) + { + pValues[1] = Abc_NtkCreatePi(pNtkNew); + pValues[0] = Abc_ObjNot( pValues[1] ); + Abc_ObjAssignName( pValues[1], "free_var_", Abc_ObjName(pValues[1]) ); + } + else + pValues[Index] = Abc_AigConst1(pNtkNew); + //////////////////////////////////////////// // save the values in the fanout net pNet->pCopy = (Abc_Obj_t *)pValues; return 1; @@ -414,7 +425,10 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) for ( v = 0; v < nValues; v++ ) { pValues[v] = Abc_NtkCreatePi( pNtkNew ); - Abc_NtkConvertAssignName( pValues[v], pNet, v ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pValues[v], Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pValues[v], pNet, v ); } // save the values in the fanout net pNet->pCopy = (Abc_Obj_t *)pValues; @@ -432,7 +446,10 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) for ( v = 0; v < nValues; v++ ) { pValues[v] = Abc_NtkCreateBo( pNtkNew ); - Abc_NtkConvertAssignName( pValues[v], pNet, v ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pValues[v], Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pValues[v], pNet, v ); nCount1++; } // save the values in the fanout net @@ -455,7 +472,10 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) for ( k = 0; k < nBits; k++ ) { pBits[k] = Abc_NtkCreatePi( pNtkNew ); - Abc_NtkConvertAssignName( pBits[k], pNet, k ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pBits[k], Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pBits[k], pNet, k ); } // encode the values for ( v = 0; v < nValues; v++ ) @@ -484,7 +504,10 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) for ( k = 0; k < nBits; k++ ) { pBits[k] = Abc_NtkCreateBo( pNtkNew ); - Abc_NtkConvertAssignName( pBits[k], pNet, k ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pBits[k], Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pBits[k], pNet, k ); nCount1++; } // encode the values @@ -522,16 +545,19 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) continue; pNet = Abc_ObjFanin0(pObj); // skip marked nets - if ( Abc_NodeIsTravIdCurrent(pNet) ) - continue; - Abc_NodeSetTravIdCurrent( pNet ); +// if ( Abc_NodeIsTravIdCurrent(pNet) ) +// continue; +// Abc_NodeSetTravIdCurrent( pNet ); nValues = Abc_ObjMvVarNum(pNet); pValues = (Abc_Obj_t **)pNet->pCopy; for ( v = 0; v < nValues; v++ ) { pTemp = Abc_NtkCreatePo( pNtkNew ); Abc_ObjAddFanin( pTemp, pValues[v] ); - Abc_NtkConvertAssignName( pTemp, pNet, v ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pTemp, Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pTemp, pNet, v ); } } Abc_NtkForEachCo( pNtk, pObj, i ) @@ -540,21 +566,24 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) continue; pNet = Abc_ObjFanin0(pObj); // skip marked nets - if ( Abc_NodeIsTravIdCurrent(pNet) ) - continue; - Abc_NodeSetTravIdCurrent( pNet ); +// if ( Abc_NodeIsTravIdCurrent(pNet) ) +// continue; +// Abc_NodeSetTravIdCurrent( pNet ); nValues = Abc_ObjMvVarNum(pNet); pValues = (Abc_Obj_t **)pNet->pCopy; for ( v = 0; v < nValues; v++ ) { pTemp = Abc_NtkCreateBi( pNtkNew ); Abc_ObjAddFanin( pTemp, pValues[v] ); - Abc_NtkConvertAssignName( pTemp, pNet, v ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pTemp, Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pTemp, pNet, v ); nCount2++; } } } - else + else // if ( fPositional == 0 ) { Abc_NtkForEachCo( pNtk, pObj, i ) { @@ -562,9 +591,9 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) continue; pNet = Abc_ObjFanin0(pObj); // skip marked nets - if ( Abc_NodeIsTravIdCurrent(pNet) ) - continue; - Abc_NodeSetTravIdCurrent( pNet ); +// if ( Abc_NodeIsTravIdCurrent(pNet) ) +// continue; +// Abc_NodeSetTravIdCurrent( pNet ); nValues = Abc_ObjMvVarNum(pNet); pValues = (Abc_Obj_t **)pNet->pCopy; nBits = Extra_Base2Log( nValues ); @@ -576,7 +605,10 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) pBit = Abc_AigOr( pNtkNew->pManFunc, pBit, pValues[v] ); pTemp = Abc_NtkCreatePo( pNtkNew ); Abc_ObjAddFanin( pTemp, pBit ); - Abc_NtkConvertAssignName( pTemp, pNet, k ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pTemp, Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pTemp, pNet, k ); } } Abc_NtkForEachCo( pNtk, pObj, i ) @@ -585,9 +617,9 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) continue; pNet = Abc_ObjFanin0(pObj); // skip marked nets - if ( Abc_NodeIsTravIdCurrent(pNet) ) - continue; - Abc_NodeSetTravIdCurrent( pNet ); +// if ( Abc_NodeIsTravIdCurrent(pNet) ) +// continue; +// Abc_NodeSetTravIdCurrent( pNet ); nValues = Abc_ObjMvVarNum(pNet); pValues = (Abc_Obj_t **)pNet->pCopy; nBits = Extra_Base2Log( nValues ); @@ -599,7 +631,10 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) pBit = Abc_AigOr( pNtkNew->pManFunc, pBit, pValues[v] ); pTemp = Abc_NtkCreateBi( pNtkNew ); Abc_ObjAddFanin( pTemp, pBit ); - Abc_NtkConvertAssignName( pTemp, pNet, k ); + if ( nValuesMax == 2 ) + Abc_ObjAssignName( pTemp, Abc_ObjName(pNet), NULL ); + else + Abc_NtkConvertAssignName( pTemp, pNet, k ); nCount2++; } } @@ -607,8 +642,32 @@ Abc_Ntk_t * Abc_NtkStrashBlifMv( Abc_Ntk_t * pNtk ) if ( Abc_NtkLatchNum(pNtk) ) { + Vec_Ptr_t * vTemp; Abc_Obj_t * pLatch, * pObjLi, * pObjLo; int i; + // move free vars to the front among the PIs + vTemp = Vec_PtrAlloc( Vec_PtrSize(pNtkNew->vPis) ); + Abc_NtkForEachPi( pNtkNew, pObj, i ) + if ( strncmp( Abc_ObjName(pObj), "free_var_", 9 ) == 0 ) + Vec_PtrPush( vTemp, pObj ); + Abc_NtkForEachPi( pNtkNew, pObj, i ) + if ( strncmp( Abc_ObjName(pObj), "free_var_", 9 ) != 0 ) + Vec_PtrPush( vTemp, pObj ); + assert( Vec_PtrSize(vTemp) == Vec_PtrSize(pNtkNew->vPis) ); + Vec_PtrFree( pNtkNew->vPis ); + pNtkNew->vPis = vTemp; + // move free vars to the front among the CIs + vTemp = Vec_PtrAlloc( Vec_PtrSize(pNtkNew->vCis) ); + Abc_NtkForEachCi( pNtkNew, pObj, i ) + if ( strncmp( Abc_ObjName(pObj), "free_var_", 9 ) == 0 ) + Vec_PtrPush( vTemp, pObj ); + Abc_NtkForEachCi( pNtkNew, pObj, i ) + if ( strncmp( Abc_ObjName(pObj), "free_var_", 9 ) != 0 ) + Vec_PtrPush( vTemp, pObj ); + assert( Vec_PtrSize(vTemp) == Vec_PtrSize(pNtkNew->vCis) ); + Vec_PtrFree( pNtkNew->vCis ); + pNtkNew->vCis = vTemp; + // create registers assert( nCount1 == nCount2 ); for ( i = 0; i < nCount1; i++ ) { diff --git a/src/base/abc/abcBlifMv.zip b/src/base/abc/abcBlifMv.zip Binary files differnew file mode 100644 index 00000000..4a4d080a --- /dev/null +++ b/src/base/abc/abcBlifMv.zip diff --git a/src/base/abc/abcFanio.c b/src/base/abc/abcFanio.c index c8536695..9f60b0bc 100644 --- a/src/base/abc/abcFanio.c +++ b/src/base/abc/abcFanio.c @@ -92,6 +92,10 @@ void Abc_ObjAddFanin( Abc_Obj_t * pObj, Abc_Obj_t * pFanin ) { int x = 0; } + if ( pObj->Id == 1960 ) + { + int x = 0; + } // printf( "Adding fanin of %s ", Abc_ObjName(pObj) ); // printf( "to be %s\n", Abc_ObjName(pFanin) ); } diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 151e9ddc..0437f8a9 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -13915,34 +13915,24 @@ usage: ***********************************************************************/ int Abc_CommandDSec( Abc_Frame_t * pAbc, int argc, char ** argv ) { + Fra_Sec_t SecPar, * pSecPar = &SecPar; FILE * pOut, * pErr; Abc_Ntk_t * pNtk, * pNtk1, * pNtk2; int fDelete1, fDelete2; char ** pArgvNew; int nArgcNew; - int nFrames; - int fPhaseAbstract; - int fRetimeFirst; - int fRetimeRegs; - int fFraiging; - int fVerbose; - int fVeryVerbose; int c; - extern int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nFrames, int fPhaseAbstract, int fRetimeFirst, int fRetimeRegs, int fFraiging, int fVerbose, int fVeryVerbose ); + extern void Fra_SecSetDefaultParams( Fra_Sec_t * p ); + extern int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Fra_Sec_t * p ); pNtk = Abc_FrameReadNtk(pAbc); pOut = Abc_FrameReadOut(pAbc); pErr = Abc_FrameReadErr(pAbc); // set defaults - nFrames = 2; - fPhaseAbstract = 1; - fRetimeFirst = 1; - fRetimeRegs = 1; - fFraiging = 1; - fVerbose = 0; - fVeryVerbose = 0; + Fra_SecSetDefaultParams( pSecPar ); + pSecPar->TimeLimit = 300; Extra_UtilGetoptReset(); while ( ( c = Extra_UtilGetopt( argc, argv, "Farmfwvh" ) ) != EOF ) { @@ -13954,28 +13944,28 @@ int Abc_CommandDSec( Abc_Frame_t * pAbc, int argc, char ** argv ) fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); goto usage; } - nFrames = atoi(argv[globalUtilOptind]); + pSecPar->nFramesMax = atoi(argv[globalUtilOptind]); globalUtilOptind++; - if ( nFrames < 0 ) + if ( pSecPar->nFramesMax < 0 ) goto usage; break; case 'a': - fPhaseAbstract ^= 1; + pSecPar->fPhaseAbstract ^= 1; break; case 'r': - fRetimeFirst ^= 1; + pSecPar->fRetimeFirst ^= 1; break; case 'm': - fRetimeRegs ^= 1; + pSecPar->fRetimeRegs ^= 1; break; case 'f': - fFraiging ^= 1; + pSecPar->fFraiging ^= 1; break; case 'w': - fVeryVerbose ^= 1; + pSecPar->fVeryVerbose ^= 1; break; case 'v': - fVerbose ^= 1; + pSecPar->fVerbose ^= 1; break; default: goto usage; @@ -13994,7 +13984,7 @@ int Abc_CommandDSec( Abc_Frame_t * pAbc, int argc, char ** argv ) } // perform verification - Abc_NtkDarSec( pNtk1, pNtk2, nFrames, fPhaseAbstract, fRetimeFirst, fRetimeRegs, fFraiging, fVerbose, fVeryVerbose ); + Abc_NtkDarSec( pNtk1, pNtk2, pSecPar ); if ( fDelete1 ) Abc_NtkDelete( pNtk1 ); if ( fDelete2 ) Abc_NtkDelete( pNtk2 ); @@ -14003,13 +13993,13 @@ int Abc_CommandDSec( Abc_Frame_t * pAbc, int argc, char ** argv ) usage: fprintf( pErr, "usage: dsec [-F num] [-armfwvh] <file1> <file2>\n" ); fprintf( pErr, "\t performs inductive sequential equivalence checking\n" ); - fprintf( pErr, "\t-F num : the limit on the depth of induction [default = %d]\n", nFrames ); - fprintf( pErr, "\t-a : toggles the use of phase abstraction [default = %s]\n", fPhaseAbstract? "yes": "no" ); - fprintf( pErr, "\t-r : toggles forward retiming at the beginning [default = %s]\n", fRetimeFirst? "yes": "no" ); - fprintf( pErr, "\t-m : toggles min-register retiming [default = %s]\n", fRetimeRegs? "yes": "no" ); - fprintf( pErr, "\t-f : toggles the internal use of fraiging [default = %s]\n", fFraiging? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggles additional verbose output [default = %s]\n", fVeryVerbose? "yes": "no" ); + fprintf( pErr, "\t-F num : the limit on the depth of induction [default = %d]\n", pSecPar->nFramesMax ); + fprintf( pErr, "\t-a : toggles the use of phase abstraction [default = %s]\n", pSecPar->fPhaseAbstract? "yes": "no" ); + fprintf( pErr, "\t-r : toggles forward retiming at the beginning [default = %s]\n", pSecPar->fRetimeFirst? "yes": "no" ); + fprintf( pErr, "\t-m : toggles min-register retiming [default = %s]\n", pSecPar->fRetimeRegs? "yes": "no" ); + fprintf( pErr, "\t-f : toggles the internal use of fraiging [default = %s]\n", pSecPar->fFraiging? "yes": "no" ); + fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", pSecPar->fVerbose? "yes": "no" ); + fprintf( pErr, "\t-w : toggles additional verbose output [default = %s]\n", pSecPar->fVeryVerbose? "yes": "no" ); fprintf( pErr, "\t-h : print the command usage\n"); fprintf( pErr, "\tfile1 : (optional) the file with the first network\n"); fprintf( pErr, "\tfile2 : (optional) the file with the second network\n"); @@ -14031,50 +14021,31 @@ usage: ***********************************************************************/ int Abc_CommandDProve( Abc_Frame_t * pAbc, int argc, char ** argv ) { + Fra_Sec_t SecPar, * pSecPar = &SecPar; FILE * pOut, * pErr; Abc_Ntk_t * pNtk; - int fTryComb; - int fTryBmc; - int nFrames; - int fPhaseAbstract; - int fRetimeFirst; - int fRetimeRegs; - int fFraiging; - int fVerbose; - int fVeryVerbose; - int TimeLimit; int c; - extern int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int fTryComb, int fTryBmc, - int nFrames, int fPhaseAbstract, int fRetimeFirst, - int fRetimeRegs, int fFraiging, int fVerbose, - int fVeryVerbose, int TimeLimit ); + extern void Fra_SecSetDefaultParams( Fra_Sec_t * p ); + extern int Abc_NtkDarProve( Abc_Ntk_t * pNtk, Fra_Sec_t * pSecPar ); pNtk = Abc_FrameReadNtk(pAbc); pOut = Abc_FrameReadOut(pAbc); pErr = Abc_FrameReadErr(pAbc); // set defaults - fTryComb = 1; - fTryBmc = 1; - nFrames = 2; - fPhaseAbstract = 1; - fRetimeFirst = 1; - fRetimeRegs = 1; - fFraiging = 1; - fVerbose = 0; - fVeryVerbose = 0; - TimeLimit = 300; + Fra_SecSetDefaultParams( pSecPar ); + pSecPar->TimeLimit = 300; Extra_UtilGetoptReset(); while ( ( c = Extra_UtilGetopt( argc, argv, "cbTFarmfwvh" ) ) != EOF ) { switch ( c ) { case 'c': - fTryComb ^= 1; + pSecPar->fTryComb ^= 1; break; case 'b': - fTryBmc ^= 1; + pSecPar->fTryBmc ^= 1; break; case 'T': if ( globalUtilOptind >= argc ) @@ -14082,9 +14053,9 @@ int Abc_CommandDProve( Abc_Frame_t * pAbc, int argc, char ** argv ) fprintf( pErr, "Command line switch \"-T\" should be followed by an integer.\n" ); goto usage; } - TimeLimit = atoi(argv[globalUtilOptind]); + pSecPar->TimeLimit = atoi(argv[globalUtilOptind]); globalUtilOptind++; - if ( TimeLimit < 0 ) + if ( pSecPar->TimeLimit < 0 ) goto usage; break; case 'F': @@ -14093,40 +14064,34 @@ int Abc_CommandDProve( Abc_Frame_t * pAbc, int argc, char ** argv ) fprintf( pErr, "Command line switch \"-F\" should be followed by an integer.\n" ); goto usage; } - nFrames = atoi(argv[globalUtilOptind]); + pSecPar->nFramesMax = atoi(argv[globalUtilOptind]); globalUtilOptind++; - if ( nFrames < 0 ) + if ( pSecPar->nFramesMax < 0 ) goto usage; break; case 'a': - fPhaseAbstract ^= 1; + pSecPar->fPhaseAbstract ^= 1; break; case 'r': - fRetimeFirst ^= 1; + pSecPar->fRetimeFirst ^= 1; break; case 'm': - fRetimeRegs ^= 1; + pSecPar->fRetimeRegs ^= 1; break; case 'f': - fFraiging ^= 1; + pSecPar->fFraiging ^= 1; break; case 'w': - fVeryVerbose ^= 1; + pSecPar->fVeryVerbose ^= 1; break; case 'v': - fVerbose ^= 1; + pSecPar->fVerbose ^= 1; break; default: goto usage; } } - if ( Abc_NtkLatchNum(pNtk) == 0 ) - { - printf( "The network has no latches. Running combinational command \"iprove\".\n" ); - Cmd_CommandExecute( pAbc, "orpos; st; iprove" ); - return 0; - } if ( !Abc_NtkIsStrash(pNtk) ) { printf( "This command works only for structrally hashed networks. Run \"st\".\n" ); @@ -14134,22 +14099,22 @@ int Abc_CommandDProve( Abc_Frame_t * pAbc, int argc, char ** argv ) } // perform verification - Abc_NtkDarProve( pNtk, fTryComb, fTryBmc, nFrames, fPhaseAbstract, fRetimeFirst, fRetimeRegs, fFraiging, fVerbose, fVeryVerbose, TimeLimit ); + Abc_NtkDarProve( pNtk, pSecPar ); return 0; usage: fprintf( pErr, "usage: dprove [-F num] [-T num] [-cbarmfwvh]\n" ); fprintf( pErr, "\t performs SEC on the sequential miter\n" ); - fprintf( pErr, "\t-F num : the limit on the depth of induction [default = %d]\n", nFrames ); - fprintf( pErr, "\t-T num : the approximate runtime limit (in seconds) [default = %d]\n", TimeLimit ); - fprintf( pErr, "\t-c : toggles using CEC before attempting SEC [default = %s]\n", fTryComb? "yes": "no" ); - fprintf( pErr, "\t-b : toggles using BMC before attempting SEC [default = %s]\n", fTryBmc? "yes": "no" ); - fprintf( pErr, "\t-a : toggles the use of phase abstraction [default = %s]\n", fPhaseAbstract? "yes": "no" ); - fprintf( pErr, "\t-r : toggles forward retiming at the beginning [default = %s]\n", fRetimeFirst? "yes": "no" ); - fprintf( pErr, "\t-m : toggles min-register retiming [default = %s]\n", fRetimeRegs? "yes": "no" ); - fprintf( pErr, "\t-f : toggles the internal use of fraiging [default = %s]\n", fFraiging? "yes": "no" ); - fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( pErr, "\t-w : toggles additional verbose output [default = %s]\n", fVeryVerbose? "yes": "no" ); + fprintf( pErr, "\t-F num : the limit on the depth of induction [default = %d]\n", pSecPar->nFramesMax ); + fprintf( pErr, "\t-T num : the approximate runtime limit (in seconds) [default = %d]\n", pSecPar->TimeLimit ); + fprintf( pErr, "\t-c : toggles using CEC before attempting SEC [default = %s]\n", pSecPar->fTryComb? "yes": "no" ); + fprintf( pErr, "\t-b : toggles using BMC before attempting SEC [default = %s]\n", pSecPar->fTryBmc? "yes": "no" ); + fprintf( pErr, "\t-a : toggles the use of phase abstraction [default = %s]\n", pSecPar->fPhaseAbstract? "yes": "no" ); + fprintf( pErr, "\t-r : toggles forward retiming at the beginning [default = %s]\n", pSecPar->fRetimeFirst? "yes": "no" ); + fprintf( pErr, "\t-m : toggles min-register retiming [default = %s]\n", pSecPar->fRetimeRegs? "yes": "no" ); + fprintf( pErr, "\t-f : toggles the internal use of fraiging [default = %s]\n", pSecPar->fFraiging? "yes": "no" ); + fprintf( pErr, "\t-v : toggles verbose output [default = %s]\n", pSecPar->fVerbose? "yes": "no" ); + fprintf( pErr, "\t-w : toggles additional verbose output [default = %s]\n", pSecPar->fVeryVerbose? "yes": "no" ); fprintf( pErr, "\t-h : print the command usage\n"); return 1; } @@ -17575,29 +17540,22 @@ usage: ***********************************************************************/ int Abc_CommandAbc8DSec( Abc_Frame_t * pAbc, int argc, char ** argv ) { + Fra_Sec_t SecPar, * pSecPar = &SecPar; Aig_Man_t * pAig; char ** pArgvNew; int nArgcNew; - int nFrames; - int fPhaseAbstract; - int fRetimeFirst; - int fRetimeRegs; - int fFraiging; - int fVerbose; - int fVeryVerbose; int c; - extern int Fra_FraigSec( Aig_Man_t * p, int nFramesMax, int fPhaseAbstract, int fRetimeFirst, int fRetimeRegs, int fFraiging, int fVerbose, int fVeryVerbose, int TimeLimit ); + extern void Fra_SecSetDefaultParams( Fra_Sec_t * pSecPar ); + extern int Fra_FraigSec( Aig_Man_t * p, Fra_Sec_t * pSecPar ); extern Aig_Man_t * Ntl_ManPrepareSec( char * pFileName1, char * pFileName2 ); // set defaults - nFrames = 2; - fPhaseAbstract = 0; - fRetimeFirst = 0; - fRetimeRegs = 0; - fFraiging = 1; - fVerbose = 0; - fVeryVerbose = 0; + Fra_SecSetDefaultParams( pSecPar ); + pSecPar->nFramesMax = 2; + pSecPar->fPhaseAbstract = 0; + pSecPar->fRetimeFirst = 0; + pSecPar->fRetimeRegs = 0; Extra_UtilGetoptReset(); while ( ( c = Extra_UtilGetopt( argc, argv, "Farmfwvh" ) ) != EOF ) { @@ -17609,28 +17567,28 @@ int Abc_CommandAbc8DSec( Abc_Frame_t * pAbc, int argc, char ** argv ) fprintf( stdout, "Command line switch \"-F\" should be followed by an integer.\n" ); goto usage; } - nFrames = atoi(argv[globalUtilOptind]); + pSecPar->nFramesMax = atoi(argv[globalUtilOptind]); globalUtilOptind++; - if ( nFrames < 0 ) + if ( pSecPar->nFramesMax < 0 ) goto usage; break; case 'a': - fPhaseAbstract ^= 1; + pSecPar->fPhaseAbstract ^= 1; break; case 'r': - fRetimeFirst ^= 1; + pSecPar->fRetimeFirst ^= 1; break; case 'm': - fRetimeRegs ^= 1; + pSecPar->fRetimeRegs ^= 1; break; case 'f': - fFraiging ^= 1; + pSecPar->fFraiging ^= 1; break; case 'w': - fVeryVerbose ^= 1; + pSecPar->fVeryVerbose ^= 1; break; case 'v': - fVerbose ^= 1; + pSecPar->fVerbose ^= 1; break; default: goto usage; @@ -17648,20 +17606,20 @@ int Abc_CommandAbc8DSec( Abc_Frame_t * pAbc, int argc, char ** argv ) pAig = Ntl_ManPrepareSec( pArgvNew[0], pArgvNew[1] ); if ( pAig == NULL ) return 0; - Fra_FraigSec( pAig, nFrames, fPhaseAbstract, fRetimeFirst, fRetimeRegs, fFraiging, fVerbose, fVeryVerbose, 0 ); + Fra_FraigSec( pAig, pSecPar ); Aig_ManStop( pAig ); return 0; usage: fprintf( stdout, "usage: *dsec [-F num] [-armfwvh] <file1> <file2>\n" ); fprintf( stdout, "\t performs sequential equivalence checking for two designs\n" ); - fprintf( stdout, "\t-F num : the limit on the depth of induction [default = %d]\n", nFrames ); - fprintf( stdout, "\t-a : toggles the use of phase abstraction [default = %s]\n", fPhaseAbstract? "yes": "no" ); - fprintf( stdout, "\t-r : toggles forward retiming at the beginning [default = %s]\n", fRetimeFirst? "yes": "no" ); - fprintf( stdout, "\t-m : toggles min-register retiming [default = %s]\n", fRetimeRegs? "yes": "no" ); - fprintf( stdout, "\t-f : toggles the internal use of fraiging [default = %s]\n", fFraiging? "yes": "no" ); - fprintf( stdout, "\t-v : toggles verbose output [default = %s]\n", fVerbose? "yes": "no" ); - fprintf( stdout, "\t-w : toggles additional verbose output [default = %s]\n", fVeryVerbose? "yes": "no" ); + fprintf( stdout, "\t-F num : the limit on the depth of induction [default = %d]\n", pSecPar->nFramesMax ); + fprintf( stdout, "\t-a : toggles the use of phase abstraction [default = %s]\n", pSecPar->fPhaseAbstract? "yes": "no" ); + fprintf( stdout, "\t-r : toggles forward retiming at the beginning [default = %s]\n", pSecPar->fRetimeFirst? "yes": "no" ); + fprintf( stdout, "\t-m : toggles min-register retiming [default = %s]\n", pSecPar->fRetimeRegs? "yes": "no" ); + fprintf( stdout, "\t-f : toggles the internal use of fraiging [default = %s]\n", pSecPar->fFraiging? "yes": "no" ); + fprintf( stdout, "\t-v : toggles verbose output [default = %s]\n", pSecPar->fVerbose? "yes": "no" ); + fprintf( stdout, "\t-w : toggles additional verbose output [default = %s]\n", pSecPar->fVeryVerbose? "yes": "no" ); fprintf( stdout, "\t-h : print the command usage\n"); fprintf( stdout, "\tfile1 : the file with the first design\n"); fprintf( stdout, "\tfile2 : the file with the second design\n"); diff --git a/src/base/abci/abcDar.c b/src/base/abci/abcDar.c index 13683e4f..7b7617e6 100644 --- a/src/base/abci/abcDar.c +++ b/src/base/abci/abcDar.c @@ -1229,7 +1229,7 @@ int Abc_NtkDarBmc( Abc_Ntk_t * pNtk, int nFrames, int nSizeMax, int nBTLimit, in RetValue = Saig_ManBmcSimple( pMan, nFrames, nSizeMax, nBTLimit, fRewrite, fVerbose, &iFrame ); pNtk->pSeqModel = pMan->pSeqModel; pMan->pSeqModel = NULL; if ( RetValue == 1 ) - printf( "No output was asserted in %d frames. ", nFrames ); + printf( "No output was asserted in %d frames. ", iFrame ); else if ( RetValue == -1 ) printf( "No output was asserted in %d frames. Reached conflict limit (%d). ", iFrame, nBTLimit ); else // if ( RetValue == 0 ) @@ -1309,15 +1309,17 @@ PRT( "Time", clock() - clk ); SeeAlso [] ***********************************************************************/ -int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int fTryComb, int fTryBmc, int nFrames, int fPhaseAbstract, int fRetimeFirst, int fRetimeRegs, int fFraiging, int fVerbose, int fVeryVerbose, int TimeLimit ) +int Abc_NtkDarProve( Abc_Ntk_t * pNtk, Fra_Sec_t * pSecPar ) { Aig_Man_t * pMan; - int RetValue; - if ( fTryComb ) + int RetValue, clkTotal = clock(); + if ( pSecPar->fTryComb || Abc_NtkLatchNum(pNtk) == 0 ) { Prove_Params_t Params, * pParams = &Params; Abc_Ntk_t * pNtkComb; int RetValue, clk = clock(); + if ( Abc_NtkLatchNum(pNtk) == 0 ) + printf( "The network has no latches. Running CEC.\n" ); // create combinational network pNtkComb = Abc_NtkDup( pNtk ); Abc_NtkMakeComb( pNtkComb, 1 ); @@ -1332,14 +1334,27 @@ int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int fTryComb, int fTryBmc, int nFrames, i { printf( "Networks are equivalent after CEC. " ); PRT( "Time", clock() - clk ); + if ( pSecPar->fReportSolution ) + { + printf( "SOLUTION: PASS " ); + PRT( "Time", clock() - clkTotal ); + } return RetValue; } } - if ( fTryBmc ) + if ( pSecPar->fTryBmc ) { - RetValue = Abc_NtkDarBmc( pNtk, 20, 100000, 1000, 0, 1, 0 ); + RetValue = Abc_NtkDarBmc( pNtk, 20, 100000, 2000, 0, 1, 0 ); if ( RetValue == 0 ) + { + printf( "Networks are not equivalent.\n" ); + if ( pSecPar->fReportSolution ) + { + printf( "SOLUTION: FAIL " ); + PRT( "Time", clock() - clkTotal ); + } return RetValue; + } } // derive the AIG manager pMan = Abc_NtkToDar( pNtk, 0, 1 ); @@ -1350,7 +1365,7 @@ int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int fTryComb, int fTryBmc, int nFrames, i } assert( pMan->nRegs > 0 ); // perform verification - RetValue = Fra_FraigSec( pMan, nFrames, fPhaseAbstract, fRetimeFirst, fRetimeRegs, fFraiging, fVerbose, fVeryVerbose, TimeLimit ); + RetValue = Fra_FraigSec( pMan, pSecPar ); pNtk->pSeqModel = pMan->pSeqModel; pMan->pSeqModel = NULL; if ( pNtk->pSeqModel ) { @@ -1372,7 +1387,7 @@ int Abc_NtkDarProve( Abc_Ntk_t * pNtk, int fTryComb, int fTryBmc, int nFrames, i SeeAlso [] ***********************************************************************/ -int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nFrames, int fPhaseAbstract, int fRetimeFirst, int fRetimeRegs, int fFraiging, int fVerbose, int fVeryVerbose ) +int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Fra_Sec_t * pSecPar ) { // Fraig_Params_t Params; Aig_Man_t * pMan; @@ -1392,8 +1407,8 @@ int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nFrames, int fPhase extern void Abc_NtkVerifyReportErrorSeq( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int * pModel, int nFrames ); printf( "Networks are NOT EQUIVALENT after structural hashing.\n" ); // report the error - pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, nFrames ); - Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, pMiter->pModel, nFrames ); + pMiter->pModel = Abc_NtkVerifyGetCleanModel( pMiter, pSecPar->nFramesMax ); + Abc_NtkVerifyReportErrorSeq( pNtk1, pNtk2, pMiter->pModel, pSecPar->nFramesMax ); FREE( pMiter->pModel ); Abc_NtkDelete( pMiter ); return 0; @@ -1444,7 +1459,7 @@ int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nFrames, int fPhase assert( pMan->nRegs > 0 ); // perform verification - RetValue = Fra_FraigSec( pMan, nFrames, fPhaseAbstract, fRetimeFirst, fRetimeRegs, fFraiging, fVerbose, fVeryVerbose, 0 ); + RetValue = Fra_FraigSec( pMan, pSecPar ); Aig_ManStop( pMan ); return RetValue; } diff --git a/src/base/io/io.c b/src/base/io/io.c index 6efa8b67..7538e31c 100644 --- a/src/base/io/io.c +++ b/src/base/io/io.c @@ -683,7 +683,7 @@ int IoCommandReadInit( Abc_Frame_t * pAbc, int argc, char ** argv ) goto usage; } } - if ( argc != globalUtilOptind + 1 ) + if ( argc != globalUtilOptind && argc != globalUtilOptind + 1 ) goto usage; if ( pNtk == NULL ) @@ -692,7 +692,16 @@ int IoCommandReadInit( Abc_Frame_t * pAbc, int argc, char ** argv ) return 1; } // get the input file name - pFileName = argv[globalUtilOptind]; + if ( argc == globalUtilOptind + 1 ) + pFileName = argv[globalUtilOptind]; + else if ( pNtk->pSpec ) + pFileName = Extra_FileNameGenericAppend( pNtk->pSpec, ".init" ); + else + { + printf( "File name should be given on the command line.\n" ); + return 1; + } + // read the file using the corresponding file reader pNtk = Abc_NtkDup( pNtk ); Io_ReadBenchInit( pNtk, pFileName ); diff --git a/src/misc/extra/extraUtilFile.c b/src/misc/extra/extraUtilFile.c index 243f3457..44dff1e0 100644 --- a/src/misc/extra/extraUtilFile.c +++ b/src/misc/extra/extraUtilFile.c @@ -160,20 +160,10 @@ char * Extra_FileNameAppend( char * pBase, char * pSuffix ) ***********************************************************************/ char * Extra_FileNameGeneric( char * FileName ) { - char * pDot; - char * pUnd; - char * pRes; - - // find the generic name of the file + char * pDot, * pRes; pRes = Extra_UtilStrsav( FileName ); - // find the pointer to the "." symbol in the file name -// pUnd = strstr( FileName, "_" ); - pUnd = NULL; - pDot = strstr( FileName, "." ); - if ( pUnd ) - pRes[pUnd - FileName] = 0; - else if ( pDot ) - pRes[pDot - FileName] = 0; + if ( (pDot = strrchr( pRes, '.' )) ) + *pDot = 0; return pRes; } @@ -193,8 +183,7 @@ char * Extra_FileNameGenericAppend( char * pBase, char * pSuffix ) static char Buffer[1000]; char * pDot; strcpy( Buffer, pBase ); - pDot = strstr( Buffer, "." ); - if ( pDot ) + if ( (pDot = strrchr( Buffer, '.' )) ) *pDot = 0; strcat( Buffer, pSuffix ); return Buffer; diff --git a/src/sat/bsat/satSolver.c b/src/sat/bsat/satSolver.c index 6d517b8e..0179796c 100644 --- a/src/sat/bsat/satSolver.c +++ b/src/sat/bsat/satSolver.c @@ -789,7 +789,7 @@ clause* sat_solver_propagate(sat_solver* s) return confl; } -static inline int clause_cmp (const void* x, const void* y) { +static int clause_cmp (const void* x, const void* y) { return clause_size((clause*)x) > 2 && (clause_size((clause*)y) == 2 || clause_activity((clause*)x) < clause_activity((clause*)y)) ? -1 : 1; } void sat_solver_reducedb(sat_solver* s) |