mirror of https://github.com/YosysHQ/abc.git
380 lines
11 KiB
C
380 lines
11 KiB
C
|
|
/**CFile****************************************************************
|
||
|
|
|
||
|
|
FileName [simUtils.c]
|
||
|
|
|
||
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
||
|
|
|
||
|
|
PackageName [Network and node package.]
|
||
|
|
|
||
|
|
Synopsis [Various simulation utilities.]
|
||
|
|
|
||
|
|
Author [Alan Mishchenko]
|
||
|
|
|
||
|
|
Affiliation [UC Berkeley]
|
||
|
|
|
||
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
||
|
|
|
||
|
|
Revision [$Id: simUtils.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
|
||
|
|
#include "abc.h"
|
||
|
|
#include "sim.h"
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// DECLARATIONS ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// FUNCTION DEFITIONS ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Allocates simulation information for all nodes.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
Vec_Ptr_t * Sim_UtilInfoAlloc( int nSize, int nWords, bool fClean )
|
||
|
|
{
|
||
|
|
Vec_Ptr_t * vInfo;
|
||
|
|
int i;
|
||
|
|
vInfo = Vec_PtrAlloc( nSize );
|
||
|
|
vInfo->pArray[0] = ALLOC( unsigned, nSize * nWords );
|
||
|
|
if ( fClean )
|
||
|
|
memset( vInfo->pArray[0], 0, sizeof(unsigned) * nSize * nWords );
|
||
|
|
for ( i = 1; i < nSize; i++ )
|
||
|
|
vInfo->pArray[i] = ((unsigned *)vInfo->pArray[i-1]) + nWords;
|
||
|
|
vInfo->nSize = nSize;
|
||
|
|
return vInfo;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Allocates simulation information for all nodes.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilInfoFree( Vec_Ptr_t * p )
|
||
|
|
{
|
||
|
|
free( p->pArray[0] );
|
||
|
|
Vec_PtrFree( p );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Adds the second supp-info the first.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilInfoAdd( unsigned * pInfo1, unsigned * pInfo2, int nWords )
|
||
|
|
{
|
||
|
|
int w;
|
||
|
|
for ( w = 0; w < nWords; w++ )
|
||
|
|
pInfo1[w] |= pInfo2[w];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Returns the positions where pInfo2 is 1 while pInfo1 is 0.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilInfoDetectDiffs( unsigned * pInfo1, unsigned * pInfo2, int nWords, Vec_Int_t * vDiffs )
|
||
|
|
{
|
||
|
|
int w, b;
|
||
|
|
unsigned uMask;
|
||
|
|
vDiffs->nSize = 0;
|
||
|
|
for ( w = 0; w < nWords; w++ )
|
||
|
|
if ( uMask = (pInfo2[w] ^ pInfo1[w]) )
|
||
|
|
for ( b = 0; b < 32; b++ )
|
||
|
|
if ( uMask & (1 << b) )
|
||
|
|
Vec_IntPush( vDiffs, 32*w + b );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Returns the positions where pInfo2 is 1 while pInfo1 is 0.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilInfoDetectNews( unsigned * pInfo1, unsigned * pInfo2, int nWords, Vec_Int_t * vDiffs )
|
||
|
|
{
|
||
|
|
int w, b;
|
||
|
|
unsigned uMask;
|
||
|
|
vDiffs->nSize = 0;
|
||
|
|
for ( w = 0; w < nWords; w++ )
|
||
|
|
if ( uMask = (pInfo2[w] & ~pInfo1[w]) )
|
||
|
|
for ( b = 0; b < 32; b++ )
|
||
|
|
if ( uMask & (1 << b) )
|
||
|
|
Vec_IntPush( vDiffs, 32*w + b );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Computes structural supports.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilComputeStrSupp( Sim_Man_t * p )
|
||
|
|
{
|
||
|
|
Abc_Obj_t * pNode;
|
||
|
|
unsigned * pSimmNode, * pSimmNode1, * pSimmNode2;
|
||
|
|
int i, k;
|
||
|
|
// assign the structural support to the PIs
|
||
|
|
Abc_NtkForEachCi( p->pNtk, pNode, i )
|
||
|
|
Sim_SuppStrSetVar( p, pNode, i );
|
||
|
|
// derive the structural supports of the internal nodes
|
||
|
|
Abc_NtkForEachNode( p->pNtk, pNode, i )
|
||
|
|
{
|
||
|
|
if ( Abc_NodeIsConst(pNode) )
|
||
|
|
continue;
|
||
|
|
pSimmNode = p->vSuppStr->pArray[ pNode->Id ];
|
||
|
|
pSimmNode1 = p->vSuppStr->pArray[ Abc_ObjFaninId0(pNode) ];
|
||
|
|
pSimmNode2 = p->vSuppStr->pArray[ Abc_ObjFaninId1(pNode) ];
|
||
|
|
for ( k = 0; k < p->nSuppWords; k++ )
|
||
|
|
pSimmNode[k] = pSimmNode1[k] | pSimmNode2[k];
|
||
|
|
}
|
||
|
|
// set the structural supports of the PO nodes
|
||
|
|
Abc_NtkForEachCo( p->pNtk, pNode, i )
|
||
|
|
{
|
||
|
|
pSimmNode = p->vSuppStr->pArray[ pNode->Id ];
|
||
|
|
pSimmNode1 = p->vSuppStr->pArray[ Abc_ObjFaninId0(pNode) ];
|
||
|
|
for ( k = 0; k < p->nSuppWords; k++ )
|
||
|
|
pSimmNode[k] = pSimmNode1[k];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Assigns random simulation info to the PIs.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilAssignRandom( Sim_Man_t * p )
|
||
|
|
{
|
||
|
|
Abc_Obj_t * pNode;
|
||
|
|
unsigned * pSimInfo;
|
||
|
|
int i, k;
|
||
|
|
// assign the random/systematic simulation info to the PIs
|
||
|
|
Abc_NtkForEachCi( p->pNtk, pNode, i )
|
||
|
|
{
|
||
|
|
pSimInfo = p->vSim0->pArray[pNode->Id];
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimInfo[k] = SIM_RANDOM_UNSIGNED;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Flips the simulation info of the node.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilFlipSimInfo( Sim_Man_t * p, Abc_Obj_t * pNode )
|
||
|
|
{
|
||
|
|
unsigned * pSimInfo1, * pSimInfo2;
|
||
|
|
int k;
|
||
|
|
pSimInfo1 = p->vSim1->pArray[pNode->Id];
|
||
|
|
pSimInfo2 = p->vSim0->pArray[pNode->Id];
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimInfo2[k] = ~pSimInfo1[k];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Returns 1 if the simulation infos are equal.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
bool Sim_UtilCompareSimInfo( Sim_Man_t * p, Abc_Obj_t * pNode )
|
||
|
|
{
|
||
|
|
unsigned * pSimInfo1, * pSimInfo2;
|
||
|
|
int k;
|
||
|
|
pSimInfo1 = p->vSim1->pArray[pNode->Id];
|
||
|
|
pSimInfo2 = p->vSim0->pArray[pNode->Id];
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
if ( pSimInfo2[k] != pSimInfo1[k] )
|
||
|
|
return 0;
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Simulates the internal nodes.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilSimulate( Sim_Man_t * p, bool fType )
|
||
|
|
{
|
||
|
|
Abc_Obj_t * pNode;
|
||
|
|
int i;
|
||
|
|
// simulate the internal nodes
|
||
|
|
Abc_NtkForEachNode( p->pNtk, pNode, i )
|
||
|
|
Sim_UtilSimulateNode( p, pNode, fType, fType, fType );
|
||
|
|
// assign simulation info of the CO nodes
|
||
|
|
Abc_NtkForEachCo( p->pNtk, pNode, i )
|
||
|
|
Sim_UtilSimulateNode( p, pNode, fType, fType, fType );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Simulates one node.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Sim_UtilSimulateNode( Sim_Man_t * p, Abc_Obj_t * pNode, bool fType, bool fType1, bool fType2 )
|
||
|
|
{
|
||
|
|
unsigned * pSimmNode, * pSimmNode1, * pSimmNode2;
|
||
|
|
int k, fComp1, fComp2;
|
||
|
|
// simulate the internal nodes
|
||
|
|
if ( Abc_ObjIsNode(pNode) )
|
||
|
|
{
|
||
|
|
if ( Abc_NodeIsConst(pNode) )
|
||
|
|
return;
|
||
|
|
|
||
|
|
if ( fType )
|
||
|
|
pSimmNode = p->vSim1->pArray[ pNode->Id ];
|
||
|
|
else
|
||
|
|
pSimmNode = p->vSim0->pArray[ pNode->Id ];
|
||
|
|
|
||
|
|
if ( fType1 )
|
||
|
|
pSimmNode1 = p->vSim1->pArray[ Abc_ObjFaninId0(pNode) ];
|
||
|
|
else
|
||
|
|
pSimmNode1 = p->vSim0->pArray[ Abc_ObjFaninId0(pNode) ];
|
||
|
|
|
||
|
|
if ( fType2 )
|
||
|
|
pSimmNode2 = p->vSim1->pArray[ Abc_ObjFaninId1(pNode) ];
|
||
|
|
else
|
||
|
|
pSimmNode2 = p->vSim0->pArray[ Abc_ObjFaninId1(pNode) ];
|
||
|
|
|
||
|
|
fComp1 = Abc_ObjFaninC0(pNode);
|
||
|
|
fComp2 = Abc_ObjFaninC1(pNode);
|
||
|
|
if ( fComp1 && fComp2 )
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimmNode[k] = ~pSimmNode1[k] & ~pSimmNode2[k];
|
||
|
|
else if ( fComp1 && !fComp2 )
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimmNode[k] = ~pSimmNode1[k] & pSimmNode2[k];
|
||
|
|
else if ( !fComp1 && fComp2 )
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimmNode[k] = pSimmNode1[k] & ~pSimmNode2[k];
|
||
|
|
else // if ( fComp1 && fComp2 )
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimmNode[k] = pSimmNode1[k] & pSimmNode2[k];
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
assert( Abc_ObjFaninNum(pNode) == 1 );
|
||
|
|
if ( fType )
|
||
|
|
pSimmNode = p->vSim1->pArray[ pNode->Id ];
|
||
|
|
else
|
||
|
|
pSimmNode = p->vSim0->pArray[ pNode->Id ];
|
||
|
|
|
||
|
|
if ( fType1 )
|
||
|
|
pSimmNode1 = p->vSim1->pArray[ Abc_ObjFaninId0(pNode) ];
|
||
|
|
else
|
||
|
|
pSimmNode1 = p->vSim0->pArray[ Abc_ObjFaninId0(pNode) ];
|
||
|
|
|
||
|
|
fComp1 = Abc_ObjFaninC0(pNode);
|
||
|
|
if ( fComp1 )
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimmNode[k] = ~pSimmNode1[k];
|
||
|
|
else
|
||
|
|
for ( k = 0; k < p->nSimWords; k++ )
|
||
|
|
pSimmNode[k] = pSimmNode1[k];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Returns 1 if the simulation infos are equal.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
int Sim_UtilCountSuppSizes( Sim_Man_t * p, int fStruct )
|
||
|
|
{
|
||
|
|
Abc_Obj_t * pNode, * pNodeCi;
|
||
|
|
int i, v, Counter;
|
||
|
|
Counter = 0;
|
||
|
|
if ( fStruct )
|
||
|
|
{
|
||
|
|
Abc_NtkForEachCo( p->pNtk, pNode, i )
|
||
|
|
Abc_NtkForEachCi( p->pNtk, pNodeCi, v )
|
||
|
|
Counter += Sim_SuppStrHasVar( p, pNode, v );
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Abc_NtkForEachCo( p->pNtk, pNode, i )
|
||
|
|
Abc_NtkForEachCi( p->pNtk, pNodeCi, v )
|
||
|
|
Counter += Sim_SuppFunHasVar( p, i, v );
|
||
|
|
}
|
||
|
|
return Counter;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// END OF FILE ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
|