mirror of https://github.com/YosysHQ/abc.git
Adding command 'glitch' for glitch simulation.
This commit is contained in:
parent
fc904409c3
commit
d850599020
|
|
@ -37,7 +37,7 @@ struct Gli_Obj_t_
|
|||
unsigned nFanins : 3; // the number of fanins
|
||||
unsigned nFanouts : 25; // total number of fanouts
|
||||
unsigned Handle; // ID of the node
|
||||
unsigned uTruth[2]; // truth table of the node
|
||||
word * pTruth; // truth table of the node
|
||||
unsigned uSimInfo; // simulation info of the node
|
||||
union
|
||||
{
|
||||
|
|
@ -333,7 +333,7 @@ static inline int Gli_NodeComputeValue( Gli_Obj_t * pNode )
|
|||
int i, Phase = 0;
|
||||
for ( i = 0; i < (int)pNode->nFanins; i++ )
|
||||
Phase |= (Gli_ObjFanin(pNode, i)->fPhase << i);
|
||||
return Abc_InfoHasBit( pNode->uTruth, Phase );
|
||||
return Abc_InfoHasBit( (unsigned *)pNode->pTruth, Phase );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -352,7 +352,7 @@ static inline int Gli_NodeComputeValue2( Gli_Obj_t * pNode )
|
|||
int i, Phase = 0;
|
||||
for ( i = 0; i < (int)pNode->nFanins; i++ )
|
||||
Phase |= (Gli_ObjFanin(pNode, i)->fPhase2 << i);
|
||||
return Abc_InfoHasBit( pNode->uTruth, Phase );
|
||||
return Abc_InfoHasBit( (unsigned *)pNode->pTruth, Phase );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -366,16 +366,15 @@ static inline int Gli_NodeComputeValue2( Gli_Obj_t * pNode )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Gli_ManCreateNode( Gli_Man_t * p, Vec_Int_t * vFanins, int nFanouts, unsigned * puTruth )
|
||||
int Gli_ManCreateNode( Gli_Man_t * p, Vec_Int_t * vFanins, int nFanouts, word * pGateTruth )
|
||||
{
|
||||
Gli_Obj_t * pObj, * pFanin;
|
||||
int i;
|
||||
assert( Vec_IntSize(vFanins) <= 6 );
|
||||
assert( Vec_IntSize(vFanins) <= 16 );
|
||||
pObj = Gli_ObjAlloc( p, Vec_IntSize(vFanins), nFanouts );
|
||||
Gli_ManForEachEntry( vFanins, p, pFanin, i )
|
||||
Gli_ObjAddFanin( pObj, pFanin );
|
||||
pObj->uTruth[0] = puTruth[0];
|
||||
pObj->uTruth[1] = puTruth[Vec_IntSize(vFanins) == 6];
|
||||
pObj->pTruth = pGateTruth;
|
||||
pObj->fPhase = pObj->fPhase2 = Gli_NodeComputeValue( pObj );
|
||||
return pObj->Handle;
|
||||
}
|
||||
|
|
@ -584,7 +583,7 @@ unsigned Gli_ManSimulateSeqNode( Gli_Man_t * p, Gli_Obj_t * pNode )
|
|||
int nFanins = Gli_ObjFaninNum(pNode);
|
||||
int i, k, Phase;
|
||||
Gli_Obj_t * pFanin;
|
||||
assert( nFanins <= 6 );
|
||||
assert( nFanins <= 16 );
|
||||
Gli_ObjForEachFanin( pNode, pFanin, i )
|
||||
pSimInfos[i] = pFanin->uSimInfo;
|
||||
for ( i = 0; i < 32; i++ )
|
||||
|
|
@ -593,7 +592,7 @@ unsigned Gli_ManSimulateSeqNode( Gli_Man_t * p, Gli_Obj_t * pNode )
|
|||
for ( k = 0; k < nFanins; k++ )
|
||||
if ( (pSimInfos[k] >> i) & 1 )
|
||||
Phase |= (1 << k);
|
||||
if ( Abc_InfoHasBit( pNode->uTruth, Phase ) )
|
||||
if ( Abc_InfoHasBit( (unsigned *)pNode->pTruth, Phase ) )
|
||||
Result |= (1 << i);
|
||||
}
|
||||
return Result;
|
||||
|
|
@ -772,7 +771,7 @@ void Gli_ManSwitchesAndGlitches( Gli_Man_t * p, int nPatterns, float PiTransProb
|
|||
}
|
||||
if ( fVerbose )
|
||||
{
|
||||
printf( "\nSimulated %d patterns. ", nPatterns );
|
||||
printf( "Simulated %d patterns. Input transition probability %.2f. ", nPatterns, PiTransProb );
|
||||
ABC_PRMn( "Memory", 4*p->nObjData );
|
||||
ABC_PRT( "Time", Abc_Clock() - clk );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -825,6 +825,7 @@ extern ABC_DLL void Abc_NtkDontCareFree( Odc_Man_t * p );
|
|||
extern ABC_DLL int Abc_NtkDontCareCompute( Odc_Man_t * p, Abc_Obj_t * pNode, Vec_Ptr_t * vLeaves, unsigned * puTruth );
|
||||
/*=== abcPrint.c ==========================================================*/
|
||||
extern ABC_DLL float Abc_NtkMfsTotalSwitching( Abc_Ntk_t * pNtk );
|
||||
extern ABC_DLL float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk, int nPats, int Prob, int fVerbose );
|
||||
extern ABC_DLL void Abc_NtkPrintStats( Abc_Ntk_t * pNtk, int fFactored, int fSaveBest, int fDumpResult, int fUseLutLib, int fPrintMuxes, int fPower, int fGlitch, int fSkipBuf, int fSkipSmall, int fPrintMem );
|
||||
extern ABC_DLL void Abc_NtkPrintIo( FILE * pFile, Abc_Ntk_t * pNtk, int fPrintFlops );
|
||||
extern ABC_DLL void Abc_NtkPrintLatch( FILE * pFile, Abc_Ntk_t * pNtk );
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ static int Abc_CommandMfs ( Abc_Frame_t * pAbc, int argc, cha
|
|||
static int Abc_CommandMfs2 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandMfs3 ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandTrace ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandGlitch ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandSpeedup ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandPowerdown ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandAddBuffs ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
|
|
@ -772,6 +773,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
|
|||
Cmd_CommandAdd( pAbc, "Synthesis", "mfs2", Abc_CommandMfs2, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Synthesis", "mfs3", Abc_CommandMfs3, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Synthesis", "trace", Abc_CommandTrace, 0 );
|
||||
Cmd_CommandAdd( pAbc, "Synthesis", "glitch", Abc_CommandGlitch, 0 );
|
||||
Cmd_CommandAdd( pAbc, "Synthesis", "speedup", Abc_CommandSpeedup, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Synthesis", "powerdown", Abc_CommandPowerdown, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Synthesis", "addbuffs", Abc_CommandAddBuffs, 1 );
|
||||
|
|
@ -5707,6 +5709,88 @@ usage:
|
|||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Abc_CommandGlitch( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||
{
|
||||
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
|
||||
int nPats = 4000;
|
||||
int Prob = 8;
|
||||
int fVerbose = 1;
|
||||
int c;
|
||||
|
||||
// set defaults
|
||||
Extra_UtilGetoptReset();
|
||||
while ( ( c = Extra_UtilGetopt( argc, argv, "NPvh" ) ) != EOF )
|
||||
{
|
||||
switch ( c )
|
||||
{
|
||||
case 'N':
|
||||
if ( globalUtilOptind >= argc )
|
||||
{
|
||||
Abc_Print( -1, "Command line switch \"-N\" should be followed by an integer.\n" );
|
||||
goto usage;
|
||||
}
|
||||
nPats = atoi(argv[globalUtilOptind]);
|
||||
globalUtilOptind++;
|
||||
if ( nPats < 1 )
|
||||
goto usage;
|
||||
break;
|
||||
case 'P':
|
||||
if ( globalUtilOptind >= argc )
|
||||
{
|
||||
Abc_Print( -1, "Command line switch \"-P\" should be followed by an integer.\n" );
|
||||
goto usage;
|
||||
}
|
||||
Prob = atoi(argv[globalUtilOptind]);
|
||||
globalUtilOptind++;
|
||||
if ( Prob < 1 )
|
||||
goto usage;
|
||||
break;
|
||||
case 'v':
|
||||
fVerbose ^= 1;
|
||||
break;
|
||||
case 'h':
|
||||
goto usage;
|
||||
default:
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
if ( pNtk == NULL )
|
||||
{
|
||||
Abc_Print( -1, "Empty network.\n" );
|
||||
return 1;
|
||||
}
|
||||
if ( !Abc_NtkIsLogic(pNtk) )
|
||||
{
|
||||
Abc_Print( -1, "This command can only be applied to a mapped logic network.\n" );
|
||||
return 1;
|
||||
}
|
||||
if ( Abc_NtkIsMappedLogic(pNtk) || Abc_NtkGetFaninMax(pNtk) <= 6 )
|
||||
Abc_Print( 1, "Glitching adds %7.2f %% of signal transitions, compared to switching.\n", Abc_NtkMfsTotalGlitching(pNtk, nPats, Prob, fVerbose) );
|
||||
else
|
||||
printf( "Currently computes glitching only for K-LUT networks with K <= 6.\n" );
|
||||
return 0;
|
||||
|
||||
usage:
|
||||
Abc_Print( -2, "usage: glitch [-NP <num>] [-vh]\n" );
|
||||
Abc_Print( -2, "\t comparing glitching activity to switching activity\n" );
|
||||
Abc_Print( -2, "\t-N <num> : the number of random patterns to use (0 < num < 1000000) [default = %d]\n", nPats );
|
||||
Abc_Print( -2, "\t-P <num> : once in how many cycles an input changes its value [default = %d]\n", Prob );
|
||||
Abc_Print( -2, "\t-v : toggle printing optimization summary [default = %s]\n", fVerbose? "yes": "no" );
|
||||
Abc_Print( -2, "\t-h : print the command usage\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
|
|
|||
|
|
@ -351,9 +351,8 @@ void Abc_NtkPrintStats( Abc_Ntk_t * pNtk, int fFactored, int fSaveBest, int fDum
|
|||
Abc_Print( 1," power =%7.2f", Abc_NtkMfsTotalSwitching(pNtk) );
|
||||
if ( fGlitch )
|
||||
{
|
||||
extern float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk );
|
||||
if ( Abc_NtkIsLogic(pNtk) && Abc_NtkGetFaninMax(pNtk) <= 6 )
|
||||
Abc_Print( 1," glitch =%7.2f %%", Abc_NtkMfsTotalGlitching(pNtk) );
|
||||
Abc_Print( 1," glitch =%7.2f %%", Abc_NtkMfsTotalGlitching(pNtk, 4000, 8, 0) );
|
||||
else
|
||||
printf( "\nCurrently computes glitching only for K-LUT networks with K <= 6." );
|
||||
}
|
||||
|
|
@ -1744,7 +1743,7 @@ extern Gli_Man_t * Gli_ManAlloc( int nObjs, int nRegs, int nFanioPairs );
|
|||
extern void Gli_ManStop( Gli_Man_t * p );
|
||||
extern int Gli_ManCreateCi( Gli_Man_t * p, int nFanouts );
|
||||
extern int Gli_ManCreateCo( Gli_Man_t * p, int iFanin );
|
||||
extern int Gli_ManCreateNode( Gli_Man_t * p, Vec_Int_t * vFanins, int nFanouts, unsigned * puTruth );
|
||||
extern int Gli_ManCreateNode( Gli_Man_t * p, Vec_Int_t * vFanins, int nFanouts, word * pGateTruth );
|
||||
|
||||
extern void Gli_ManSwitchesAndGlitches( Gli_Man_t * p, int nPatterns, float PiTransProb, int fVerbose );
|
||||
extern int Gli_ObjNumSwitches( Gli_Man_t * p, int iNode );
|
||||
|
|
@ -1761,13 +1760,14 @@ extern int Gli_ObjNumGlitches( Gli_Man_t * p, int iNode );
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
|
||||
float Abc_NtkMfsTotalGlitchingLut( Abc_Ntk_t * pNtk, int nPats, int Prob, int fVerbose )
|
||||
{
|
||||
int nSwitches, nGlitches;
|
||||
Gli_Man_t * p;
|
||||
Vec_Ptr_t * vNodes;
|
||||
Vec_Int_t * vFanins, * vTruth;
|
||||
Abc_Obj_t * pObj, * pFanin;
|
||||
Vec_Wrd_t * vTruths; word * pTruth;
|
||||
unsigned * puTruth;
|
||||
int i, k;
|
||||
assert( Abc_NtkIsLogic(pNtk) );
|
||||
|
|
@ -1781,6 +1781,7 @@ float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
|
|||
vNodes = Abc_NtkDfs( pNtk, 0 );
|
||||
vFanins = Vec_IntAlloc( 6 );
|
||||
vTruth = Vec_IntAlloc( 1 << 12 );
|
||||
vTruths = Vec_WrdStart( Abc_NtkObjNumMax(pNtk) );
|
||||
|
||||
// derive network for glitch computation
|
||||
p = Gli_ManAlloc( Vec_PtrSize(vNodes) + Abc_NtkCiNum(pNtk) + Abc_NtkCoNum(pNtk),
|
||||
|
|
@ -1795,7 +1796,9 @@ float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
|
|||
Abc_ObjForEachFanin( pObj, pFanin, k )
|
||||
Vec_IntPush( vFanins, pFanin->iTemp );
|
||||
puTruth = Hop_ManConvertAigToTruth( (Hop_Man_t *)pNtk->pManFunc, (Hop_Obj_t *)pObj->pData, Abc_ObjFaninNum(pObj), vTruth, 0 );
|
||||
pObj->iTemp = Gli_ManCreateNode( p, vFanins, Abc_ObjFanoutNum(pObj), puTruth );
|
||||
pTruth = Vec_WrdEntryP( vTruths, Abc_ObjId(pObj) );
|
||||
*pTruth = ((word)puTruth[Abc_ObjFaninNum(pObj) == 6] << 32) | (word)puTruth[0];
|
||||
pObj->iTemp = Gli_ManCreateNode( p, vFanins, Abc_ObjFanoutNum(pObj), pTruth );
|
||||
}
|
||||
Abc_NtkForEachCo( pNtk, pObj, i )
|
||||
Gli_ManCreateCo( p, Abc_ObjFanin0(pObj)->iTemp );
|
||||
|
|
@ -1816,6 +1819,72 @@ float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk )
|
|||
Vec_PtrFree( vNodes );
|
||||
Vec_IntFree( vTruth );
|
||||
Vec_IntFree( vFanins );
|
||||
Vec_WrdFree( vTruths );
|
||||
return nSwitches ? 100.0*(nGlitches-nSwitches)/nSwitches : 0.0;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Returns the percentable of increased power due to glitching.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
float Abc_NtkMfsTotalGlitching( Abc_Ntk_t * pNtk, int nPats, int Prob, int fVerbose )
|
||||
{
|
||||
int nSwitches, nGlitches;
|
||||
Gli_Man_t * p;
|
||||
Vec_Ptr_t * vNodes;
|
||||
Vec_Int_t * vFanins;
|
||||
Abc_Obj_t * pObj, * pFanin;
|
||||
int i, k, nFaninMax = Abc_NtkGetFaninMax(pNtk);
|
||||
if ( !Abc_NtkIsMappedLogic(pNtk) )
|
||||
return Abc_NtkMfsTotalGlitchingLut( pNtk, nPats, Prob, fVerbose );
|
||||
assert( Abc_NtkIsMappedLogic(pNtk) );
|
||||
if ( nFaninMax > 16 )
|
||||
{
|
||||
printf( "Abc_NtkMfsTotalGlitching() This procedure works only for mapped networks with LUTs size up to 6 inputs.\n" );
|
||||
return -1.0;
|
||||
}
|
||||
vNodes = Abc_NtkDfs( pNtk, 0 );
|
||||
vFanins = Vec_IntAlloc( 6 );
|
||||
|
||||
// derive network for glitch computation
|
||||
p = Gli_ManAlloc( Vec_PtrSize(vNodes) + Abc_NtkCiNum(pNtk) + Abc_NtkCoNum(pNtk),
|
||||
Abc_NtkLatchNum(pNtk), Abc_NtkGetTotalFanins(pNtk) + Abc_NtkCoNum(pNtk) );
|
||||
Abc_NtkForEachObj( pNtk, pObj, i )
|
||||
pObj->iTemp = -1;
|
||||
Abc_NtkForEachCi( pNtk, pObj, i )
|
||||
pObj->iTemp = Gli_ManCreateCi( p, Abc_ObjFanoutNum(pObj) );
|
||||
Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pObj, i )
|
||||
{
|
||||
Vec_IntClear( vFanins );
|
||||
Abc_ObjForEachFanin( pObj, pFanin, k )
|
||||
Vec_IntPush( vFanins, pFanin->iTemp );
|
||||
pObj->iTemp = Gli_ManCreateNode( p, vFanins, Abc_ObjFanoutNum(pObj), Mio_GateReadTruthP((Mio_Gate_t *)pObj->pData) );
|
||||
}
|
||||
Abc_NtkForEachCo( pNtk, pObj, i )
|
||||
Gli_ManCreateCo( p, Abc_ObjFanin0(pObj)->iTemp );
|
||||
|
||||
// compute glitching
|
||||
Gli_ManSwitchesAndGlitches( p, nPats, 1.0/Prob, fVerbose );
|
||||
|
||||
// compute the ratio
|
||||
nSwitches = nGlitches = 0;
|
||||
Abc_NtkForEachObj( pNtk, pObj, i )
|
||||
if ( pObj->iTemp >= 0 )
|
||||
{
|
||||
nSwitches += Abc_ObjFanoutNum(pObj) * Gli_ObjNumSwitches(p, pObj->iTemp);
|
||||
nGlitches += Abc_ObjFanoutNum(pObj) * Gli_ObjNumGlitches(p, pObj->iTemp);
|
||||
}
|
||||
|
||||
Gli_ManStop( p );
|
||||
Vec_PtrFree( vNodes );
|
||||
Vec_IntFree( vFanins );
|
||||
return nSwitches ? 100.0*(nGlitches-nSwitches)/nSwitches : 0.0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue