mirror of https://github.com/YosysHQ/abc.git
Version abc70727
This commit is contained in:
parent
054e2cd3a8
commit
a8a80d9a1a
2
abc.dsp
2
abc.dsp
|
|
@ -2570,7 +2570,7 @@ SOURCE=.\src\aig\fra\fraCore.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\aig\fra\fraDfs.c
|
||||
SOURCE=.\src\aig\fra\fraInd.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
|
|
|||
|
|
@ -92,6 +92,8 @@ struct Aig_Man_t_
|
|||
Vec_Ptr_t * vBufs; // the array of buffers
|
||||
Aig_Obj_t * pConst1; // the constant 1 node
|
||||
Aig_Obj_t Ghost; // the ghost node
|
||||
Vec_Int_t * vInits; // the initial values of the latches (latches are last PIs/POs)
|
||||
int nAsserts; // the number of asserts among POs (asserts are first POs)
|
||||
// AIG node counters
|
||||
int nObjs[AIG_OBJ_VOID];// the number of objects by type
|
||||
int nCreated; // the number of created objects
|
||||
|
|
@ -114,8 +116,9 @@ struct Aig_Man_t_
|
|||
int nAndTotal;
|
||||
int nAndPrev;
|
||||
// representatives
|
||||
Aig_Obj_t ** pRepr;
|
||||
int nReprAlloc;
|
||||
Aig_Obj_t ** pEquivs; // linked list of equivalent nodes (when choices are used)
|
||||
Aig_Obj_t ** pReprs; // representatives of each node
|
||||
int nReprsAlloc; // the number of allocated representatives
|
||||
// various data members
|
||||
Aig_MmFixed_t * pMemObjs; // memory manager for objects
|
||||
Vec_Int_t * vLevelR; // the reverse level of the nodes
|
||||
|
|
@ -123,7 +126,6 @@ struct Aig_Man_t_
|
|||
void * pData; // the temporary data
|
||||
int nTravIds; // the current traversal ID
|
||||
int fCatchExor; // enables EXOR nodes
|
||||
Aig_Obj_t ** pReprs; // linked list of equivalent nodes (when choices are used)
|
||||
// timing statistics
|
||||
int time1;
|
||||
int time2;
|
||||
|
|
@ -171,8 +173,9 @@ static inline int Aig_ManNodeNum( Aig_Man_t * p ) { return p->nO
|
|||
static inline int Aig_ManGetCost( Aig_Man_t * p ) { return p->nObjs[AIG_OBJ_AND]+3*p->nObjs[AIG_OBJ_EXOR]; }
|
||||
static inline int Aig_ManObjNum( Aig_Man_t * p ) { return p->nCreated - p->nDeleted; }
|
||||
static inline int Aig_ManObjIdMax( Aig_Man_t * p ) { return Vec_PtrSize(p->vObjs); }
|
||||
static inline int Aig_ManInitNum( Aig_Man_t * p ) { return p->vInits? Vec_IntSize(p->vInits) : 0; }
|
||||
|
||||
static inline Aig_Type_t Aig_ObjType( Aig_Obj_t * pObj ) { return (Aig_Type_t)pObj->Type; }
|
||||
static inline Aig_Type_t Aig_ObjType( Aig_Obj_t * pObj ) { return (Aig_Type_t)pObj->Type; }
|
||||
static inline int Aig_ObjIsNone( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_NONE; }
|
||||
static inline int Aig_ObjIsConst1( Aig_Obj_t * pObj ) { assert(!Aig_IsComplement(pObj)); return pObj->Type == AIG_OBJ_CONST1; }
|
||||
static inline int Aig_ObjIsPi( Aig_Obj_t * pObj ) { return pObj->Type == AIG_OBJ_PI; }
|
||||
|
|
@ -304,6 +307,24 @@ static inline int Aig_ObjFanoutNext( Aig_Man_t * p, int iFan ) { assert(iF
|
|||
(((iFan) = i? Aig_ObjFanoutNext(p, iFan) : Aig_ObjFanout0Int(p, pObj->Id)), 1) && \
|
||||
(((pFanout) = Aig_ManObj(p, iFan>>1)), 1); i++ )
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// SEQUENTIAL ITERATORS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// iterator over the primary inputs
|
||||
#define Aig_ManForEachPiSeq( p, pObj, i ) \
|
||||
Vec_PtrForEachEntryStop( p->vPis, pObj, i, Aig_ManPiNum(p)-Aig_ManInitNum(p) )
|
||||
// iterator over the latch outputs
|
||||
#define Aig_ManForEachLoSeq( p, pObj, i ) \
|
||||
Vec_PtrForEachEntryStart( p->vPis, pObj, i, Aig_ManPiNum(p)-Aig_ManInitNum(p) )
|
||||
// iterator over the primary outputs
|
||||
#define Aig_ManForEachPoSeq( p, pObj, i ) \
|
||||
Vec_PtrForEachEntryStop( p->vPos, pObj, i, Aig_ManPoNum(p)-Aig_ManInitNum(p) )
|
||||
// iterator over the latch inputs
|
||||
#define Aig_ManForEachLiSeq( p, pObj, i ) \
|
||||
Vec_PtrForEachEntryStart( p->vPos, pObj, i, Aig_ManPoNum(p)-Aig_ManInitNum(p) )
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -382,8 +403,11 @@ extern Vec_Vec_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize );
|
|||
/*=== aigRepr.c =========================================================*/
|
||||
extern void Aig_ManReprStart( Aig_Man_t * p, int nIdMax );
|
||||
extern void Aig_ManReprStop( Aig_Man_t * p );
|
||||
extern void Aig_ObjCreateRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 );
|
||||
extern void Aig_ManTransferRepr( Aig_Man_t * pNew, Aig_Man_t * p );
|
||||
extern Aig_Man_t * Aig_ManCreateChoices( Aig_Man_t * p );
|
||||
extern Aig_Man_t * Aig_ManDupRepr( Aig_Man_t * p );
|
||||
extern Aig_Man_t * Aig_ManRehash( Aig_Man_t * p );
|
||||
extern void Aig_ManCreateChoices( Aig_Man_t * p );
|
||||
/*=== aigSeq.c ========================================================*/
|
||||
extern int Aig_ManSeqStrash( Aig_Man_t * p, int nLatches, int * pInits );
|
||||
/*=== aigTable.c ========================================================*/
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ void Aig_ManDfsChoices_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vNodes
|
|||
assert( Aig_ObjIsNode(pObj) );
|
||||
Aig_ManDfsChoices_rec( p, Aig_ObjFanin0(pObj), vNodes );
|
||||
Aig_ManDfsChoices_rec( p, Aig_ObjFanin1(pObj), vNodes );
|
||||
Aig_ManDfsChoices_rec( p, p->pReprs[pObj->Id], vNodes );
|
||||
Aig_ManDfsChoices_rec( p, p->pEquivs[pObj->Id], vNodes );
|
||||
assert( !Aig_ObjIsTravIdCurrent(p, pObj) ); // loop detection
|
||||
Aig_ObjSetTravIdCurrent(p, pObj);
|
||||
Vec_PtrPush( vNodes, pObj );
|
||||
|
|
@ -160,7 +160,7 @@ Vec_Ptr_t * Aig_ManDfsChoices( Aig_Man_t * p )
|
|||
Vec_Ptr_t * vNodes;
|
||||
Aig_Obj_t * pObj;
|
||||
int i;
|
||||
assert( p->pReprs != NULL );
|
||||
assert( p->pEquivs != NULL );
|
||||
Aig_ManIncrementTravId( p );
|
||||
// mark constant and PIs
|
||||
Aig_ObjSetTravIdCurrent( p, Aig_ManConst1(p) );
|
||||
|
|
|
|||
|
|
@ -52,8 +52,8 @@ Aig_Man_t * Aig_ManStart( int nNodesMax )
|
|||
p->nTravIds = 1;
|
||||
p->fCatchExor = 0;
|
||||
// allocate arrays for nodes
|
||||
p->vPis = Vec_PtrAlloc( 100 );
|
||||
p->vPos = Vec_PtrAlloc( 100 );
|
||||
p->vPis = Vec_PtrAlloc( 100 );
|
||||
p->vPos = Vec_PtrAlloc( 100 );
|
||||
p->vObjs = Vec_PtrAlloc( 1000 );
|
||||
p->vBufs = Vec_PtrAlloc( 100 );
|
||||
// prepare the internal memory manager
|
||||
|
|
@ -239,7 +239,9 @@ void Aig_ManStop( Aig_Man_t * p )
|
|||
if ( p->vBufs ) Vec_PtrFree( p->vBufs );
|
||||
if ( p->vLevelR ) Vec_IntFree( p->vLevelR );
|
||||
if ( p->vLevels ) Vec_VecFree( p->vLevels );
|
||||
if ( p->vInits ) Vec_IntFree( p->vInits );
|
||||
FREE( p->pReprs );
|
||||
FREE( p->pEquivs );
|
||||
free( p->pTable );
|
||||
free( p );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -873,8 +873,8 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
|
|||
// perform choicing for each derived AIG
|
||||
Vec_PtrForEachEntry( vMiters, pNew, i )
|
||||
{
|
||||
extern Aig_Man_t * Fra_Choice( Aig_Man_t * pManAig );
|
||||
pNew = Fra_Choice( p = pNew );
|
||||
extern Aig_Man_t * Fra_FraigChoice( Aig_Man_t * pManAig );
|
||||
pNew = Fra_FraigChoice( p = pNew );
|
||||
Vec_PtrWriteEntry( vMiters, i, pNew );
|
||||
Aig_ManStop( p );
|
||||
}
|
||||
|
|
@ -914,7 +914,7 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
|
|||
Vec_PtrFree( vMiters );
|
||||
|
||||
// derive the result of choicing
|
||||
pChoice = Aig_ManCreateChoices( pNew );
|
||||
pChoice = Aig_ManRehash( pNew );
|
||||
if ( pChoice != pNew )
|
||||
Aig_ManStop( pNew );
|
||||
return pChoice;
|
||||
|
|
|
|||
|
|
@ -42,10 +42,10 @@
|
|||
void Aig_ManReprStart( Aig_Man_t * p, int nIdMax )
|
||||
{
|
||||
assert( Aig_ManBufNum(p) == 0 );
|
||||
assert( p->pRepr == NULL );
|
||||
p->nReprAlloc = nIdMax;
|
||||
p->pRepr = ALLOC( Aig_Obj_t *, p->nReprAlloc );
|
||||
memset( p->pRepr, 0, sizeof(Aig_Obj_t *) * p->nReprAlloc );
|
||||
assert( p->pReprs == NULL );
|
||||
p->nReprsAlloc = nIdMax;
|
||||
p->pReprs = ALLOC( Aig_Obj_t *, p->nReprsAlloc );
|
||||
memset( p->pReprs, 0, sizeof(Aig_Obj_t *) * p->nReprsAlloc );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -61,9 +61,31 @@ void Aig_ManReprStart( Aig_Man_t * p, int nIdMax )
|
|||
***********************************************************************/
|
||||
void Aig_ManReprStop( Aig_Man_t * p )
|
||||
{
|
||||
assert( p->pRepr != NULL );
|
||||
FREE( p->pRepr );
|
||||
p->nReprAlloc = 0;
|
||||
assert( p->pReprs != NULL );
|
||||
FREE( p->pReprs );
|
||||
p->nReprsAlloc = 0;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Set the representative.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Aig_ObjCreateRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 )
|
||||
{
|
||||
assert( p->pReprs != NULL );
|
||||
assert( !Aig_IsComplement(pNode1) );
|
||||
assert( !Aig_IsComplement(pNode2) );
|
||||
assert( pNode1->Id < p->nReprsAlloc );
|
||||
assert( pNode2->Id < p->nReprsAlloc );
|
||||
assert( pNode1->Id < pNode2->Id );
|
||||
p->pReprs[pNode2->Id] = pNode1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -79,17 +101,17 @@ void Aig_ManReprStop( Aig_Man_t * p )
|
|||
***********************************************************************/
|
||||
static inline void Aig_ObjSetRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t * pNode2 )
|
||||
{
|
||||
assert( p->pRepr != NULL );
|
||||
assert( p->pReprs != NULL );
|
||||
assert( !Aig_IsComplement(pNode1) );
|
||||
assert( !Aig_IsComplement(pNode2) );
|
||||
assert( pNode1->Id < p->nReprAlloc );
|
||||
assert( pNode2->Id < p->nReprAlloc );
|
||||
assert( pNode1->Id < p->nReprsAlloc );
|
||||
assert( pNode2->Id < p->nReprsAlloc );
|
||||
if ( pNode1 == pNode2 )
|
||||
return;
|
||||
if ( pNode1->Id < pNode2->Id )
|
||||
p->pRepr[pNode2->Id] = pNode1;
|
||||
p->pReprs[pNode2->Id] = pNode1;
|
||||
else
|
||||
p->pRepr[pNode1->Id] = pNode2;
|
||||
p->pReprs[pNode1->Id] = pNode2;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -105,11 +127,30 @@ static inline void Aig_ObjSetRepr( Aig_Man_t * p, Aig_Obj_t * pNode1, Aig_Obj_t
|
|||
***********************************************************************/
|
||||
static inline Aig_Obj_t * Aig_ObjFindRepr( Aig_Man_t * p, Aig_Obj_t * pNode )
|
||||
{
|
||||
assert( p->pRepr != NULL );
|
||||
assert( p->pReprs != NULL );
|
||||
assert( !Aig_IsComplement(pNode) );
|
||||
assert( pNode->Id < p->nReprAlloc );
|
||||
assert( !p->pRepr[pNode->Id] || p->pRepr[pNode->Id]->Id < pNode->Id );
|
||||
return p->pRepr[pNode->Id];
|
||||
assert( pNode->Id < p->nReprsAlloc );
|
||||
assert( !p->pReprs[pNode->Id] || p->pReprs[pNode->Id]->Id < pNode->Id );
|
||||
return p->pReprs[pNode->Id];
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Clears the representative.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Aig_ObjClearRepr( Aig_Man_t * p, Aig_Obj_t * pNode )
|
||||
{
|
||||
assert( p->pReprs != NULL );
|
||||
assert( !Aig_IsComplement(pNode) );
|
||||
assert( pNode->Id < p->nReprsAlloc );
|
||||
p->pReprs[pNode->Id] = NULL;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -166,7 +207,7 @@ void Aig_ManTransferRepr( Aig_Man_t * pNew, Aig_Man_t * p )
|
|||
{
|
||||
Aig_Obj_t * pObj, * pRepr;
|
||||
int k;
|
||||
assert( pNew->pRepr != NULL );
|
||||
assert( pNew->pReprs != NULL );
|
||||
// go through the nodes which have representatives
|
||||
Aig_ManForEachObj( p, pObj, k )
|
||||
if ( pRepr = Aig_ObjFindRepr(p, pObj) )
|
||||
|
|
@ -269,7 +310,7 @@ int Aig_ObjCheckTfi_rec( Aig_Man_t * p, Aig_Obj_t * pNode, Aig_Obj_t * pOld )
|
|||
if ( Aig_ObjCheckTfi_rec( p, Aig_ObjFanin1(pNode), pOld ) )
|
||||
return 1;
|
||||
// check equivalent nodes
|
||||
return Aig_ObjCheckTfi_rec( p, pNode->pData, pOld );
|
||||
return Aig_ObjCheckTfi_rec( p, p->pEquivs[pNode->Id], pOld );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -291,6 +332,29 @@ int Aig_ObjCheckTfi( Aig_Man_t * p, Aig_Obj_t * pNew, Aig_Obj_t * pOld )
|
|||
return Aig_ObjCheckTfi_rec( p, pNew, pOld );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Iteratively rehashes the AIG.]
|
||||
|
||||
Description [The input AIG is assumed to have representatives assigned.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Man_t * Aig_ManRehash( Aig_Man_t * p )
|
||||
{
|
||||
Aig_Man_t * pTemp;
|
||||
assert( p->pReprs != NULL );
|
||||
while ( Aig_ManRemapRepr( p ) )
|
||||
{
|
||||
p = Aig_ManDupRepr( pTemp = p );
|
||||
Aig_ManStop( pTemp );
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Creates choices.]
|
||||
|
|
@ -302,20 +366,15 @@ int Aig_ObjCheckTfi( Aig_Man_t * p, Aig_Obj_t * pNew, Aig_Obj_t * pOld )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Man_t * Aig_ManCreateChoices( Aig_Man_t * p )
|
||||
void Aig_ManCreateChoices( Aig_Man_t * p )
|
||||
{
|
||||
Aig_Man_t * pTemp;
|
||||
Aig_Obj_t * pObj, * pRepr;
|
||||
int i;
|
||||
assert( p->pRepr != NULL );
|
||||
// iteratively reconstruct the HOP manager while transfering the fanouts
|
||||
while ( Aig_ManRemapRepr( p ) )
|
||||
{
|
||||
p = Aig_ManDupRepr( pTemp = p );
|
||||
Aig_ManStop( pTemp );
|
||||
}
|
||||
// create choices in this manager
|
||||
Aig_ManCleanData( p );
|
||||
assert( p->pReprs != NULL );
|
||||
// create equivalent nodes in the manager
|
||||
assert( p->pEquivs == NULL );
|
||||
p->pEquivs = ALLOC( Aig_Obj_t *, Aig_ManObjIdMax(p) + 1 );
|
||||
memset( p->pEquivs, 0, sizeof(Aig_Obj_t *) * (Aig_ManObjIdMax(p) + 1) );
|
||||
// make the choice nodes
|
||||
Aig_ManForEachNode( p, pObj, i )
|
||||
{
|
||||
|
|
@ -324,15 +383,21 @@ Aig_Man_t * Aig_ManCreateChoices( Aig_Man_t * p )
|
|||
continue;
|
||||
// skip constant and PI classes
|
||||
if ( !Aig_ObjIsNode(pRepr) )
|
||||
{
|
||||
Aig_ObjClearRepr( p, pObj );
|
||||
continue;
|
||||
}
|
||||
// skip choices with combinatinal loops
|
||||
if ( Aig_ObjCheckTfi( p, pRepr, pObj ) )
|
||||
if ( Aig_ObjCheckTfi( p, pObj, pRepr ) )
|
||||
{
|
||||
Aig_ObjClearRepr( p, pObj );
|
||||
continue;
|
||||
}
|
||||
//printf( "Node %d is represented by node %d.\n", pObj->Id, pRepr->Id );
|
||||
// add choice to the choice node
|
||||
pObj->pData = pRepr->pData;
|
||||
pRepr->pData = pObj;
|
||||
p->pEquivs[pObj->Id] = p->pEquivs[pRepr->Id];
|
||||
p->pEquivs[pRepr->Id] = pObj;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ static inline void Cnf_ObjSetBestCut( Aig_Obj_t * pObj, Cnf_Cut_t * pCut
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*=== cnfCore.c ========================================================*/
|
||||
extern Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig );
|
||||
extern Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig, int nOutputs );
|
||||
extern Cnf_Man_t * Cnf_ManRead();
|
||||
extern void Cnf_ClearMemory();
|
||||
/*=== cnfCut.c ========================================================*/
|
||||
|
|
@ -147,7 +147,7 @@ extern Vec_Ptr_t * Aig_ManScanMapping( Cnf_Man_t * p, int fCollect );
|
|||
extern Vec_Ptr_t * Cnf_ManScanMapping( Cnf_Man_t * p, int fCollect, int fPreorder );
|
||||
/*=== cnfWrite.c ========================================================*/
|
||||
extern void Cnf_SopConvertToVector( char * pSop, int nCubes, Vec_Int_t * vCover );
|
||||
extern Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped );
|
||||
extern Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped, int nOutputs );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ static Cnf_Man_t * s_pManCnf = NULL;
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig )
|
||||
Cnf_Dat_t * Cnf_Derive( Aig_Man_t * pAig, int nOutputs )
|
||||
{
|
||||
Cnf_Man_t * p;
|
||||
Cnf_Dat_t * pCnf;
|
||||
|
|
@ -70,7 +70,7 @@ p->timeMap = clock() - clk;
|
|||
clk = clock();
|
||||
Cnf_ManTransferCuts( p );
|
||||
vMapped = Cnf_ManScanMapping( p, 1, 1 );
|
||||
pCnf = Cnf_ManWriteCnf( p, vMapped );
|
||||
pCnf = Cnf_ManWriteCnf( p, vMapped, nOutputs );
|
||||
Vec_PtrFree( vMapped );
|
||||
Aig_MmFixedStop( pMemCuts, 0 );
|
||||
p->timeSave = clock() - clk;
|
||||
|
|
|
|||
|
|
@ -145,28 +145,30 @@ int Cnf_IsopWriteCube( int Cube, int nVars, int * pVars, int * pLiterals )
|
|||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
Synopsis [Derives CNF for the mapping.]
|
||||
|
||||
Description []
|
||||
Description [The last argument shows the number of last outputs
|
||||
of the manager, which will not be converted into clauses but the
|
||||
new variables for which will be introduced.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped )
|
||||
Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped, int nOutputs )
|
||||
{
|
||||
Aig_Obj_t * pObj;
|
||||
Cnf_Dat_t * pCnf;
|
||||
Cnf_Cut_t * pCut;
|
||||
Vec_Int_t * vCover, * vSopTemp;
|
||||
int OutVar, pVars[32], * pLits, ** pClas;
|
||||
int OutVar, PoVar, pVars[32], * pLits, ** pClas;
|
||||
unsigned uTruth;
|
||||
int i, k, nLiterals, nClauses, Cube, Number;
|
||||
|
||||
// count the number of literals and clauses
|
||||
nLiterals = 1 + Aig_ManPoNum( p->pManAig );
|
||||
nClauses = 1 + Aig_ManPoNum( p->pManAig );
|
||||
nLiterals = 1 + Aig_ManPoNum( p->pManAig ) + 3 * nOutputs;
|
||||
nClauses = 1 + Aig_ManPoNum( p->pManAig ) + nOutputs;
|
||||
Vec_PtrForEachEntry( vMapped, pObj, i )
|
||||
{
|
||||
assert( Aig_ObjIsNode(pObj) );
|
||||
|
|
@ -211,12 +213,20 @@ Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped )
|
|||
pCnf->pClauses[0] = ALLOC( int, nLiterals );
|
||||
pCnf->pClauses[nClauses] = pCnf->pClauses[0] + nLiterals;
|
||||
|
||||
// set variable numbers
|
||||
Number = 0;
|
||||
// create room for variable numbers
|
||||
pCnf->pVarNums = ALLOC( int, 1+Aig_ManObjIdMax(p->pManAig) );
|
||||
memset( pCnf->pVarNums, 0xff, sizeof(int) * (1+Aig_ManObjIdMax(p->pManAig)) );
|
||||
// assign variables to the last (nOutputs) POs
|
||||
Number = 0;
|
||||
for ( i = 0; i < nOutputs; i++ )
|
||||
{
|
||||
pObj = Aig_ManPo( p->pManAig, Aig_ManPoNum(p->pManAig) - nOutputs + i );
|
||||
pCnf->pVarNums[pObj->Id] = Number++;
|
||||
}
|
||||
// assign variables to the internal nodes
|
||||
Vec_PtrForEachEntry( vMapped, pObj, i )
|
||||
pCnf->pVarNums[pObj->Id] = Number++;
|
||||
// assign variables to the PIs and constant node
|
||||
Aig_ManForEachPi( p->pManAig, pObj, i )
|
||||
pCnf->pVarNums[pObj->Id] = Number++;
|
||||
pCnf->pVarNums[Aig_ManConst1(p->pManAig)->Id] = Number++;
|
||||
|
|
@ -281,9 +291,25 @@ Cnf_Dat_t * Cnf_ManWriteCnf( Cnf_Man_t * p, Vec_Ptr_t * vMapped )
|
|||
// write the output literals
|
||||
Aig_ManForEachPo( p->pManAig, pObj, i )
|
||||
{
|
||||
OutVar = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ];
|
||||
*pClas++ = pLits;
|
||||
*pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj);
|
||||
if ( i < Aig_ManPoNum(p->pManAig) - nOutputs )
|
||||
{
|
||||
OutVar = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ];
|
||||
*pClas++ = pLits;
|
||||
*pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj);
|
||||
}
|
||||
else
|
||||
{
|
||||
PoVar = pCnf->pVarNums[ pObj->Id ];
|
||||
OutVar = pCnf->pVarNums[ Aig_ObjFanin0(pObj)->Id ];
|
||||
// first clause
|
||||
*pClas++ = pLits;
|
||||
*pLits++ = 2 * PoVar;
|
||||
*pLits++ = 2 * OutVar + !Aig_ObjFaninC0(pObj);
|
||||
// second clause
|
||||
*pClas++ = pLits;
|
||||
*pLits++ = 2 * PoVar + 1;
|
||||
*pLits++ = 2 * OutVar + Aig_ObjFaninC0(pObj);
|
||||
}
|
||||
}
|
||||
|
||||
// verify that the correct number of literals and clauses was written
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ extern "C" {
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct Fra_Par_t_ Fra_Par_t;
|
||||
typedef struct Fra_Cla_t_ Fra_Cla_t;
|
||||
typedef struct Fra_Man_t_ Fra_Man_t;
|
||||
|
||||
// FRAIG parameters
|
||||
|
|
@ -65,8 +66,26 @@ struct Fra_Par_t_
|
|||
int fProve; // prove the miter outputs
|
||||
int fVerbose; // verbose output
|
||||
int fDoSparse; // skip sparse functions
|
||||
int fConeBias; // bias variables in the cone (good for unsat runs)
|
||||
int nBTLimitNode; // conflict limit at a node
|
||||
int nBTLimitMiter; // conflict limit at an output
|
||||
int nTimeFrames; // the number of timeframes to unroll
|
||||
};
|
||||
|
||||
// FRAIG equivalence classes
|
||||
struct Fra_Cla_t_
|
||||
{
|
||||
Aig_Man_t * pAig; // the original AIG manager
|
||||
Aig_Obj_t ** pMemRepr; // pointers to representatives of each node
|
||||
Vec_Ptr_t * vClasses; // equivalence classes
|
||||
Vec_Ptr_t * vClasses1; // equivalence class of Const1 node
|
||||
Vec_Ptr_t * vClassesTemp; // temporary storage for new classes
|
||||
Aig_Obj_t ** pMemClasses; // memory allocated for equivalence classes
|
||||
Aig_Obj_t ** pMemClassesFree; // memory allocated for equivalence classes to be used
|
||||
Vec_Ptr_t * vClassOld; // old equivalence class after splitting
|
||||
Vec_Ptr_t * vClassNew; // new equivalence class(es) after splitting
|
||||
int nPairs; // the number of pairs of nodes
|
||||
int fRefinement; // set to 1 when refinement has happened
|
||||
};
|
||||
|
||||
// FRAIG manager
|
||||
|
|
@ -77,6 +96,9 @@ struct Fra_Man_t_
|
|||
// AIG managers
|
||||
Aig_Man_t * pManAig; // the starting AIG manager
|
||||
Aig_Man_t * pManFraig; // the final AIG manager
|
||||
// mapping AIG into FRAIG
|
||||
int nFrames; // the number of timeframes used
|
||||
Aig_Obj_t ** pMemFraig; // memory allocated for points to the fraig nodes
|
||||
// simulation info
|
||||
unsigned * pSimWords; // memory for simulation information
|
||||
int nSimWords; // the number of simulation words
|
||||
|
|
@ -85,27 +107,17 @@ struct Fra_Man_t_
|
|||
unsigned * pPatWords; // the counter example
|
||||
int * pPatScores; // the scores of each pattern
|
||||
// equivalence classes
|
||||
Vec_Ptr_t * vClasses; // equivalence classes
|
||||
Vec_Ptr_t * vClasses1; // equivalence class of Const1 node
|
||||
Vec_Ptr_t * vClassesTemp; // temporary storage for new classes
|
||||
Aig_Obj_t ** pMemClasses; // memory allocated for equivalence classes
|
||||
Aig_Obj_t ** pMemClassesFree; // memory allocated for equivalence classes to be used
|
||||
Vec_Ptr_t * vClassOld; // old equivalence class after splitting
|
||||
Vec_Ptr_t * vClassNew; // new equivalence class(es) after splitting
|
||||
int nPairs; // the number of pairs of nodes
|
||||
Fra_Cla_t * pCla; // representation of (candidate) equivalent nodes
|
||||
// equivalence checking
|
||||
sat_solver * pSat; // SAT solver
|
||||
int nSatVars; // the number of variables currently used
|
||||
Vec_Ptr_t * vPiVars; // the PIs of the cone used
|
||||
sint64 nBTLimitGlobal; // resource limit
|
||||
sint64 nInsLimitGlobal; // resource limit
|
||||
// various data members
|
||||
Aig_Obj_t ** pMemFraig; // memory allocated for points to the fraig nodes
|
||||
Aig_Obj_t ** pMemRepr; // memory allocated for points to the node representatives
|
||||
Aig_Obj_t ** pMemReprFra; // memory allocated for points to the node representatives in the FRAIG
|
||||
Vec_Ptr_t ** pMemFanins; // the arrays of fanins
|
||||
int * pMemSatNums; // the array of SAT numbers
|
||||
Vec_Ptr_t ** pMemFanins; // the arrays of fanins for some FRAIG nodes
|
||||
int * pMemSatNums; // the array of SAT numbers for some FRAIG nodes
|
||||
int nSizeAlloc; // allocated size of the arrays
|
||||
Vec_Ptr_t * vTimeouts; // the nodes, for which equivalence checking timed out
|
||||
// statistics
|
||||
int nSimRounds;
|
||||
int nNodesMiter;
|
||||
|
|
@ -140,23 +152,23 @@ struct Fra_Man_t_
|
|||
/// MACRO DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static inline unsigned * Fra_ObjSim( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pSimWords + ((Fra_Man_t *)pObj->pData)->nSimWords * pObj->Id; }
|
||||
static inline unsigned * Fra_ObjSim( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pSimWords + ((Fra_Man_t *)pObj->pData)->nSimWords * pObj->Id; }
|
||||
static inline unsigned Fra_ObjRandomSim() { return (rand() << 24) ^ (rand() << 12) ^ rand(); }
|
||||
|
||||
static inline Aig_Obj_t * Fra_ObjFraig( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemFraig[pObj->Id]; }
|
||||
static inline Aig_Obj_t * Fra_ObjRepr( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemRepr[pObj->Id]; }
|
||||
static inline Aig_Obj_t * Fra_ObjReprFra( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemReprFra[pObj->Id]; }
|
||||
static inline Vec_Ptr_t * Fra_ObjFaninVec( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemFanins[pObj->Id]; }
|
||||
static inline int Fra_ObjSatNum( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemSatNums[pObj->Id]; }
|
||||
static inline Aig_Obj_t * Fra_ObjFraig( Aig_Obj_t * pObj, int i ) { return ((Fra_Man_t *)pObj->pData)->pMemFraig[((Fra_Man_t *)pObj->pData)->nFrames*pObj->Id + i]; }
|
||||
static inline void Fra_ObjSetFraig( Aig_Obj_t * pObj, int i, Aig_Obj_t * pNode ) { ((Fra_Man_t *)pObj->pData)->pMemFraig[((Fra_Man_t *)pObj->pData)->nFrames*pObj->Id + i] = pNode; }
|
||||
|
||||
static inline void Fra_ObjSetFraig( Aig_Obj_t * pObj, Aig_Obj_t * pNode ) { ((Fra_Man_t *)pObj->pData)->pMemFraig[pObj->Id] = pNode; }
|
||||
static inline void Fra_ObjSetRepr( Aig_Obj_t * pObj, Aig_Obj_t * pNode ) { ((Fra_Man_t *)pObj->pData)->pMemRepr[pObj->Id] = pNode; }
|
||||
static inline void Fra_ObjSetReprFra( Aig_Obj_t * pObj, Aig_Obj_t * pNode ) { ((Fra_Man_t *)pObj->pData)->pMemReprFra[pObj->Id] = pNode; }
|
||||
static inline void Fra_ObjSetFaninVec( Aig_Obj_t * pObj, Vec_Ptr_t * vFanins ) { ((Fra_Man_t *)pObj->pData)->pMemFanins[pObj->Id] = vFanins; }
|
||||
static inline void Fra_ObjSetSatNum( Aig_Obj_t * pObj, int Num ) { ((Fra_Man_t *)pObj->pData)->pMemSatNums[pObj->Id] = Num; }
|
||||
static inline Vec_Ptr_t * Fra_ObjFaninVec( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemFanins[pObj->Id]; }
|
||||
static inline void Fra_ObjSetFaninVec( Aig_Obj_t * pObj, Vec_Ptr_t * vFanins ) { ((Fra_Man_t *)pObj->pData)->pMemFanins[pObj->Id] = vFanins; }
|
||||
|
||||
static inline Aig_Obj_t * Fra_ObjChild0Fra( Aig_Obj_t * pObj ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin0(pObj)? Aig_NotCond(Fra_ObjFraig(Aig_ObjFanin0(pObj)), Aig_ObjFaninC0(pObj)) : NULL; }
|
||||
static inline Aig_Obj_t * Fra_ObjChild1Fra( Aig_Obj_t * pObj ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin1(pObj)? Aig_NotCond(Fra_ObjFraig(Aig_ObjFanin1(pObj)), Aig_ObjFaninC1(pObj)) : NULL; }
|
||||
static inline int Fra_ObjSatNum( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pMemSatNums[pObj->Id]; }
|
||||
static inline void Fra_ObjSetSatNum( Aig_Obj_t * pObj, int Num ) { ((Fra_Man_t *)pObj->pData)->pMemSatNums[pObj->Id] = Num; }
|
||||
|
||||
static inline Aig_Obj_t * Fra_ClassObjRepr( Aig_Obj_t * pObj ) { return ((Fra_Man_t *)pObj->pData)->pCla->pMemRepr[pObj->Id]; }
|
||||
static inline void Fra_ClassObjSetRepr( Aig_Obj_t * pObj, Aig_Obj_t * pNode ) { ((Fra_Man_t *)pObj->pData)->pCla->pMemRepr[pObj->Id] = pNode; }
|
||||
|
||||
static inline Aig_Obj_t * Fra_ObjChild0Fra( Aig_Obj_t * pObj, int i ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin0(pObj)? Aig_NotCond(Fra_ObjFraig(Aig_ObjFanin0(pObj),i), Aig_ObjFaninC0(pObj)) : NULL; }
|
||||
static inline Aig_Obj_t * Fra_ObjChild1Fra( Aig_Obj_t * pObj, int i ) { assert( !Aig_IsComplement(pObj) ); return Aig_ObjFanin1(pObj)? Aig_NotCond(Fra_ObjFraig(Aig_ObjFanin1(pObj),i), Aig_ObjFaninC1(pObj)) : NULL; }
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// ITERATORS ///
|
||||
|
|
@ -167,31 +179,40 @@ static inline Aig_Obj_t * Fra_ObjChild1Fra( Aig_Obj_t * pObj ) { assert( !Aig_I
|
|||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*=== fraClass.c ========================================================*/
|
||||
extern void Fra_PrintClasses( Fra_Man_t * p );
|
||||
extern void Fra_CreateClasses( Fra_Man_t * p );
|
||||
extern int Fra_RefineClasses( Fra_Man_t * p );
|
||||
extern int Fra_RefineClasses1( Fra_Man_t * p );
|
||||
extern Fra_Cla_t * Fra_ClassesStart( Aig_Man_t * pAig );
|
||||
extern void Fra_ClassesStop( Fra_Cla_t * p );
|
||||
extern void Fra_ClassesCopyReprs( Fra_Cla_t * p, Vec_Ptr_t * vFailed );
|
||||
extern void Fra_ClassesPrint( Fra_Cla_t * p );
|
||||
extern void Fra_ClassesPrepare( Fra_Cla_t * p );
|
||||
extern int Fra_ClassesRefine( Fra_Cla_t * p );
|
||||
extern int Fra_ClassesRefine1( Fra_Cla_t * p );
|
||||
extern int Fra_ClassesCountLits( Fra_Cla_t * p );
|
||||
/*=== fraCnf.c ========================================================*/
|
||||
extern void Fra_NodeAddToSolver( Fra_Man_t * p, Aig_Obj_t * pOld, Aig_Obj_t * pNew );
|
||||
/*=== fraCore.c ========================================================*/
|
||||
extern Aig_Man_t * Fra_Perform( Aig_Man_t * pManAig, Fra_Par_t * pPars );
|
||||
extern Aig_Man_t * Fra_Choice( Aig_Man_t * pManAig );
|
||||
extern Aig_Man_t * Fra_FraigPerform( Aig_Man_t * pManAig, Fra_Par_t * pPars );
|
||||
extern Aig_Man_t * Fra_FraigChoice( Aig_Man_t * pManAig );
|
||||
extern void Fra_FraigSweep( Fra_Man_t * pManAig );
|
||||
/*=== fraDfs.c ========================================================*/
|
||||
extern int Fra_CheckTfi( Fra_Man_t * p, Aig_Obj_t * pNew, Aig_Obj_t * pOld );
|
||||
/*=== fraInd.c ========================================================*/
|
||||
extern Aig_Man_t * Fra_Induction( Aig_Man_t * p, int nFrames, int fVerbose );
|
||||
/*=== fraMan.c ========================================================*/
|
||||
extern void Fra_ParamsDefault( Fra_Par_t * pParams );
|
||||
extern void Fra_ParamsDefaultSeq( Fra_Par_t * pParams );
|
||||
extern Fra_Man_t * Fra_ManStart( Aig_Man_t * pManAig, Fra_Par_t * pParams );
|
||||
extern void Fra_ManPrepare( Fra_Man_t * p );
|
||||
extern Aig_Man_t * Fra_ManPrepareComb( Fra_Man_t * p );
|
||||
extern void Fra_ManFinalizeComb( Fra_Man_t * p );
|
||||
extern void Fra_ManStop( Fra_Man_t * p );
|
||||
extern void Fra_ManPrint( Fra_Man_t * p );
|
||||
/*=== fraSat.c ========================================================*/
|
||||
extern int Fra_NodesAreEquiv( Fra_Man_t * p, Aig_Obj_t * pOld, Aig_Obj_t * pNew );
|
||||
extern int Fra_NodeIsConst( Fra_Man_t * p, Aig_Obj_t * pNew );
|
||||
/*=== fraSim.c ========================================================*/
|
||||
extern int Fra_NodeHasZeroSim( Fra_Man_t * p, Aig_Obj_t * pObj );
|
||||
extern int Fra_NodeCompareSims( Fra_Man_t * p, Aig_Obj_t * pObj0, Aig_Obj_t * pObj1 );
|
||||
extern int Fra_NodeHasZeroSim( Aig_Obj_t * pObj );
|
||||
extern int Fra_NodeCompareSims( Aig_Obj_t * pObj0, Aig_Obj_t * pObj1 );
|
||||
extern unsigned Fra_NodeHashSims( Aig_Obj_t * pObj );
|
||||
extern void Fra_SavePattern( Fra_Man_t * p );
|
||||
extern void Fra_Simulate( Fra_Man_t * p );
|
||||
extern void Fra_Simulate( Fra_Man_t * p, int fInit );
|
||||
extern void Fra_Resimulate( Fra_Man_t * p );
|
||||
extern int Fra_CheckOutputSims( Fra_Man_t * p );
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,80 @@ static inline void Fra_ObjSetNext( Aig_Obj_t ** ppNexts, Aig_Obj_t * pOb
|
|||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Starts representation of equivalence classes.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Fra_Cla_t * Fra_ClassesStart( Aig_Man_t * pAig )
|
||||
{
|
||||
Fra_Cla_t * p;
|
||||
p = ALLOC( Fra_Cla_t, 1 );
|
||||
memset( p, 0, sizeof(Fra_Cla_t) );
|
||||
p->pAig = pAig;
|
||||
p->pMemRepr = ALLOC( Aig_Obj_t *, (Aig_ManObjIdMax(pAig) + 1) );
|
||||
memset( p->pMemRepr, 0, sizeof(Aig_Obj_t *) * (Aig_ManObjIdMax(pAig) + 1) );
|
||||
p->vClasses = Vec_PtrAlloc( 100 );
|
||||
p->vClasses1 = Vec_PtrAlloc( 100 );
|
||||
p->vClassesTemp = Vec_PtrAlloc( 100 );
|
||||
p->vClassOld = Vec_PtrAlloc( 100 );
|
||||
p->vClassNew = Vec_PtrAlloc( 100 );
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Stop representation of equivalence classes.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_ClassesStop( Fra_Cla_t * p )
|
||||
{
|
||||
free( p->pMemClasses );
|
||||
free( p->pMemRepr );
|
||||
if ( p->vClassesTemp ) Vec_PtrFree( p->vClassesTemp );
|
||||
if ( p->vClassNew ) Vec_PtrFree( p->vClassNew );
|
||||
if ( p->vClassOld ) Vec_PtrFree( p->vClassOld );
|
||||
if ( p->vClasses1 ) Vec_PtrFree( p->vClasses1 );
|
||||
if ( p->vClasses ) Vec_PtrFree( p->vClasses );
|
||||
free( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Starts representation of equivalence classes.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_ClassesCopyReprs( Fra_Cla_t * p, Vec_Ptr_t * vFailed )
|
||||
{
|
||||
Aig_Obj_t * pObj;
|
||||
int i;
|
||||
Aig_ManReprStart( p->pAig, Aig_ManObjIdMax(p->pAig) + 1 );
|
||||
memmove( p->pAig->pReprs, p->pMemRepr, sizeof(Aig_Obj_t *) * (Aig_ManObjIdMax(p->pAig) + 1) );
|
||||
Vec_PtrForEachEntry( vFailed, pObj, i )
|
||||
{
|
||||
// assert( p->pAig->pReprs[pObj->Id] != NULL );
|
||||
p->pAig->pReprs[pObj->Id] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Prints simulation classes.]
|
||||
|
|
@ -75,7 +149,7 @@ void Fra_PrintClass( Aig_Obj_t ** pClass )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_CountClass( Aig_Obj_t ** pClass )
|
||||
int Fra_ClassCount( Aig_Obj_t ** pClass )
|
||||
{
|
||||
Aig_Obj_t * pTemp;
|
||||
int i;
|
||||
|
|
@ -94,19 +168,44 @@ int Fra_CountClass( Aig_Obj_t ** pClass )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_CountPairsClasses( Fra_Man_t * p )
|
||||
int Fra_ClassesCountPairs( Fra_Cla_t * p )
|
||||
{
|
||||
Aig_Obj_t ** pClass;
|
||||
int i, nNodes, nPairs = 0;
|
||||
Vec_PtrForEachEntry( p->vClasses, pClass, i )
|
||||
{
|
||||
nNodes = Fra_CountClass( pClass );
|
||||
nNodes = Fra_ClassCount( pClass );
|
||||
assert( nNodes > 1 );
|
||||
nPairs += nNodes * (nNodes - 1) / 2;
|
||||
}
|
||||
return nPairs;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Count the number of literals.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_ClassesCountLits( Fra_Cla_t * p )
|
||||
{
|
||||
Aig_Obj_t ** pClass;
|
||||
int i, nNodes, nLits = 0;
|
||||
nLits = Vec_PtrSize( p->vClasses1 );
|
||||
Vec_PtrForEachEntry( p->vClasses, pClass, i )
|
||||
{
|
||||
nNodes = Fra_ClassCount( pClass );
|
||||
assert( nNodes > 1 );
|
||||
nLits += nNodes - 1;
|
||||
}
|
||||
return nLits;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Prints simulation classes.]
|
||||
|
|
@ -118,95 +217,19 @@ int Fra_CountPairsClasses( Fra_Man_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_PrintClasses( Fra_Man_t * p )
|
||||
void Fra_ClassesPrint( Fra_Cla_t * p )
|
||||
{
|
||||
Aig_Obj_t ** pClass;
|
||||
int i;
|
||||
printf( "Total classes = %d. Total pairs = %d.\n", Vec_PtrSize(p->vClasses), Fra_CountPairsClasses(p) );
|
||||
printf( "Total classes = %d. Total pairs = %d.\n", Vec_PtrSize(p->vClasses), Fra_ClassesCountPairs(p) );
|
||||
Vec_PtrForEachEntry( p->vClasses, pClass, i )
|
||||
{
|
||||
// printf( "%3d (%3d) : ", Fra_CountClass(pClass) );
|
||||
// Fra_PrintClass( pClass );
|
||||
printf( "%3d (%3d) : ", i, Fra_ClassCount(pClass) );
|
||||
Fra_PrintClass( pClass );
|
||||
}
|
||||
printf( "\n" );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Computes hash value of the node using its simulation info.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
unsigned Fra_NodeHash( Fra_Man_t * p, Aig_Obj_t * pObj )
|
||||
{
|
||||
static int s_FPrimes[128] = {
|
||||
1009, 1049, 1093, 1151, 1201, 1249, 1297, 1361, 1427, 1459,
|
||||
1499, 1559, 1607, 1657, 1709, 1759, 1823, 1877, 1933, 1997,
|
||||
2039, 2089, 2141, 2213, 2269, 2311, 2371, 2411, 2467, 2543,
|
||||
2609, 2663, 2699, 2741, 2797, 2851, 2909, 2969, 3037, 3089,
|
||||
3169, 3221, 3299, 3331, 3389, 3461, 3517, 3557, 3613, 3671,
|
||||
3719, 3779, 3847, 3907, 3943, 4013, 4073, 4129, 4201, 4243,
|
||||
4289, 4363, 4441, 4493, 4549, 4621, 4663, 4729, 4793, 4871,
|
||||
4933, 4973, 5021, 5087, 5153, 5227, 5281, 5351, 5417, 5471,
|
||||
5519, 5573, 5651, 5693, 5749, 5821, 5861, 5923, 6011, 6073,
|
||||
6131, 6199, 6257, 6301, 6353, 6397, 6481, 6563, 6619, 6689,
|
||||
6737, 6803, 6863, 6917, 6977, 7027, 7109, 7187, 7237, 7309,
|
||||
7393, 7477, 7523, 7561, 7607, 7681, 7727, 7817, 7877, 7933,
|
||||
8011, 8039, 8059, 8081, 8093, 8111, 8123, 8147
|
||||
};
|
||||
unsigned * pSims;
|
||||
unsigned uHash;
|
||||
int i;
|
||||
assert( p->nSimWords <= 128 );
|
||||
uHash = 0;
|
||||
pSims = Fra_ObjSim(pObj);
|
||||
for ( i = 0; i < p->nSimWords; i++ )
|
||||
uHash ^= pSims[i] * s_FPrimes[i];
|
||||
return uHash;
|
||||
}
|
||||
|
||||
/**Function********************************************************************
|
||||
|
||||
Synopsis [Returns the next prime >= p.]
|
||||
|
||||
Description [Copied from CUDD, for stand-aloneness.]
|
||||
|
||||
SideEffects [None]
|
||||
|
||||
SeeAlso []
|
||||
|
||||
******************************************************************************/
|
||||
unsigned int Cudd_PrimeFra( unsigned int p )
|
||||
{
|
||||
int i,pn;
|
||||
|
||||
p--;
|
||||
do {
|
||||
p++;
|
||||
if (p&1) {
|
||||
pn = 1;
|
||||
i = 3;
|
||||
while ((unsigned) (i * i) <= p) {
|
||||
if (p % i == 0) {
|
||||
pn = 0;
|
||||
break;
|
||||
}
|
||||
i += 2;
|
||||
}
|
||||
} else {
|
||||
pn = 0;
|
||||
}
|
||||
} while (!pn);
|
||||
return(p);
|
||||
|
||||
} /* end of Cudd_Prime */
|
||||
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Creates initial simulation classes.]
|
||||
|
|
@ -218,31 +241,31 @@ unsigned int Cudd_PrimeFra( unsigned int p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_CreateClasses( Fra_Man_t * p )
|
||||
void Fra_ClassesPrepare( Fra_Cla_t * p )
|
||||
{
|
||||
Aig_Obj_t ** ppTable, ** ppNexts;
|
||||
Aig_Obj_t * pObj, * pTemp;
|
||||
int i, k, nTableSize, nEntries, nNodes, iEntry;
|
||||
|
||||
// allocate the hash table hashing simulation info into nodes
|
||||
nTableSize = Cudd_PrimeFra( Aig_ManObjIdMax(p->pManAig) + 1 );
|
||||
nTableSize = Aig_PrimeCudd( Aig_ManObjIdMax(p->pAig) + 1 );
|
||||
ppTable = ALLOC( Aig_Obj_t *, nTableSize );
|
||||
ppNexts = ALLOC( Aig_Obj_t *, nTableSize );
|
||||
memset( ppTable, 0, sizeof(Aig_Obj_t *) * nTableSize );
|
||||
|
||||
// add all the nodes to the hash table
|
||||
Vec_PtrClear( p->vClasses1 );
|
||||
Aig_ManForEachObj( p->pManAig, pObj, i )
|
||||
Aig_ManForEachObj( p->pAig, pObj, i )
|
||||
{
|
||||
if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsPi(pObj) )
|
||||
continue;
|
||||
// hash the node by its simulation info
|
||||
iEntry = Fra_NodeHash( p, pObj ) % nTableSize;
|
||||
iEntry = Fra_NodeHashSims( pObj ) % nTableSize;
|
||||
// check if the node belongs to the class of constant 1
|
||||
if ( iEntry == 0 && Fra_NodeHasZeroSim( p, pObj ) )
|
||||
if ( iEntry == 0 && Fra_NodeHasZeroSim( pObj ) )
|
||||
{
|
||||
Vec_PtrPush( p->vClasses1, pObj );
|
||||
Fra_ObjSetRepr( pObj, Aig_ManConst1(p->pManAig) );
|
||||
Fra_ClassObjSetRepr( pObj, Aig_ManConst1(p->pAig) );
|
||||
continue;
|
||||
}
|
||||
// add the node to the class
|
||||
|
|
@ -281,7 +304,7 @@ void Fra_CreateClasses( Fra_Man_t * p )
|
|||
// copy the entries into storage in the topological order
|
||||
Vec_PtrClear( p->vClasses );
|
||||
nEntries = 0;
|
||||
Aig_ManForEachObj( p->pManAig, pObj, i )
|
||||
Aig_ManForEachObj( p->pAig, pObj, i )
|
||||
{
|
||||
if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsPi(pObj) )
|
||||
continue;
|
||||
|
|
@ -304,7 +327,7 @@ void Fra_CreateClasses( Fra_Man_t * p )
|
|||
pTemp = Fra_ObjNext(ppNexts, pTemp), k++ )
|
||||
{
|
||||
p->pMemClasses[2*nEntries+nNodes-k] = pTemp;
|
||||
Fra_ObjSetRepr( pTemp, pObj );
|
||||
Fra_ClassObjSetRepr( pTemp, pObj );
|
||||
}
|
||||
// add as many empty entries
|
||||
// memset( p->pMemClasses + 2*nEntries + nNodes, 0, sizeof(Aig_Obj_t *) * nNodes );
|
||||
|
|
@ -315,7 +338,7 @@ void Fra_CreateClasses( Fra_Man_t * p )
|
|||
free( ppTable );
|
||||
free( ppNexts );
|
||||
// now it is time to refine the classes
|
||||
Fra_RefineClasses( p );
|
||||
Fra_ClassesRefine( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -329,7 +352,7 @@ void Fra_CreateClasses( Fra_Man_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Obj_t ** Fra_RefineClassOne( Fra_Man_t * p, Aig_Obj_t ** ppClass )
|
||||
Aig_Obj_t ** Fra_RefineClassOne( Fra_Cla_t * p, Aig_Obj_t ** ppClass )
|
||||
{
|
||||
Aig_Obj_t * pObj, ** ppThis;
|
||||
int i;
|
||||
|
|
@ -337,7 +360,7 @@ Aig_Obj_t ** Fra_RefineClassOne( Fra_Man_t * p, Aig_Obj_t ** ppClass )
|
|||
|
||||
// check if the class is going to be refined
|
||||
for ( ppThis = ppClass + 1; pObj = *ppThis; ppThis++ )
|
||||
if ( !Fra_NodeCompareSims(p, ppClass[0], pObj) )
|
||||
if ( !Fra_NodeCompareSims(ppClass[0], pObj) )
|
||||
break;
|
||||
if ( pObj == NULL )
|
||||
return NULL;
|
||||
|
|
@ -346,7 +369,7 @@ Aig_Obj_t ** Fra_RefineClassOne( Fra_Man_t * p, Aig_Obj_t ** ppClass )
|
|||
Vec_PtrClear( p->vClassNew );
|
||||
Vec_PtrPush( p->vClassOld, ppClass[0] );
|
||||
for ( ppThis = ppClass + 1; pObj = *ppThis; ppThis++ )
|
||||
if ( Fra_NodeCompareSims(p, ppClass[0], pObj) )
|
||||
if ( Fra_NodeCompareSims(ppClass[0], pObj) )
|
||||
Vec_PtrPush( p->vClassOld, pObj );
|
||||
else
|
||||
Vec_PtrPush( p->vClassNew, pObj );
|
||||
|
|
@ -364,7 +387,7 @@ Aig_Obj_t ** Fra_RefineClassOne( Fra_Man_t * p, Aig_Obj_t ** ppClass )
|
|||
{
|
||||
ppClass[i] = pObj;
|
||||
ppClass[Vec_PtrSize(p->vClassOld)+i] = NULL;
|
||||
Fra_ObjSetRepr( pObj, i? ppClass[0] : NULL );
|
||||
Fra_ClassObjSetRepr( pObj, i? ppClass[0] : NULL );
|
||||
}
|
||||
ppClass += 2*Vec_PtrSize(p->vClassOld);
|
||||
// put the new nodes into the class memory
|
||||
|
|
@ -372,7 +395,7 @@ Aig_Obj_t ** Fra_RefineClassOne( Fra_Man_t * p, Aig_Obj_t ** ppClass )
|
|||
{
|
||||
ppClass[i] = pObj;
|
||||
ppClass[Vec_PtrSize(p->vClassNew)+i] = NULL;
|
||||
Fra_ObjSetRepr( pObj, i? ppClass[0] : NULL );
|
||||
Fra_ClassObjSetRepr( pObj, i? ppClass[0] : NULL );
|
||||
}
|
||||
return ppClass;
|
||||
}
|
||||
|
|
@ -388,7 +411,7 @@ Aig_Obj_t ** Fra_RefineClassOne( Fra_Man_t * p, Aig_Obj_t ** ppClass )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_RefineClassLastIter( Fra_Man_t * p, Vec_Ptr_t * vClasses )
|
||||
int Fra_RefineClassLastIter( Fra_Cla_t * p, Vec_Ptr_t * vClasses )
|
||||
{
|
||||
Aig_Obj_t ** pClass, ** pClass2;
|
||||
int nRefis;
|
||||
|
|
@ -423,19 +446,12 @@ int Fra_RefineClassLastIter( Fra_Man_t * p, Vec_Ptr_t * vClasses )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_RefineClasses( Fra_Man_t * p )
|
||||
int Fra_ClassesRefine( Fra_Cla_t * p )
|
||||
{
|
||||
Vec_Ptr_t * vTemp;
|
||||
Aig_Obj_t ** pClass;
|
||||
int clk, i, nRefis;
|
||||
// check if some outputs already became non-constant
|
||||
// this is a special case when computation can be stopped!!!
|
||||
if ( p->pPars->fProve )
|
||||
Fra_CheckOutputSims( p );
|
||||
if ( p->pManFraig->pData )
|
||||
return 0;
|
||||
int i, nRefis;
|
||||
// refine the classes
|
||||
clk = clock();
|
||||
nRefis = 0;
|
||||
Vec_PtrClear( p->vClassesTemp );
|
||||
Vec_PtrForEachEntry( p->vClasses, pClass, i )
|
||||
|
|
@ -449,7 +465,7 @@ clk = clock();
|
|||
vTemp = p->vClassesTemp;
|
||||
p->vClassesTemp = p->vClasses;
|
||||
p->vClasses = vTemp;
|
||||
p->timeRef += clock() - clk;
|
||||
p->fRefinement = (nRefis > 0);
|
||||
return nRefis;
|
||||
}
|
||||
|
||||
|
|
@ -464,22 +480,21 @@ p->timeRef += clock() - clk;
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_RefineClasses1( Fra_Man_t * p )
|
||||
int Fra_ClassesRefine1( Fra_Cla_t * p )
|
||||
{
|
||||
Aig_Obj_t * pObj, ** ppClass;
|
||||
int i, k, nRefis, clk;
|
||||
int i, k, nRefis;
|
||||
// check if there is anything to refine
|
||||
if ( Vec_PtrSize(p->vClasses1) == 0 )
|
||||
return 0;
|
||||
clk = clock();
|
||||
// make sure constant 1 class contains only non-constant nodes
|
||||
assert( Vec_PtrEntry(p->vClasses1,0) != Aig_ManConst1(p->pManAig) );
|
||||
assert( Vec_PtrEntry(p->vClasses1,0) != Aig_ManConst1(p->pAig) );
|
||||
// collect all the nodes to be refined
|
||||
k = 0;
|
||||
Vec_PtrClear( p->vClassNew );
|
||||
Vec_PtrForEachEntry( p->vClasses1, pObj, i )
|
||||
{
|
||||
if ( Fra_NodeHasZeroSim( p, pObj ) )
|
||||
if ( Fra_NodeHasZeroSim( pObj ) )
|
||||
Vec_PtrWriteEntry( p->vClasses1, k++, pObj );
|
||||
else
|
||||
Vec_PtrPush( p->vClassNew, pObj );
|
||||
|
|
@ -487,9 +502,10 @@ clk = clock();
|
|||
Vec_PtrShrink( p->vClasses1, k );
|
||||
if ( Vec_PtrSize(p->vClassNew) == 0 )
|
||||
return 0;
|
||||
p->fRefinement = 1;
|
||||
if ( Vec_PtrSize(p->vClassNew) == 1 )
|
||||
{
|
||||
Fra_ObjSetRepr( Vec_PtrEntry(p->vClassNew,0), NULL );
|
||||
Fra_ClassObjSetRepr( Vec_PtrEntry(p->vClassNew,0), NULL );
|
||||
return 1;
|
||||
}
|
||||
// create a new class composed of these nodes
|
||||
|
|
@ -499,12 +515,11 @@ clk = clock();
|
|||
{
|
||||
ppClass[i] = pObj;
|
||||
ppClass[Vec_PtrSize(p->vClassNew)+i] = NULL;
|
||||
Fra_ObjSetRepr( pObj, i? ppClass[0] : NULL );
|
||||
Fra_ClassObjSetRepr( pObj, i? ppClass[0] : NULL );
|
||||
}
|
||||
Vec_PtrPush( p->vClasses, ppClass );
|
||||
// iteratively refine this class
|
||||
nRefis = 1 + Fra_RefineClassLastIter( p, p->vClasses );
|
||||
p->timeRef += clock() - clk;
|
||||
return nRefis;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,24 +39,24 @@
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Obj_t * Fra_And( Fra_Man_t * p, Aig_Obj_t * pObjOld )
|
||||
Aig_Obj_t * Fra_And( Fra_Man_t * p, Aig_Obj_t * pObj )
|
||||
{
|
||||
Aig_Obj_t * pObjOldRepr, * pObjFraig, * pFanin0Fraig, * pFanin1Fraig, * pObjOldReprFraig;
|
||||
Aig_Obj_t * pObjRepr, * pObjFraig, * pFanin0Fraig, * pFanin1Fraig, * pObjReprFraig;
|
||||
int RetValue;
|
||||
assert( !Aig_IsComplement(pObjOld) );
|
||||
assert( Aig_ObjIsNode(pObjOld) );
|
||||
assert( !Aig_IsComplement(pObj) );
|
||||
assert( Aig_ObjIsNode(pObj) );
|
||||
// get the fraiged fanins
|
||||
pFanin0Fraig = Fra_ObjChild0Fra(pObjOld);
|
||||
pFanin1Fraig = Fra_ObjChild1Fra(pObjOld);
|
||||
pFanin0Fraig = Fra_ObjChild0Fra(pObj,0);
|
||||
pFanin1Fraig = Fra_ObjChild1Fra(pObj,0);
|
||||
// get the fraiged node
|
||||
pObjFraig = Aig_And( p->pManFraig, pFanin0Fraig, pFanin1Fraig );
|
||||
if ( Aig_ObjIsConst1(Aig_Regular(pObjFraig)) )
|
||||
return pObjFraig;
|
||||
Aig_Regular(pObjFraig)->pData = p;
|
||||
// get representative of this class
|
||||
pObjOldRepr = Fra_ObjRepr(pObjOld);
|
||||
if ( pObjOldRepr == NULL || // this is a unique node
|
||||
(!p->pPars->fDoSparse && pObjOldRepr == Aig_ManConst1(p->pManAig)) ) // this is a sparse node
|
||||
pObjRepr = Fra_ClassObjRepr(pObj);
|
||||
if ( pObjRepr == NULL || // this is a unique node
|
||||
(!p->pPars->fDoSparse && pObjRepr == Aig_ManConst1(p->pManAig)) ) // this is a sparse node
|
||||
{
|
||||
assert( Aig_Regular(pFanin0Fraig) != Aig_Regular(pFanin1Fraig) );
|
||||
assert( Aig_Regular(pObjFraig) != Aig_Regular(pFanin0Fraig) );
|
||||
|
|
@ -64,58 +64,38 @@ Aig_Obj_t * Fra_And( Fra_Man_t * p, Aig_Obj_t * pObjOld )
|
|||
return pObjFraig;
|
||||
}
|
||||
// get the fraiged representative
|
||||
pObjOldReprFraig = Fra_ObjFraig(pObjOldRepr);
|
||||
pObjReprFraig = Fra_ObjFraig(pObjRepr,0);
|
||||
// if the fraiged nodes are the same, return
|
||||
if ( Aig_Regular(pObjFraig) == Aig_Regular(pObjOldReprFraig) )
|
||||
if ( Aig_Regular(pObjFraig) == Aig_Regular(pObjReprFraig) )
|
||||
return pObjFraig;
|
||||
assert( Aig_Regular(pObjFraig) != Aig_ManConst1(p->pManFraig) );
|
||||
// printf( "Node = %d. Repr = %d.\n", pObjOld->Id, pObjOldRepr->Id );
|
||||
// printf( "Node = %d. Repr = %d.\n", pObj->Id, pObjRepr->Id );
|
||||
|
||||
// if they are proved different, the c-ex will be in p->pPatWords
|
||||
RetValue = Fra_NodesAreEquiv( p, Aig_Regular(pObjOldReprFraig), Aig_Regular(pObjFraig) );
|
||||
RetValue = Fra_NodesAreEquiv( p, Aig_Regular(pObjReprFraig), Aig_Regular(pObjFraig) );
|
||||
if ( RetValue == 1 ) // proved equivalent
|
||||
{
|
||||
// pObjOld->fMarkA = 1;
|
||||
if ( p->pPars->fChoicing && !Fra_CheckTfi( p, Aig_Regular(pObjFraig), Aig_Regular(pObjOldReprFraig) ) )
|
||||
{
|
||||
// Fra_ObjSetReprFra( Aig_Regular(pObjFraig), Aig_Regular(pObjOldReprFraig) );
|
||||
Aig_Obj_t * pObjNew = Aig_Regular(pObjFraig);
|
||||
Aig_Obj_t * pObjOld = Aig_Regular(pObjOldReprFraig);
|
||||
Aig_Obj_t * pTemp;
|
||||
assert( pObjNew != pObjOld );
|
||||
for ( pTemp = Fra_ObjReprFra(pObjOld); pTemp; pTemp = Fra_ObjReprFra(pTemp) )
|
||||
if ( pTemp == pObjNew )
|
||||
break;
|
||||
if ( pTemp == NULL )
|
||||
{
|
||||
Fra_ObjSetReprFra( pObjNew, Fra_ObjReprFra(pObjOld) );
|
||||
Fra_ObjSetReprFra( pObjOld, pObjNew );
|
||||
assert( pObjOld != Fra_ObjReprFra(pObjOld) );
|
||||
assert( pObjNew != Fra_ObjReprFra(pObjNew) );
|
||||
p->nChoices++;
|
||||
|
||||
assert( pObjOld->Id < pObjNew->Id );
|
||||
}
|
||||
else
|
||||
p->nChoicesFake++;
|
||||
}
|
||||
return Aig_NotCond( pObjOldReprFraig, pObjOld->fPhase ^ pObjOldRepr->fPhase );
|
||||
// pObj->fMarkA = 1;
|
||||
// if ( p->pPars->fChoicing )
|
||||
// Aig_ObjCreateRepr( p->pManFraig, Aig_Regular(pObjReprFraig), Aig_Regular(pObjFraig) );
|
||||
return Aig_NotCond( pObjReprFraig, pObj->fPhase ^ pObjRepr->fPhase );
|
||||
}
|
||||
if ( RetValue == -1 ) // failed
|
||||
{
|
||||
static int Counter = 0;
|
||||
char FileName[20];
|
||||
Aig_Man_t * pTemp;
|
||||
Aig_Obj_t * pObj;
|
||||
Aig_Obj_t * pNode;
|
||||
int i;
|
||||
|
||||
Aig_Obj_t * ppNodes[2] = { Aig_Regular(pObjOldReprFraig), Aig_Regular(pObjFraig) };
|
||||
Aig_Obj_t * ppNodes[2] = { Aig_Regular(pObjReprFraig), Aig_Regular(pObjFraig) };
|
||||
// Vec_Ptr_t * vNodes;
|
||||
|
||||
Vec_PtrPush( p->vTimeouts, pObj );
|
||||
if ( !p->pPars->fSpeculate )
|
||||
return pObjFraig;
|
||||
// substitute the node
|
||||
// pObjOld->fMarkB = 1;
|
||||
// pObj->fMarkB = 1;
|
||||
p->nSpeculs++;
|
||||
|
||||
pTemp = Aig_ManExtractMiter( p->pManFraig, ppNodes, 2 );
|
||||
|
|
@ -124,21 +104,18 @@ Aig_Obj_t * Fra_And( Fra_Man_t * p, Aig_Obj_t * pObjOld )
|
|||
printf( "Speculation cone with %d nodes was written into file \"%s\".\n", Aig_ManNodeNum(pTemp), FileName );
|
||||
Aig_ManStop( pTemp );
|
||||
|
||||
Aig_ManForEachObj( p->pManFraig, pObj, i )
|
||||
pObj->pData = p;
|
||||
Aig_ManForEachObj( p->pManFraig, pNode, i )
|
||||
pNode->pData = p;
|
||||
|
||||
// vNodes = Aig_ManDfsNodes( p->pManFraig, ppNodes, 2 );
|
||||
// printf( "Cone=%d ", Vec_PtrSize(vNodes) );
|
||||
// Vec_PtrFree( vNodes );
|
||||
|
||||
return Aig_NotCond( pObjOldReprFraig, pObjOld->fPhase ^ pObjOldRepr->fPhase );
|
||||
return Aig_NotCond( pObjReprFraig, pObj->fPhase ^ pObjRepr->fPhase );
|
||||
}
|
||||
// printf( "Disproved %d and %d.\n", pObjOldRepr->Id, pObjOld->Id );
|
||||
// simulate the counter-example and return the Fraig node
|
||||
// printf( "Representaive before = %d.\n", Fra_ObjRepr(pObjOld)? Fra_ObjRepr(pObjOld)->Id : -1 );
|
||||
Fra_Resimulate( p );
|
||||
// printf( "Representaive after = %d.\n", Fra_ObjRepr(pObjOld)? Fra_ObjRepr(pObjOld)->Id : -1 );
|
||||
assert( Fra_ObjRepr(pObjOld) != pObjOldRepr );
|
||||
assert( Fra_ClassObjRepr(pObj) != pObjRepr );
|
||||
return pObjFraig;
|
||||
}
|
||||
|
||||
|
|
@ -153,13 +130,13 @@ Aig_Obj_t * Fra_And( Fra_Man_t * p, Aig_Obj_t * pObjOld )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_Sweep( Fra_Man_t * p )
|
||||
void Fra_FraigSweep( Fra_Man_t * p )
|
||||
{
|
||||
ProgressBar * pProgress;
|
||||
Aig_Obj_t * pObj, * pObjNew;
|
||||
int i, k = 0;
|
||||
p->nClassesZero = Vec_PtrSize(p->vClasses1);
|
||||
p->nClassesBeg = Vec_PtrSize(p->vClasses) + (int)(Vec_PtrSize(p->vClasses1) > 0);
|
||||
p->nClassesZero = Vec_PtrSize(p->pCla->vClasses1);
|
||||
p->nClassesBeg = Vec_PtrSize(p->pCla->vClasses) + (int)(Vec_PtrSize(p->pCla->vClasses1) > 0);
|
||||
// duplicate internal nodes
|
||||
pProgress = Extra_ProgressBarStart( stdout, Aig_ManObjIdMax(p->pManAig) );
|
||||
Aig_ManForEachNode( p->pManAig, pObj, i )
|
||||
|
|
@ -167,36 +144,18 @@ p->nClassesBeg = Vec_PtrSize(p->vClasses) + (int)(Vec_PtrSize(p->vClasses1) > 0
|
|||
Extra_ProgressBarUpdate( pProgress, i, NULL );
|
||||
// default to simple strashing if simulation detected a counter-example for a PO
|
||||
if ( p->pManFraig->pData )
|
||||
pObjNew = Aig_And( p->pManFraig, Fra_ObjChild0Fra(pObj), Fra_ObjChild1Fra(pObj) );
|
||||
pObjNew = Aig_And( p->pManFraig, Fra_ObjChild0Fra(pObj,0), Fra_ObjChild1Fra(pObj,0) );
|
||||
else
|
||||
pObjNew = Fra_And( p, pObj ); // pObjNew can be complemented
|
||||
Fra_ObjSetFraig( pObj, pObjNew );
|
||||
assert( Fra_ObjFraig(pObj) != NULL );
|
||||
Fra_ObjSetFraig( pObj, 0, pObjNew );
|
||||
}
|
||||
Extra_ProgressBarStop( pProgress );
|
||||
p->nClassesEnd = Vec_PtrSize(p->vClasses) + (int)(Vec_PtrSize(p->vClasses1) > 0);
|
||||
p->nClassesEnd = Vec_PtrSize(p->pCla->vClasses) + (int)(Vec_PtrSize(p->pCla->vClasses1) > 0);
|
||||
// try to prove the outputs of the miter
|
||||
p->nNodesMiter = Aig_ManNodeNum(p->pManFraig);
|
||||
// Fra_MiterStatus( p->pManFraig );
|
||||
// if ( p->pPars->fProve && p->pManFraig->pData == NULL )
|
||||
// Fra_MiterProve( p );
|
||||
// add the POs
|
||||
Aig_ManForEachPo( p->pManAig, pObj, i )
|
||||
Aig_ObjCreatePo( p->pManFraig, Fra_ObjChild0Fra(pObj) );
|
||||
// postprocess
|
||||
Aig_ManCleanMarkB( p->pManFraig );
|
||||
if ( p->pPars->fChoicing )
|
||||
{
|
||||
// transfer the representative info
|
||||
p->pManFraig->pReprs = p->pMemReprFra;
|
||||
p->pMemReprFra = NULL;
|
||||
// printf( "The number of choices = %d. Fake choices = %d.\n", p->nChoices, p->nChoicesFake );
|
||||
}
|
||||
else
|
||||
{
|
||||
// remove dangling nodes
|
||||
Aig_ManCleanup( p->pManFraig );
|
||||
}
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -210,7 +169,7 @@ p->nClassesEnd = Vec_PtrSize(p->vClasses) + (int)(Vec_PtrSize(p->vClasses1) > 0)
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Man_t * Fra_Perform( Aig_Man_t * pManAig, Fra_Par_t * pPars )
|
||||
Aig_Man_t * Fra_FraigPerform( Aig_Man_t * pManAig, Fra_Par_t * pPars )
|
||||
{
|
||||
Fra_Man_t * p;
|
||||
Aig_Man_t * pManAigNew;
|
||||
|
|
@ -220,9 +179,26 @@ Aig_Man_t * Fra_Perform( Aig_Man_t * pManAig, Fra_Par_t * pPars )
|
|||
clk = clock();
|
||||
assert( Aig_ManLatchNum(pManAig) == 0 );
|
||||
p = Fra_ManStart( pManAig, pPars );
|
||||
Fra_Simulate( p );
|
||||
Fra_Sweep( p );
|
||||
pManAigNew = p->pManFraig;
|
||||
p->pManFraig = Fra_ManPrepareComb( p );
|
||||
Fra_Simulate( p, 0 );
|
||||
if ( p->pPars->fChoicing )
|
||||
Aig_ManReprStart( p->pManFraig, Aig_ManObjIdMax(p->pManAig)+1 );
|
||||
Fra_FraigSweep( p );
|
||||
Fra_ManFinalizeComb( p );
|
||||
if ( p->pPars->fChoicing )
|
||||
{
|
||||
Fra_ClassesCopyReprs( p->pCla, p->vTimeouts );
|
||||
pManAigNew = Aig_ManDupRepr( p->pManAig );
|
||||
Aig_ManCreateChoices( pManAigNew );
|
||||
Aig_ManStop( p->pManFraig );
|
||||
p->pManFraig = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
Aig_ManCleanup( p->pManFraig );
|
||||
pManAigNew = p->pManFraig;
|
||||
p->pManFraig = NULL;
|
||||
}
|
||||
p->timeTotal = clock() - clk;
|
||||
Fra_ManStop( p );
|
||||
return pManAigNew;
|
||||
|
|
@ -239,7 +215,7 @@ p->timeTotal = clock() - clk;
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Man_t * Fra_Choice( Aig_Man_t * pManAig )
|
||||
Aig_Man_t * Fra_FraigChoice( Aig_Man_t * pManAig )
|
||||
{
|
||||
Fra_Par_t Pars, * pPars = &Pars;
|
||||
Fra_ParamsDefault( pPars );
|
||||
|
|
@ -249,7 +225,7 @@ Aig_Man_t * Fra_Choice( Aig_Man_t * pManAig )
|
|||
pPars->fDoSparse = 1;
|
||||
pPars->fSpeculate = 0;
|
||||
pPars->fChoicing = 1;
|
||||
return Fra_Perform( pManAig, pPars );
|
||||
return Fra_FraigPerform( pManAig, pPars );
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -1,87 +0,0 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [fraDfs.c]
|
||||
|
||||
SystemName [ABC: Logic synthesis and verification system.]
|
||||
|
||||
PackageName [Fraig FRAIG package.]
|
||||
|
||||
Synopsis []
|
||||
|
||||
Author [Alan Mishchenko]
|
||||
|
||||
Affiliation [UC Berkeley]
|
||||
|
||||
Date [Ver. 1.0. Started - June 30, 2007.]
|
||||
|
||||
Revision [$Id: fraDfs.c,v 1.00 2007/06/30 00:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
#include "fra.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Returns 1 if pOld is in the TFI of pNew.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_CheckTfi_rec( Fra_Man_t * p, Aig_Obj_t * pNode, Aig_Obj_t * pOld )
|
||||
{
|
||||
// check the trivial cases
|
||||
if ( pNode == NULL )
|
||||
return 0;
|
||||
// if ( pNode->Id < pOld->Id ) // cannot use because of choicesof pNode
|
||||
// return 0;
|
||||
if ( pNode == pOld )
|
||||
return 1;
|
||||
// skip the visited node
|
||||
if ( Aig_ObjIsTravIdCurrent(p->pManFraig, pNode) )
|
||||
return 0;
|
||||
Aig_ObjSetTravIdCurrent(p->pManFraig, pNode);
|
||||
// check the children
|
||||
if ( Fra_CheckTfi_rec( p, Aig_ObjFanin0(pNode), pOld ) )
|
||||
return 1;
|
||||
if ( Fra_CheckTfi_rec( p, Aig_ObjFanin1(pNode), pOld ) )
|
||||
return 1;
|
||||
// check equivalent nodes
|
||||
return Fra_CheckTfi_rec( p, Fra_ObjReprFra(pNode), pOld );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Returns 1 if pOld is in the TFI of pNew.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_CheckTfi( Fra_Man_t * p, Aig_Obj_t * pNew, Aig_Obj_t * pOld )
|
||||
{
|
||||
assert( !Aig_IsComplement(pNew) );
|
||||
assert( !Aig_IsComplement(pOld) );
|
||||
Aig_ManIncrementTravId( p->pManFraig );
|
||||
return Fra_CheckTfi_rec( p, pNew, pOld );
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [fraInd.c]
|
||||
|
||||
SystemName [ABC: Logic synthesis and verification system.]
|
||||
|
||||
PackageName [New FRAIG package.]
|
||||
|
||||
Synopsis [Inductive prover.]
|
||||
|
||||
Author [Alan Mishchenko]
|
||||
|
||||
Affiliation [UC Berkeley]
|
||||
|
||||
Date [Ver. 1.0. Started - June 30, 2007.]
|
||||
|
||||
Revision [$Id: fraInd.c,v 1.00 2007/06/30 00:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
#include "fra.h"
|
||||
#include "cnf.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Prepares the inductive case with speculative reduction.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Man_t * Fra_FramesWithClasses( Fra_Man_t * p )
|
||||
{
|
||||
Aig_Man_t * pManFraig;
|
||||
Aig_Obj_t * pObj, * pObjRepr, * pObjNew, * pObjReprNew, * pMiter;
|
||||
Aig_Obj_t ** pLatches;
|
||||
int i, k, f;
|
||||
assert( p->pManFraig == NULL );
|
||||
assert( Aig_ManInitNum(p->pManAig) > 0 );
|
||||
assert( Aig_ManInitNum(p->pManAig) < Aig_ManPiNum(p->pManAig) );
|
||||
|
||||
// start the fraig package
|
||||
pManFraig = Aig_ManStart( (Aig_ManObjIdMax(p->pManAig) + 1) * p->nFrames );
|
||||
pManFraig->vInits = Vec_IntDup(p->pManAig->vInits);
|
||||
// create PI nodes for the frames
|
||||
for ( f = 0; f < p->nFrames; f++ )
|
||||
{
|
||||
Fra_ObjSetFraig( Aig_ManConst1(p->pManAig), f, Aig_ManConst1(pManFraig) );
|
||||
Aig_ManForEachPiSeq( p->pManAig, pObj, i )
|
||||
Fra_ObjSetFraig( pObj, f, Aig_ObjCreatePi(pManFraig) );
|
||||
}
|
||||
// create latches for the first frame
|
||||
Aig_ManForEachLoSeq( p->pManAig, pObj, i )
|
||||
Fra_ObjSetFraig( pObj, 0, Aig_ObjCreatePi(pManFraig) );
|
||||
|
||||
// add timeframes
|
||||
pLatches = ALLOC( Aig_Obj_t *, Aig_ManInitNum(p->pManAig) );
|
||||
for ( f = 0; f < p->nFrames - 1; f++ )
|
||||
{
|
||||
// add internal nodes of this frame
|
||||
Aig_ManForEachNode( p->pManAig, pObj, i )
|
||||
{
|
||||
pObjNew = Aig_And( pManFraig, Fra_ObjChild0Fra(pObj,f), Fra_ObjChild1Fra(pObj,f) );
|
||||
Fra_ObjSetFraig( pObj, f, pObjNew );
|
||||
// skip nodes without representative
|
||||
if ( (pObjRepr = Fra_ClassObjRepr(pObj)) == NULL )
|
||||
continue;
|
||||
assert( pObjRepr->Id < pObj->Id );
|
||||
// get the new node of the representative
|
||||
pObjReprNew = Fra_ObjFraig( pObjRepr, f );
|
||||
// if this is the same node, no need to add constraints
|
||||
if ( Aig_Regular(pObjNew) == Aig_Regular(pObjReprNew) )
|
||||
continue;
|
||||
// these are different nodes
|
||||
// perform speculative reduction
|
||||
Fra_ObjSetFraig( pObj, f, Aig_NotCond(pObjReprNew, pObj->fPhase ^ pObjRepr->fPhase) );
|
||||
// add the constraint
|
||||
pMiter = Aig_Exor( pManFraig, pObjNew, pObjReprNew );
|
||||
pMiter = Aig_NotCond( pMiter, Aig_Regular(pMiter)->fPhase ^ Aig_IsComplement(pMiter) );
|
||||
Aig_ObjCreatePo( pManFraig, pMiter );
|
||||
}
|
||||
// save the latch input values
|
||||
k = 0;
|
||||
Aig_ManForEachLiSeq( p->pManAig, pObj, i )
|
||||
pLatches[k++] = Fra_ObjChild0Fra(pObj,f);
|
||||
assert( k == Aig_ManInitNum(p->pManAig) );
|
||||
// insert them to the latch output values
|
||||
k = 0;
|
||||
Aig_ManForEachLoSeq( p->pManAig, pObj, i )
|
||||
Fra_ObjSetFraig( pObj, f+1, pLatches[k++] );
|
||||
assert( k == Aig_ManInitNum(p->pManAig) );
|
||||
}
|
||||
free( pLatches );
|
||||
// mark the asserts
|
||||
pManFraig->nAsserts = Aig_ManPoNum(pManFraig);
|
||||
// add the POs for the latch inputs
|
||||
Aig_ManForEachLiSeq( p->pManAig, pObj, i )
|
||||
Aig_ObjCreatePo( pManFraig, Fra_ObjChild0Fra(pObj,f) );
|
||||
|
||||
// set the pointer to the manager
|
||||
Aig_ManForEachObj( p->pManAig, pObj, i )
|
||||
pObj->pData = p;
|
||||
// set the pointers to the manager
|
||||
Aig_ManForEachObj( pManFraig, pObj, i )
|
||||
pObj->pData = p;
|
||||
// make sure the satisfying assignment is node assigned
|
||||
assert( pManFraig->pData == NULL );
|
||||
return pManFraig;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Performs choicing of the AIG.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Aig_Man_t * Fra_Induction( Aig_Man_t * pManAig, int nFrames, int fVerbose )
|
||||
{
|
||||
Fra_Man_t * p;
|
||||
Fra_Par_t Pars, * pPars = &Pars;
|
||||
Aig_Obj_t * pObj;
|
||||
Cnf_Dat_t * pCnf;
|
||||
Aig_Man_t * pManAigNew;
|
||||
int nIter, i;
|
||||
|
||||
if ( Aig_ManNodeNum(pManAig) == 0 )
|
||||
return Aig_ManDup(pManAig, 1);
|
||||
assert( Aig_ManLatchNum(pManAig) == 0 );
|
||||
assert( Aig_ManInitNum(pManAig) > 0 );
|
||||
|
||||
// get parameters
|
||||
Fra_ParamsDefaultSeq( pPars );
|
||||
pPars->nTimeFrames = nFrames;
|
||||
pPars->fVerbose = fVerbose;
|
||||
|
||||
// start the fraig manager for this run
|
||||
p = Fra_ManStart( pManAig, pPars );
|
||||
// derive and refine e-classes using the 1st init frame
|
||||
Fra_Simulate( p, 1 );
|
||||
|
||||
// refine e-classes using sequential simulation
|
||||
|
||||
// iterate the inductive case
|
||||
p->pCla->fRefinement = 1;
|
||||
for ( nIter = 0; p->pCla->fRefinement; nIter++ )
|
||||
{
|
||||
// mark the classes as non-refined
|
||||
p->pCla->fRefinement = 0;
|
||||
// derive non-init K-timeframes while implementing e-classes
|
||||
p->pManFraig = Fra_FramesWithClasses( p );
|
||||
if ( fVerbose )
|
||||
printf( "Iter = %3d. Original = %6d. Reduced = %6d.\n",
|
||||
nIter, Fra_ClassesCountLits(p->pCla), p->pManFraig->nAsserts );
|
||||
|
||||
// perform AIG rewriting on the speculated frames
|
||||
|
||||
// convert the manager to SAT solver (the last nLatches outputs are inputs)
|
||||
pCnf = Cnf_Derive( p->pManFraig, Aig_ManInitNum(p->pManFraig) );
|
||||
p->pSat = Cnf_DataWriteIntoSolver( pCnf );
|
||||
// transfer variable numbers
|
||||
Aig_ManForEachPi( p->pManAig, pObj, i )
|
||||
Fra_ObjSetSatNum( pObj, pCnf->pVarNums[pObj->Id] );
|
||||
Aig_ManForEachLiSeq( p->pManAig, pObj, i )
|
||||
{
|
||||
Fra_ObjSetSatNum( pObj, pCnf->pVarNums[pObj->Id] );
|
||||
Fra_ObjSetFaninVec( pObj, (void *)1 );
|
||||
}
|
||||
Cnf_DataFree( pCnf );
|
||||
|
||||
// perform sweeping
|
||||
Fra_FraigSweep( p );
|
||||
assert( Vec_PtrSize(p->vTimeouts) == 0 );
|
||||
Aig_ManStop( p->pManFraig ); p->pManFraig = NULL;
|
||||
sat_solver_delete( p->pSat ); p->pSat = NULL;
|
||||
}
|
||||
|
||||
// move the classes into representatives
|
||||
Fra_ClassesCopyReprs( p->pCla, p->vTimeouts );
|
||||
// implement the classes
|
||||
pManAigNew = Aig_ManDupRepr( pManAig );
|
||||
Fra_ManStop( p );
|
||||
return pManAigNew;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
|
@ -53,6 +53,37 @@ void Fra_ParamsDefault( Fra_Par_t * pPars )
|
|||
pPars->dActConeBumpMax = 10.0; // the largest bump of activity
|
||||
pPars->nBTLimitNode = 100; // conflict limit at a node
|
||||
pPars->nBTLimitMiter = 500000; // conflict limit at an output
|
||||
pPars->nTimeFrames = 0; // the number of timeframes to unroll
|
||||
pPars->fConeBias = 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Sets the default solving parameters.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_ParamsDefaultSeq( Fra_Par_t * pPars )
|
||||
{
|
||||
memset( pPars, 0, sizeof(Fra_Par_t) );
|
||||
pPars->nSimWords = 32; // the number of words in the simulation info
|
||||
pPars->dSimSatur = 0.005; // the ratio of refined classes when saturation is reached
|
||||
pPars->fPatScores = 0; // enables simulation pattern scoring
|
||||
pPars->MaxScore = 25; // max score after which resimulation is used
|
||||
pPars->fDoSparse = 1; // skips sparse functions
|
||||
// pPars->dActConeRatio = 0.05; // the ratio of cone to be bumped
|
||||
// pPars->dActConeBumpMax = 5.0; // the largest bump of activity
|
||||
pPars->dActConeRatio = 0.3; // the ratio of cone to be bumped
|
||||
pPars->dActConeBumpMax = 10.0; // the largest bump of activity
|
||||
pPars->nBTLimitNode = 1000000; // conflict limit at a node
|
||||
pPars->nBTLimitMiter = 500000; // conflict limit at an output
|
||||
pPars->nTimeFrames = 1; // the number of timeframes to unroll
|
||||
pPars->fConeBias = 0;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -74,47 +105,36 @@ Fra_Man_t * Fra_ManStart( Aig_Man_t * pManAig, Fra_Par_t * pPars )
|
|||
memset( p, 0, sizeof(Fra_Man_t) );
|
||||
p->pPars = pPars;
|
||||
p->pManAig = pManAig;
|
||||
p->pManFraig = Aig_ManStartFrom( pManAig );
|
||||
assert( Aig_ManPiNum(p->pManAig) == Aig_ManPiNum(p->pManFraig) );
|
||||
p->nSizeAlloc = Aig_ManObjIdMax( pManAig ) + 1;
|
||||
p->nFrames = pPars->nTimeFrames + 1;
|
||||
// allocate simulation info
|
||||
p->nSimWords = pPars->nSimWords;
|
||||
p->pSimWords = ALLOC( unsigned, (Aig_ManObjIdMax(pManAig) + 1) * p->nSimWords );
|
||||
p->nSimWords = pPars->nSimWords * p->nFrames;
|
||||
p->pSimWords = ALLOC( unsigned, p->nSizeAlloc * p->nSimWords * p->nFrames );
|
||||
// clean simulation info of the constant node
|
||||
memset( p->pSimWords, 0, sizeof(unsigned) * ((Aig_ManPiNum(pManAig) + 1) * p->nSimWords) );
|
||||
memset( p->pSimWords, 0, sizeof(unsigned) * p->nSizeAlloc * p->nSimWords * p->nFrames );
|
||||
// allocate storage for sim pattern
|
||||
p->nPatWords = Aig_BitWordNum( Aig_ManPiNum(pManAig) );
|
||||
p->pPatWords = ALLOC( unsigned, p->nPatWords );
|
||||
p->pPatScores = ALLOC( int, 32 * p->nSimWords );
|
||||
p->vPiVars = Vec_PtrAlloc( 100 );
|
||||
p->vClasses = Vec_PtrAlloc( 100 );
|
||||
p->vClasses1 = Vec_PtrAlloc( 100 );
|
||||
p->vClassOld = Vec_PtrAlloc( 100 );
|
||||
p->vClassNew = Vec_PtrAlloc( 100 );
|
||||
p->vClassesTemp = Vec_PtrAlloc( 100 );
|
||||
p->vTimeouts = Vec_PtrAlloc( 100 );
|
||||
// equivalence classes
|
||||
p->pCla = Fra_ClassesStart( pManAig );
|
||||
// allocate other members
|
||||
p->nSizeAlloc = Aig_ManObjIdMax(pManAig) + 1;
|
||||
p->pMemFraig = ALLOC( Aig_Obj_t *, p->nSizeAlloc );
|
||||
memset( p->pMemFraig, 0, p->nSizeAlloc * sizeof(Aig_Obj_t *) );
|
||||
p->pMemRepr = ALLOC( Aig_Obj_t *, p->nSizeAlloc );
|
||||
memset( p->pMemRepr, 0, p->nSizeAlloc * sizeof(Aig_Obj_t *) );
|
||||
p->pMemReprFra = ALLOC( Aig_Obj_t *, p->nSizeAlloc );
|
||||
memset( p->pMemReprFra, 0, p->nSizeAlloc * sizeof(Aig_Obj_t *) );
|
||||
p->pMemFanins = ALLOC( Vec_Ptr_t *, p->nSizeAlloc );
|
||||
memset( p->pMemFanins, 0, p->nSizeAlloc * sizeof(Vec_Ptr_t *) );
|
||||
p->pMemSatNums = ALLOC( int, p->nSizeAlloc );
|
||||
memset( p->pMemSatNums, 0, p->nSizeAlloc * sizeof(int) );
|
||||
p->pMemFraig = ALLOC( Aig_Obj_t *, p->nSizeAlloc * p->nFrames );
|
||||
memset( p->pMemFraig, 0, sizeof(Aig_Obj_t *) * p->nSizeAlloc * p->nFrames );
|
||||
p->pMemFanins = ALLOC( Vec_Ptr_t *, p->nSizeAlloc * p->nFrames );
|
||||
memset( p->pMemFanins, 0, sizeof(Vec_Ptr_t *) * p->nSizeAlloc * p->nFrames );
|
||||
p->pMemSatNums = ALLOC( int, p->nSizeAlloc * p->nFrames );
|
||||
memset( p->pMemSatNums, 0, sizeof(int) * p->nSizeAlloc * p->nFrames );
|
||||
// set random number generator
|
||||
srand( 0xABCABC );
|
||||
// make sure the satisfying assignment is node assigned
|
||||
assert( p->pManFraig->pData == NULL );
|
||||
// connect AIG managers to the FRAIG manager
|
||||
Fra_ManPrepare( p );
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Prepares managers by transfering pointers to the objects.]
|
||||
Synopsis [Prepares the new manager to begin fraiging.]
|
||||
|
||||
Description []
|
||||
|
||||
|
|
@ -123,22 +143,52 @@ Fra_Man_t * Fra_ManStart( Aig_Man_t * pManAig, Fra_Par_t * pPars )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_ManPrepare( Fra_Man_t * p )
|
||||
Aig_Man_t * Fra_ManPrepareComb( Fra_Man_t * p )
|
||||
{
|
||||
Aig_Man_t * pManFraig;
|
||||
Aig_Obj_t * pObj;
|
||||
int i;
|
||||
// set the pointers to the manager
|
||||
Aig_ManForEachObj( p->pManFraig, pObj, i )
|
||||
pObj->pData = p;
|
||||
assert( p->pManFraig == NULL );
|
||||
// set the pointer to the manager
|
||||
Aig_ManForEachObj( p->pManAig, pObj, i )
|
||||
pObj->pData = p;
|
||||
// start the fraig package
|
||||
pManFraig = Aig_ManStart( Aig_ManObjIdMax(p->pManAig) + 1 );
|
||||
// set the pointers to the available fraig nodes
|
||||
Fra_ObjSetFraig( Aig_ManConst1(p->pManAig), Aig_ManConst1(p->pManFraig) );
|
||||
Fra_ObjSetFraig( Aig_ManConst1(p->pManAig), 0, Aig_ManConst1(pManFraig) );
|
||||
Aig_ManForEachPi( p->pManAig, pObj, i )
|
||||
Fra_ObjSetFraig( pObj, Aig_ManPi(p->pManFraig, i) );
|
||||
Fra_ObjSetFraig( pObj, 0, Aig_ObjCreatePi(pManFraig) );
|
||||
// set the pointers to the manager
|
||||
Aig_ManForEachObj( pManFraig, pObj, i )
|
||||
pObj->pData = p;
|
||||
// make sure the satisfying assignment is node assigned
|
||||
assert( pManFraig->pData == NULL );
|
||||
return pManFraig;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Finalizes the combinational miter after fraiging.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_ManFinalizeComb( Fra_Man_t * p )
|
||||
{
|
||||
Aig_Obj_t * pObj;
|
||||
int i;
|
||||
// add the POs
|
||||
Aig_ManForEachPo( p->pManAig, pObj, i )
|
||||
Aig_ObjCreatePo( p->pManFraig, Fra_ObjChild0Fra(pObj,0) );
|
||||
// postprocess
|
||||
Aig_ManCleanMarkB( p->pManFraig );
|
||||
}
|
||||
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Stops the fraiging manager.]
|
||||
|
|
@ -158,19 +208,13 @@ void Fra_ManStop( Fra_Man_t * p )
|
|||
Vec_PtrFree( p->pMemFanins[i] );
|
||||
if ( p->pPars->fVerbose )
|
||||
Fra_ManPrint( p );
|
||||
if ( p->vClassesTemp ) Vec_PtrFree( p->vClassesTemp );
|
||||
if ( p->vClassNew ) Vec_PtrFree( p->vClassNew );
|
||||
if ( p->vClassOld ) Vec_PtrFree( p->vClassOld );
|
||||
if ( p->vClasses1 ) Vec_PtrFree( p->vClasses1 );
|
||||
if ( p->vClasses ) Vec_PtrFree( p->vClasses );
|
||||
if ( p->vPiVars ) Vec_PtrFree( p->vPiVars );
|
||||
if ( p->pSat ) sat_solver_delete( p->pSat );
|
||||
FREE( p->pMemSatNums );
|
||||
FREE( p->pMemFanins );
|
||||
FREE( p->pMemRepr );
|
||||
FREE( p->pMemReprFra );
|
||||
if ( p->vTimeouts ) Vec_PtrFree( p->vTimeouts );
|
||||
if ( p->vPiVars ) Vec_PtrFree( p->vPiVars );
|
||||
if ( p->pSat ) sat_solver_delete( p->pSat );
|
||||
if ( p->pCla ) Fra_ClassesStop( p->pCla );
|
||||
FREE( p->pMemFraig );
|
||||
FREE( p->pMemClasses );
|
||||
FREE( p->pMemFanins );
|
||||
FREE( p->pMemSatNums );
|
||||
FREE( p->pPatScores );
|
||||
FREE( p->pPatWords );
|
||||
FREE( p->pSimWords );
|
||||
|
|
@ -197,7 +241,7 @@ void Fra_ManPrint( Fra_Man_t * p )
|
|||
printf( "Proof = %d. Counter-example = %d. Fail = %d. FailReal = %d. Zero = %d.\n",
|
||||
p->nSatProof, p->nSatCallsSat, p->nSatFails, p->nSatFailsReal, p->nClassesZero );
|
||||
printf( "Final = %d. Miter = %d. Total = %d. Mux = %d. (Exor = %d.) SatVars = %d.\n",
|
||||
Aig_ManNodeNum(p->pManFraig), p->nNodesMiter, Aig_ManNodeNum(p->pManAig), 0, 0, p->nSatVars );
|
||||
p->pManFraig? Aig_ManNodeNum(p->pManFraig) : -1, p->nNodesMiter, Aig_ManNodeNum(p->pManAig), 0, 0, p->nSatVars );
|
||||
if ( p->pSat ) Sat_SolverPrintStats( stdout, p->pSat );
|
||||
PRT( "AIG simulation ", p->timeSim );
|
||||
PRT( "AIG traversal ", p->timeTrav );
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ int Fra_NodesAreEquiv( Fra_Man_t * p, Aig_Obj_t * pOld, Aig_Obj_t * pNew )
|
|||
// if the backtrack limit is small, simply skip this node
|
||||
// if the backtrack limit is > 10, take the quare root of the limit
|
||||
nBTLimit = p->pPars->nBTLimitNode;
|
||||
if ( !p->pPars->fSpeculate && (nBTLimit > 0 && (pOld->fMarkB || pNew->fMarkB)) )
|
||||
if ( !p->pPars->fSpeculate && p->pPars->nTimeFrames == 0 && (nBTLimit > 0 && (pOld->fMarkB || pNew->fMarkB)) )
|
||||
{
|
||||
p->nSatFails++;
|
||||
// fail immediately
|
||||
|
|
@ -78,7 +78,8 @@ int Fra_NodesAreEquiv( Fra_Man_t * p, Aig_Obj_t * pOld, Aig_Obj_t * pNew )
|
|||
Fra_NodeAddToSolver( p, pOld, pNew );
|
||||
|
||||
// prepare variable activity
|
||||
Fra_SetActivityFactors( p, pOld, pNew );
|
||||
if ( p->pPars->fConeBias )
|
||||
Fra_SetActivityFactors( p, pOld, pNew );
|
||||
|
||||
// solve under assumptions
|
||||
// A = 1; B = 0 OR A = 1; B = 1
|
||||
|
|
@ -209,7 +210,8 @@ int Fra_NodeIsConst( Fra_Man_t * p, Aig_Obj_t * pNew )
|
|||
Fra_NodeAddToSolver( p, NULL, pNew );
|
||||
|
||||
// prepare variable activity
|
||||
Fra_SetActivityFactors( p, NULL, pNew );
|
||||
if ( p->pPars->fConeBias )
|
||||
Fra_SetActivityFactors( p, NULL, pNew );
|
||||
|
||||
// solve under assumptions
|
||||
clk = clock();
|
||||
|
|
|
|||
|
|
@ -81,12 +81,27 @@ void Fra_NodeAssignConst( Fra_Man_t * p, Aig_Obj_t * pObj, int fConst1 )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_AssignRandom( Fra_Man_t * p )
|
||||
void Fra_AssignRandom( Fra_Man_t * p, int fInit )
|
||||
{
|
||||
Aig_Obj_t * pObj;
|
||||
int i;
|
||||
Aig_ManForEachPi( p->pManAig, pObj, i )
|
||||
Fra_NodeAssignRandom( p, pObj );
|
||||
int i, k;
|
||||
if ( fInit )
|
||||
{
|
||||
assert( Aig_ManInitNum(p->pManAig) > 0 );
|
||||
assert( Aig_ManInitNum(p->pManAig) < Aig_ManPiNum(p->pManAig) );
|
||||
// assign random info for primary inputs
|
||||
Aig_ManForEachPiSeq( p->pManAig, pObj, i )
|
||||
Fra_NodeAssignRandom( p, pObj );
|
||||
// assign the initial state for the latches
|
||||
k = 0;
|
||||
Aig_ManForEachLoSeq( p->pManAig, pObj, i )
|
||||
Fra_NodeAssignConst( p, pObj, Vec_IntEntry(p->pManAig->vInits,k++) );
|
||||
}
|
||||
else
|
||||
{
|
||||
Aig_ManForEachPi( p->pManAig, pObj, i )
|
||||
Fra_NodeAssignRandom( p, pObj );
|
||||
}
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -105,12 +120,8 @@ void Fra_AssignDist1( Fra_Man_t * p, unsigned * pPat )
|
|||
Aig_Obj_t * pObj;
|
||||
int i, Limit;
|
||||
Aig_ManForEachPi( p->pManAig, pObj, i )
|
||||
{
|
||||
Fra_NodeAssignConst( p, pObj, Aig_InfoHasBit(pPat, i) );
|
||||
// printf( "%d", Aig_InfoHasBit(pPat, i) );
|
||||
}
|
||||
// printf( "\n" );
|
||||
Limit = AIG_MIN( Aig_ManPiNum(p->pManAig), p->nSimWords * 32 - 1 );
|
||||
Limit = AIG_MIN( Aig_ManPiNum(p->pManAig) - Aig_ManInitNum(p->pManAig), p->nSimWords * 32 - 1 );
|
||||
for ( i = 0; i < Limit; i++ )
|
||||
Aig_InfoXorBit( Fra_ObjSim( Aig_ManPi(p->pManAig,i) ), i+1 );
|
||||
}
|
||||
|
|
@ -126,15 +137,14 @@ void Fra_AssignDist1( Fra_Man_t * p, unsigned * pPat )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_NodeHasZeroSim( Fra_Man_t * p, Aig_Obj_t * pObj )
|
||||
void Fra_NodeComplementSim( Aig_Obj_t * pObj )
|
||||
{
|
||||
Fra_Man_t * p = pObj->pData;
|
||||
unsigned * pSims;
|
||||
int i;
|
||||
pSims = Fra_ObjSim(pObj);
|
||||
for ( i = 0; i < p->nSimWords; i++ )
|
||||
if ( pSims[i] )
|
||||
return 0;
|
||||
return 1;
|
||||
pSims[i] = ~pSims[i];
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -148,13 +158,16 @@ int Fra_NodeHasZeroSim( Fra_Man_t * p, Aig_Obj_t * pObj )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_NodeComplementSim( Fra_Man_t * p, Aig_Obj_t * pObj )
|
||||
int Fra_NodeHasZeroSim( Aig_Obj_t * pObj )
|
||||
{
|
||||
Fra_Man_t * p = pObj->pData;
|
||||
unsigned * pSims;
|
||||
int i;
|
||||
pSims = Fra_ObjSim(pObj);
|
||||
for ( i = 0; i < p->nSimWords; i++ )
|
||||
pSims[i] = ~pSims[i];
|
||||
if ( pSims[i] )
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -168,8 +181,9 @@ void Fra_NodeComplementSim( Fra_Man_t * p, Aig_Obj_t * pObj )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Fra_NodeCompareSims( Fra_Man_t * p, Aig_Obj_t * pObj0, Aig_Obj_t * pObj1 )
|
||||
int Fra_NodeCompareSims( Aig_Obj_t * pObj0, Aig_Obj_t * pObj1 )
|
||||
{
|
||||
Fra_Man_t * p = pObj0->pData;
|
||||
unsigned * pSims0, * pSims1;
|
||||
int i;
|
||||
pSims0 = Fra_ObjSim(pObj0);
|
||||
|
|
@ -180,6 +194,45 @@ int Fra_NodeCompareSims( Fra_Man_t * p, Aig_Obj_t * pObj0, Aig_Obj_t * pObj1 )
|
|||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Computes hash value of the node using its simulation info.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
unsigned Fra_NodeHashSims( Aig_Obj_t * pObj )
|
||||
{
|
||||
Fra_Man_t * p = pObj->pData;
|
||||
static int s_FPrimes[128] = {
|
||||
1009, 1049, 1093, 1151, 1201, 1249, 1297, 1361, 1427, 1459,
|
||||
1499, 1559, 1607, 1657, 1709, 1759, 1823, 1877, 1933, 1997,
|
||||
2039, 2089, 2141, 2213, 2269, 2311, 2371, 2411, 2467, 2543,
|
||||
2609, 2663, 2699, 2741, 2797, 2851, 2909, 2969, 3037, 3089,
|
||||
3169, 3221, 3299, 3331, 3389, 3461, 3517, 3557, 3613, 3671,
|
||||
3719, 3779, 3847, 3907, 3943, 4013, 4073, 4129, 4201, 4243,
|
||||
4289, 4363, 4441, 4493, 4549, 4621, 4663, 4729, 4793, 4871,
|
||||
4933, 4973, 5021, 5087, 5153, 5227, 5281, 5351, 5417, 5471,
|
||||
5519, 5573, 5651, 5693, 5749, 5821, 5861, 5923, 6011, 6073,
|
||||
6131, 6199, 6257, 6301, 6353, 6397, 6481, 6563, 6619, 6689,
|
||||
6737, 6803, 6863, 6917, 6977, 7027, 7109, 7187, 7237, 7309,
|
||||
7393, 7477, 7523, 7561, 7607, 7681, 7727, 7817, 7877, 7933,
|
||||
8011, 8039, 8059, 8081, 8093, 8111, 8123, 8147
|
||||
};
|
||||
unsigned * pSims;
|
||||
unsigned uHash;
|
||||
int i;
|
||||
assert( p->nSimWords <= 128 );
|
||||
uHash = 0;
|
||||
pSims = Fra_ObjSim(pObj);
|
||||
for ( i = 0; i < p->nSimWords; i++ )
|
||||
uHash ^= pSims[i] * s_FPrimes[i];
|
||||
return uHash;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
|
|
@ -245,6 +298,7 @@ void Fra_NodeSimulate( Fra_Man_t * p, Aig_Obj_t * pObj )
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Generated const 0 pattern.]
|
||||
|
|
@ -294,10 +348,8 @@ void Fra_SavePattern( Fra_Man_t * p )
|
|||
int i;
|
||||
memset( p->pPatWords, 0, sizeof(unsigned) * p->nPatWords );
|
||||
Aig_ManForEachPi( p->pManFraig, pObj, i )
|
||||
// Vec_PtrForEachEntry( p->vPiVars, pObj, i )
|
||||
if ( p->pSat->model.ptr[Fra_ObjSatNum(pObj)] == l_True )
|
||||
Aig_InfoSetBit( p->pPatWords, i );
|
||||
// Ivy_InfoSetBit( p->pPatWords, pObj->Id - 1 );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -433,15 +485,17 @@ p->nSimRounds++;
|
|||
***********************************************************************/
|
||||
void Fra_Resimulate( Fra_Man_t * p )
|
||||
{
|
||||
int nChanges;
|
||||
int nChanges, clk;
|
||||
Fra_AssignDist1( p, p->pPatWords );
|
||||
Fra_SimulateOne( p );
|
||||
if ( p->pPars->fPatScores )
|
||||
Fra_CleanPatScores( p );
|
||||
nChanges = Fra_RefineClasses( p );
|
||||
nChanges += Fra_RefineClasses1( p );
|
||||
if ( p->pManFraig->pData )
|
||||
if ( p->pPars->fProve && Fra_CheckOutputSims(p) )
|
||||
return;
|
||||
clk = clock();
|
||||
nChanges = Fra_ClassesRefine( p->pCla );
|
||||
nChanges += Fra_ClassesRefine1( p->pCla );
|
||||
p->timeRef += clock() - clk;
|
||||
if ( nChanges < 1 )
|
||||
printf( "Error: A counter-example did not refine classes!\n" );
|
||||
assert( nChanges >= 1 );
|
||||
|
|
@ -456,10 +510,12 @@ void Fra_Resimulate( Fra_Man_t * p )
|
|||
Fra_AssignDist1( p, p->pPatWords );
|
||||
Fra_SimulateOne( p );
|
||||
Fra_CleanPatScores( p );
|
||||
nChanges = Fra_RefineClasses( p );
|
||||
nChanges += Fra_RefineClasses1( p );
|
||||
if ( p->pManFraig->pData )
|
||||
if ( p->pPars->fProve && Fra_CheckOutputSims(p) )
|
||||
return;
|
||||
clk = clock();
|
||||
nChanges = Fra_ClassesRefine( p->pCla );
|
||||
nChanges += Fra_ClassesRefine1( p->pCla );
|
||||
p->timeRef += clock() - clk;
|
||||
//printf( "Refined class!!! = %5d. Changes = %4d. Pairs = %6d.\n", p->lClasses.nItems, nChanges, Fra_CountPairsClasses(p) );
|
||||
if ( nChanges == 0 )
|
||||
break;
|
||||
|
|
@ -477,43 +533,50 @@ void Fra_Resimulate( Fra_Man_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Fra_Simulate( Fra_Man_t * p )
|
||||
void Fra_Simulate( Fra_Man_t * p, int fInit )
|
||||
{
|
||||
int nChanges, nClasses;
|
||||
int nChanges, nClasses, clk;
|
||||
assert( !fInit || Aig_ManInitNum(p->pManAig) );
|
||||
// start the classes
|
||||
Fra_AssignRandom( p );
|
||||
Fra_AssignRandom( p, fInit );
|
||||
Fra_SimulateOne( p );
|
||||
Fra_CreateClasses( p );
|
||||
Fra_ClassesPrepare( p->pCla );
|
||||
//printf( "Starting classes = %5d. Pairs = %6d.\n", p->lClasses.nItems, Fra_CountPairsClasses(p) );
|
||||
// refine classes by walking 0/1 patterns
|
||||
Fra_SavePattern0( p );
|
||||
Fra_AssignDist1( p, p->pPatWords );
|
||||
Fra_SimulateOne( p );
|
||||
nChanges = Fra_RefineClasses( p );
|
||||
nChanges += Fra_RefineClasses1( p );
|
||||
if ( p->pManFraig->pData )
|
||||
if ( p->pPars->fProve && Fra_CheckOutputSims(p) )
|
||||
return;
|
||||
clk = clock();
|
||||
nChanges = Fra_ClassesRefine( p->pCla );
|
||||
nChanges += Fra_ClassesRefine1( p->pCla );
|
||||
p->timeRef += clock() - clk;
|
||||
//printf( "Refined classes = %5d. Changes = %4d. Pairs = %6d.\n", p->lClasses.nItems, nChanges, Fra_CountPairsClasses(p) );
|
||||
Fra_SavePattern1( p );
|
||||
Fra_AssignDist1( p, p->pPatWords );
|
||||
Fra_SimulateOne( p );
|
||||
nChanges = Fra_RefineClasses( p );
|
||||
nChanges += Fra_RefineClasses1( p );
|
||||
if ( p->pManFraig->pData )
|
||||
if ( p->pPars->fProve && Fra_CheckOutputSims(p) )
|
||||
return;
|
||||
clk = clock();
|
||||
nChanges = Fra_ClassesRefine( p->pCla );
|
||||
nChanges += Fra_ClassesRefine1( p->pCla );
|
||||
p->timeRef += clock() - clk;
|
||||
//printf( "Refined classes = %5d. Changes = %4d. Pairs = %6d.\n", p->lClasses.nItems, nChanges, Fra_CountPairsClasses(p) );
|
||||
// refine classes by random simulation
|
||||
do {
|
||||
Fra_AssignRandom( p );
|
||||
Fra_AssignRandom( p, fInit );
|
||||
Fra_SimulateOne( p );
|
||||
nClasses = Vec_PtrSize(p->vClasses);
|
||||
nChanges = Fra_RefineClasses( p );
|
||||
nChanges += Fra_RefineClasses1( p );
|
||||
if ( p->pManFraig->pData )
|
||||
nClasses = Vec_PtrSize(p->pCla->vClasses);
|
||||
if ( p->pPars->fProve && Fra_CheckOutputSims(p) )
|
||||
return;
|
||||
clk = clock();
|
||||
nChanges = Fra_ClassesRefine( p->pCla );
|
||||
nChanges += Fra_ClassesRefine1( p->pCla );
|
||||
p->timeRef += clock() - clk;
|
||||
//printf( "Refined classes = %5d. Changes = %4d. Pairs = %6d.\n", p->lClasses.nItems, nChanges, Fra_CountPairsClasses(p) );
|
||||
} while ( (double)nChanges / nClasses > p->pPars->dSimSatur );
|
||||
// Fra_PrintClasses( p );
|
||||
// Fra_ClassesPrint( p->pCla );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -578,19 +641,12 @@ int Fra_CheckOutputSims( Fra_Man_t * p )
|
|||
assert( Aig_ObjFanin0(pObj)->fPhase == (unsigned)Aig_ObjFaninC0(pObj) ); // Aig_ObjFaninPhase(Aig_ObjChild0(pObj)) == 0
|
||||
Aig_ManForEachPo( p->pManAig, pObj, i )
|
||||
{
|
||||
// complement simulation info
|
||||
// if ( Aig_ObjFanin0(pObj)->fPhase ^ Aig_ObjFaninC0(pObj) ) // Aig_ObjFaninPhase(Aig_ObjChild0(pObj))
|
||||
// Fra_NodeComplementSim( p, Aig_ObjFanin0(pObj) );
|
||||
// check
|
||||
if ( !Fra_NodeHasZeroSim( p, Aig_ObjFanin0(pObj) ) )
|
||||
if ( !Fra_NodeHasZeroSim( Aig_ObjFanin0(pObj) ) )
|
||||
{
|
||||
// create the counter-example from this pattern
|
||||
Fra_CheckOutputSimsSavePattern( p, Aig_ObjFanin0(pObj) );
|
||||
return 1;
|
||||
}
|
||||
// complement simulation info
|
||||
// if ( Aig_ObjFanin0(pObj)->fPhase ^ Aig_ObjFaninC0(pObj) )
|
||||
// Fra_NodeComplementSim( p, Aig_ObjFanin0(pObj) );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,7 +1,7 @@
|
|||
SRC += src/aig/fra/fraClass.c \
|
||||
src/aig/fra/fraCnf.c \
|
||||
src/aig/fra/fraCore.c \
|
||||
src/aig/fra/fraDfs.c \
|
||||
src/aig/fra/fraInd.c \
|
||||
src/aig/fra/fraMan.c \
|
||||
src/aig/fra/fraSat.c \
|
||||
src/aig/fra/fraSim.c
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ void Abc_Init( Abc_Frame_t * pAbc )
|
|||
Cmd_CommandAdd( pAbc, "Sequential", "retime", Abc_CommandRetime, 1 );
|
||||
// Cmd_CommandAdd( pAbc, "Sequential", "sfpga", Abc_CommandSeqFpga, 1 );
|
||||
// Cmd_CommandAdd( pAbc, "Sequential", "smap", Abc_CommandSeqMap, 1 );
|
||||
// Cmd_CommandAdd( pAbc, "Sequential", "ssweep", Abc_CommandSeqSweep, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Sequential", "ssweep", Abc_CommandSeqSweep, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Sequential", "scleanup", Abc_CommandSeqCleanup, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Sequential", "cycle", Abc_CommandCycle, 1 );
|
||||
Cmd_CommandAdd( pAbc, "Sequential", "xsim", Abc_CommandXsim, 0 );
|
||||
|
|
@ -10736,8 +10736,7 @@ int Abc_CommandSeqSweep( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
int fExdc;
|
||||
int fImp;
|
||||
int fVerbose;
|
||||
extern Abc_Ntk_t * Abc_NtkVanEijk( Abc_Ntk_t * pNtk, int nFrames, int fExdc, int fVerbose );
|
||||
extern Abc_Ntk_t * Abc_NtkVanImp( Abc_Ntk_t * pNtk, int nFrames, int fExdc, int fVerbose );
|
||||
extern Abc_Ntk_t * Abc_NtkSeqSweep( Abc_Ntk_t * pNtk, int nFrames, int fVerbose );
|
||||
|
||||
pNtk = Abc_FrameReadNtk(pAbc);
|
||||
pOut = Abc_FrameReadOut(pAbc);
|
||||
|
|
@ -10801,14 +10800,10 @@ int Abc_CommandSeqSweep( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
}
|
||||
|
||||
// get the new network
|
||||
// if ( fImp )
|
||||
// pNtkRes = Abc_NtkVanImp( pNtk, nFrames, fExdc, fVerbose );
|
||||
// else
|
||||
// pNtkRes = Abc_NtkVanEijk( pNtk, nFrames, fExdc, fVerbose );
|
||||
pNtkRes = NULL;
|
||||
pNtkRes = Abc_NtkSeqSweep( pNtk, nFrames, fVerbose );
|
||||
if ( pNtkRes == NULL )
|
||||
{
|
||||
fprintf( pErr, "Sequential FPGA mapping has failed.\n" );
|
||||
fprintf( pErr, "Sequential sweeping has failed.\n" );
|
||||
return 1;
|
||||
}
|
||||
// replace the current network
|
||||
|
|
@ -10819,8 +10814,8 @@ usage:
|
|||
fprintf( pErr, "usage: ssweep [-F num] [-eivh]\n" );
|
||||
fprintf( pErr, "\t performs sequential sweep using van Eijk's method\n" );
|
||||
fprintf( pErr, "\t-F num : number of time frames in the base case [default = %d]\n", nFrames );
|
||||
fprintf( pErr, "\t-e : toggle writing EXDC network [default = %s]\n", fExdc? "yes": "no" );
|
||||
fprintf( pErr, "\t-i : toggle computing implications [default = %s]\n", fImp? "yes": "no" );
|
||||
// fprintf( pErr, "\t-e : toggle writing EXDC network [default = %s]\n", fExdc? "yes": "no" );
|
||||
// fprintf( pErr, "\t-i : toggle computing implications [default = %s]\n", fImp? "yes": "no" );
|
||||
fprintf( pErr, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" );
|
||||
fprintf( pErr, "\t-h : print the command usage\n");
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ Abc_Ntk_t * Abc_NtkFromDarChoices( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan )
|
|||
Abc_Ntk_t * pNtkNew;
|
||||
Aig_Obj_t * pObj, * pTemp;
|
||||
int i;
|
||||
assert( pMan->pReprs != NULL );
|
||||
assert( pMan->pEquivs != NULL );
|
||||
assert( Aig_ManBufNum(pMan) == 0 );
|
||||
// perform strashing
|
||||
pNtkNew = Abc_NtkStartFrom( pNtkOld, ABC_NTK_STRASH, ABC_FUNC_AIG );
|
||||
|
|
@ -142,7 +142,7 @@ Abc_Ntk_t * Abc_NtkFromDarChoices( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan )
|
|||
Vec_PtrForEachEntry( vNodes, pObj, i )
|
||||
{
|
||||
pObj->pData = Abc_AigAnd( pNtkNew->pManFunc, (Abc_Obj_t *)Aig_ObjChild0Copy(pObj), (Abc_Obj_t *)Aig_ObjChild1Copy(pObj) );
|
||||
if ( pTemp = pMan->pReprs[pObj->Id] )
|
||||
if ( pTemp = pMan->pEquivs[pObj->Id] )
|
||||
{
|
||||
Abc_Obj_t * pAbcRepr, * pAbcObj;
|
||||
assert( pTemp->pData != NULL );
|
||||
|
|
@ -261,14 +261,15 @@ Abc_Ntk_t * Abc_NtkFromDarSeq( Abc_Ntk_t * pNtkOld, Aig_Man_t * pMan )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int * Abc_NtkGetLatchValues( Abc_Ntk_t * pNtk )
|
||||
Vec_Int_t * Abc_NtkGetLatchValues( Abc_Ntk_t * pNtk )
|
||||
{
|
||||
Vec_Int_t * vInits;
|
||||
Abc_Obj_t * pLatch;
|
||||
int i, * pArray;
|
||||
pArray = ALLOC( int, Abc_NtkLatchNum(pNtk) );
|
||||
int i;
|
||||
vInits = Vec_IntAlloc( Abc_NtkLatchNum(pNtk) );
|
||||
Abc_NtkForEachLatch( pNtk, pLatch, i )
|
||||
pArray[i] = Abc_LatchIsInit1(pLatch);
|
||||
return pArray;
|
||||
Vec_IntPush( vInits, Abc_LatchIsInit1(pLatch) );
|
||||
return vInits;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -298,11 +299,13 @@ void Abc_NtkSecRetime( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2 )
|
|||
Aig_ManPrintStats( pMan1 );
|
||||
Aig_ManPrintStats( pMan2 );
|
||||
|
||||
pArray = Abc_NtkGetLatchValues(pNtk1);
|
||||
// pArray = Abc_NtkGetLatchValues(pNtk1);
|
||||
pArray = NULL;
|
||||
Aig_ManSeqStrash( pMan1, Abc_NtkLatchNum(pNtk1), pArray );
|
||||
free( pArray );
|
||||
|
||||
pArray = Abc_NtkGetLatchValues(pNtk2);
|
||||
// pArray = Abc_NtkGetLatchValues(pNtk2);
|
||||
pArray = NULL;
|
||||
Aig_ManSeqStrash( pMan2, Abc_NtkLatchNum(pNtk2), pArray );
|
||||
free( pArray );
|
||||
|
||||
|
|
@ -414,7 +417,7 @@ Abc_Ntk_t * Abc_NtkDarFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, in
|
|||
pPars->fDoSparse = fDoSparse;
|
||||
pPars->fSpeculate = fSpeculate;
|
||||
pPars->fChoicing = fChoicing;
|
||||
pMan = Fra_Perform( pTemp = pMan, pPars );
|
||||
pMan = Fra_FraigPerform( pTemp = pMan, pPars );
|
||||
if ( fChoicing )
|
||||
pNtkAig = Abc_NtkFromDarChoices( pNtk, pMan );
|
||||
else
|
||||
|
|
@ -471,14 +474,14 @@ Abc_Ntk_t * Abc_NtkDRewrite( Abc_Ntk_t * pNtk, Dar_RwrPar_t * pPars )
|
|||
if ( pMan == NULL )
|
||||
return NULL;
|
||||
// Aig_ManPrintStats( pMan );
|
||||
|
||||
/*
|
||||
// Aig_ManSupports( pMan );
|
||||
{
|
||||
Vec_Vec_t * vParts;
|
||||
vParts = Aig_ManPartitionSmart( pMan, 50, 1, NULL );
|
||||
Vec_VecFree( vParts );
|
||||
}
|
||||
|
||||
*/
|
||||
Dar_ManRewrite( pMan, pPars );
|
||||
// pMan = Dar_ManBalance( pTemp = pMan, pPars->fUpdateLevel );
|
||||
// Aig_ManStop( pTemp );
|
||||
|
|
@ -703,7 +706,7 @@ Abc_Ntk_t * Abc_NtkDarToCnf( Abc_Ntk_t * pNtk, char * pFileName )
|
|||
Aig_ManPrintStats( pMan );
|
||||
|
||||
// derive CNF
|
||||
pCnf = Cnf_Derive( pMan );
|
||||
pCnf = Cnf_Derive( pMan, 0 );
|
||||
pManCnf = Cnf_ManRead();
|
||||
|
||||
// write the network for verification
|
||||
|
|
@ -747,7 +750,7 @@ int Abc_NtkDSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int fVer
|
|||
// conver to the manager
|
||||
pMan = Abc_NtkToDar( pNtk );
|
||||
// derive CNF
|
||||
pCnf = Cnf_Derive( pMan );
|
||||
pCnf = Cnf_Derive( pMan, 0 );
|
||||
// convert into the SAT solver
|
||||
pSat = Cnf_DataWriteIntoSolver( pCnf );
|
||||
vCiIds = Cnf_DataCollectPiSatNums( pCnf, pMan );
|
||||
|
|
@ -763,7 +766,7 @@ int Abc_NtkDSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int fVer
|
|||
|
||||
|
||||
// printf( "Created SAT problem with %d variable and %d clauses. ", sat_solver_nvars(pSat), sat_solver_nclauses(pSat) );
|
||||
PRT( "Time", clock() - clk );
|
||||
// PRT( "Time", clock() - clk );
|
||||
|
||||
// simplify the problem
|
||||
clk = clock();
|
||||
|
|
@ -818,6 +821,35 @@ int Abc_NtkDSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int fVer
|
|||
return RetValue;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Gives the current ABC network to AIG manager for processing.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Ntk_t * Abc_NtkSeqSweep( Abc_Ntk_t * pNtk, int nFrames, int fVerbose )
|
||||
{
|
||||
Abc_Ntk_t * pNtkAig;
|
||||
Aig_Man_t * pMan, * pTemp;
|
||||
pMan = Abc_NtkToDar( pNtk );
|
||||
if ( pMan == NULL )
|
||||
return NULL;
|
||||
pMan->vInits = Abc_NtkGetLatchValues( pNtk );
|
||||
|
||||
pMan = Fra_Induction( pTemp = pMan, nFrames, fVerbose );
|
||||
Aig_ManStop( pTemp );
|
||||
|
||||
pNtkAig = Abc_NtkFromDar( pNtk, pMan );
|
||||
Aig_ManStop( pMan );
|
||||
return pNtkAig;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -69,13 +69,13 @@ int Abc_NtkRewrite( Abc_Ntk_t * pNtk, int fUpdateLevel, int fUseZeros, int fVerb
|
|||
assert( Abc_NtkIsStrash(pNtk) );
|
||||
// cleanup the AIG
|
||||
Abc_AigCleanup(pNtk->pManFunc);
|
||||
|
||||
/*
|
||||
{
|
||||
Vec_Vec_t * vParts;
|
||||
vParts = Abc_NtkPartitionSmart( pNtk, 50, 1 );
|
||||
Vec_VecFree( vParts );
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// start placement package
|
||||
if ( fPlaceEnable )
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ int Abc_NtkMiterSat( Abc_Ntk_t * pNtk, sint64 nConfLimit, sint64 nInsLimit, int
|
|||
//return 1;
|
||||
|
||||
// printf( "Created SAT problem with %d variable and %d clauses. ", sat_solver_nvars(pSat), sat_solver_nclauses(pSat) );
|
||||
PRT( "Time", clock() - clk );
|
||||
// PRT( "Time", clock() - clk );
|
||||
|
||||
// simplify the problem
|
||||
clk = clock();
|
||||
|
|
|
|||
|
|
@ -237,7 +237,13 @@ usage:
|
|||
|
||||
Synopsis [Initialization procedure for the library project.]
|
||||
|
||||
Description []
|
||||
Description [Note that when Abc_Start() is run in a static library
|
||||
project, it does not load the resource file by default. As a result,
|
||||
ABC is not set up the same way, as when it is run on a command line.
|
||||
For example, some error messages while parsing files will not be
|
||||
produced, and intermediate networks will not be checked for consistancy.
|
||||
One possibility is to load the resource file after Abc_Start() as follows:
|
||||
Abc_UtilsSource( Abc_FrameGetGlobalFrame() );]
|
||||
|
||||
SideEffects []
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue