30 #define ABC_DC_MAX_NODES (1<<15)
140 #define Odc_ForEachPi( p, Lit, i ) \
141 for ( i = 0; (i < Odc_PiNum(p)) && (((Lit) = Odc_Var(p, i)), 1); i++ )
142 #define Odc_ForEachAnd( p, pObj, i ) \
143 for ( i = 1 + Odc_CiNum(p); (i < Odc_ObjNum(p)) && ((pObj) = (p)->pObjs + i); i++ )
169 assert( nVarsMax > 4 && nVarsMax < 16 );
170 assert( nLevels > 0 && nLevels < 10 );
189 p->
nPis = nVarsMax + 32;
193 for ( i = 0; i < 32; i++ )
214 for ( i = 0; i < p->
nBits; i++ )
216 pData[i>>5] |= (1 << (i&31));
220 for ( k = p->
nVarsMax; k < p->nPis; k++ )
278 printf(
"Wins = %5d. Empty = %5d. SimsEmpty = %5d. QuantOver = %5d. WinsFinish = %5d.\n",
280 printf(
"Ave DCs per window = %6.2f %%. Ave DCs per finished window = %6.2f %%.\n",
282 printf(
"Runtime stats of the ODC manager:\n" );
519 return Key % TableSize;
542 if ( p->
pTable[uHashKey] == 0 )
545 for ( pEntry = p->
pTable + uHashKey; *pEntry; pEntry = &pObj->
iNext )
548 if ( pObj->
iFan0 == iFan0 && pObj->
iFan1 == iFan1 )
569 unsigned uMask0, uMask1;
572 if ( iFan0 == iFan1 )
582 Temp = iFan0, iFan0 = iFan1, iFan1 = Temp;
596 pObj->
uMask = uMask0 | uMask1;
651 unsigned uData0, uData1;
660 if ( pNode == pPivot )
668 uRes0 =
Odc_And( p, uLit0, uLit1 );
672 uRes1 =
Odc_And( p, uLit0, uLit1 );
674 return pNode->
pCopy = (
Abc_Obj_t *)(ABC_PTRUINT_T)((uRes1 << 16) | uRes0);
716 uRes0 = uData & 0xffff;
720 uLit =
Odc_Xor( p, uRes0, uRes1 );
741 unsigned uData0, uData1;
750 if ( (pObj->
uMask & uMask) == 0 )
751 return pObj->
uData = ((Lit << 16) | Lit);
761 uRes0 =
Odc_And( p, uLit0, uLit1 );
765 uRes1 =
Odc_And( p, uLit0, uLit1 );
767 return pObj->
uData = ((uRes1 << 16) | uRes0);
826 for ( i = 0; i < p->
nBits; i++ )
828 pData[i>>5] |= (1 << (i&31));
845 unsigned * pData, * pData2;
870 for ( w = 0; w < p->
nWords; w++ )
876 pData[w] = (Number & (1<<k)) ? ~0 : 0;
895 for ( w = 0; w < p->
nWords; w++ )
915 unsigned * pInfo, * pInfo1, * pInfo2;
916 int k, fComp1, fComp2;
927 if ( fComp1 && fComp2 )
928 for ( k = 0; k < p->
nWords; k++ )
929 pInfo[k] = ~pInfo1[k] & ~pInfo2[k];
930 else if ( fComp1 && !fComp2 )
931 for ( k = 0; k < p->
nWords; k++ )
932 pInfo[k] = ~pInfo1[k] & pInfo2[k];
933 else if ( !fComp1 && fComp2 )
934 for ( k = 0; k < p->
nWords; k++ )
935 pInfo[k] = pInfo1[k] & ~pInfo2[k];
937 for ( k = 0; k < p->
nWords; k++ )
938 pInfo[k] = pInfo1[k] & pInfo2[k];
1010 for ( r = 0; r < nIters; r++ )
1017 Counter = Counter * nRounds / nIters;
1035 int nMints, RetValue;
1061 printf(
" %5d : ", pNode->
Id );
1080 printf(
"%6.2f %% ", 100.0 * (p->
nBits - nMints) / p->
nBits );
1088 printf(
"Simulation cutoff.\n" );
1102 printf(
"=== Overflow! ===\n" );
1116 printf(
"%6.2f %% ", 100.0 * (p->
nBits - nMints) / p->
nBits );
void Abc_NtkDontCareSimulate_rec(Odc_Man_t *p, Odc_Lit_t Lit)
int Abc_NtkDontCareSimulate(Odc_Man_t *p, unsigned *puTruth)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
static Odc_Obj_t * Odc_ObjNew(Odc_Man_t *p)
static Abc_Obj_t * Abc_ObjFanin1(Abc_Obj_t *pObj)
static int Odc_ObjNum(Odc_Man_t *p)
static int Abc_ObjIsCi(Abc_Obj_t *pObj)
int Abc_NtkDontCareWindow(Odc_Man_t *p)
static unsigned * Odc_ObjTruth(Odc_Man_t *p, Odc_Lit_t Lit)
void * Abc_NtkDontCareTransfer_rec(Odc_Man_t *p, Abc_Obj_t *pNode, Abc_Obj_t *pPivot)
static int Abc_ObjFaninC1(Abc_Obj_t *pObj)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
static int Vec_PtrPushUnique(Vec_Ptr_t *p, void *Entry)
static Odc_Lit_t Odc_Or(Odc_Man_t *p, Odc_Lit_t iFan0, Odc_Lit_t iFan1)
static int Abc_ObjFanoutNum(Abc_Obj_t *pObj)
static Odc_Lit_t Odc_Not(Odc_Lit_t Lit)
static Odc_Lit_t Odc_Var(Odc_Man_t *p, int i)
static void Odc_ObjSetTravIdCurrent(Odc_Man_t *p, Odc_Obj_t *pObj)
static void Abc_InfoFill(unsigned *p, int nWords)
unsigned Abc_NtkDontCareCofactors_rec(Odc_Man_t *p, Odc_Lit_t Lit, unsigned uMask)
#define ABC_DC_MAX_NODES
DECLARATIONS ///.
static int Abc_ObjFaninC0(Abc_Obj_t *pObj)
static int Odc_NodeNum(Odc_Man_t *p)
int Abc_NtkDontCareWinAddMissing(Odc_Man_t *p)
static void Vec_PtrPush(Vec_Ptr_t *p, void *Entry)
static Odc_Lit_t Odc_ObjFanin1(Odc_Obj_t *pObj)
static Odc_Lit_t Odc_ObjChild1(Odc_Obj_t *pObj)
#define ABC_ALLOC(type, num)
static int Abc_TruthWordNum(int nVars)
static Odc_Obj_t * Odc_Lit2Obj(Odc_Man_t *p, Odc_Lit_t Lit)
static Odc_Lit_t Odc_NotCond(Odc_Lit_t Lit, int c)
static abctime Abc_Clock()
static int Abc_NodeIsTravIdPrevious(Abc_Obj_t *p)
static int Vec_PtrSize(Vec_Ptr_t *p)
int Abc_NtkDontCareCountMintsWord(Odc_Man_t *p, unsigned *puTruth)
static Abc_Obj_t * Abc_ObjFanin0(Abc_Obj_t *pObj)
static unsigned Odc_HashKey(Odc_Lit_t iFan0, Odc_Lit_t iFan1, int TableSize)
static int Abc_ObjIsCo(Abc_Obj_t *pObj)
static void Abc_InfoNot(unsigned *p, int nWords)
int Abc_NtkDontCareCompute(Odc_Man_t *p, Abc_Obj_t *pNode, Vec_Ptr_t *vLeaves, unsigned *puTruth)
static int Abc_ObjIsNode(Abc_Obj_t *pObj)
static Odc_Lit_t Odc_ObjFanin0(Odc_Obj_t *pObj)
static Vec_Int_t * Vec_IntAlloc(int nCap)
FUNCTION DEFINITIONS ///.
int Abc_NtkDontCareTransfer(Odc_Man_t *p)
static void Abc_InfoCopy(unsigned *p, unsigned *q, int nWords)
static Odc_Lit_t Odc_ObjChild0(Odc_Obj_t *pObj)
void Abc_NtkDontCareSimulateSetRand(Odc_Man_t *p)
int Abc_NtkDontCareQuantify(Odc_Man_t *p)
#define ABC_NAMESPACE_IMPL_END
void Abc_NtkDontCareWinCollectRoots_rec(Abc_Obj_t *pObj, Vec_Ptr_t *vRoots)
static void Vec_IntPush(Vec_Int_t *p, int Entry)
void Abc_NtkDontCareWinSweepLeafTfo_rec(Abc_Obj_t *pObj, int nLevelLimit, Abc_Obj_t *pNode)
static void Abc_InfoClear(unsigned *p, int nWords)
static int Odc_IsComplement(Odc_Lit_t Lit)
static Odc_Lit_t * Odc_HashLookup(Odc_Man_t *p, Odc_Lit_t iFan0, Odc_Lit_t iFan1)
int Abc_NtkDontCareWinAddMissing_rec(Odc_Man_t *p, Abc_Obj_t *pObj)
static Odc_Lit_t Odc_Regular(Odc_Lit_t Lit)
static Odc_Lit_t Odc_Obj2Lit(Odc_Man_t *p, Odc_Obj_t *pObj)
void Abc_NtkDontCareWinSweepLeafTfo(Odc_Man_t *p)
static int Odc_IsConst(Odc_Lit_t Lit)
int Abc_NtkDontCareSimulateBefore(Odc_Man_t *p, unsigned *puTruth)
Odc_Man_t * Abc_NtkDontCareAlloc(int nVarsMax, int nLevels, int fVerbose, int fVeryVerbose)
FUNCTION DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
static Odc_Lit_t Odc_Const0()
static Odc_Lit_t Odc_And(Odc_Man_t *p, Odc_Lit_t iFan0, Odc_Lit_t iFan1)
static void * Vec_PtrEntry(Vec_Ptr_t *p, int i)
void Abc_NtkDontCareTruthOne(Odc_Man_t *p, Odc_Lit_t Lit)
static int Abc_NodeIsTravIdCurrent(Abc_Obj_t *p)
static int Odc_IsTerm(Odc_Man_t *p, Odc_Lit_t Lit)
static int Odc_ObjFaninC1(Odc_Obj_t *pObj)
void Abc_NtkDontCareClear(Odc_Man_t *p)
static int Vec_IntSize(Vec_Int_t *p)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
static Vec_Ptr_t * Vec_PtrAlloc(int nCap)
FUNCTION DEFINITIONS ///.
#define Abc_ObjForEachFanin(pObj, pFanin, i)
static Odc_Lit_t Odc_Xor(Odc_Man_t *p, Odc_Lit_t iFan0, Odc_Lit_t iFan1)
void Abc_NtkDontCareSimulateSetElem(Odc_Man_t *p)
static void Abc_NtkIncrementTravId(Abc_Ntk_t *p)
static int Odc_ObjIsTravIdCurrent(Odc_Man_t *p, Odc_Obj_t *pObj)
void Abc_NtkDontCareSimulateSetElem2(Odc_Man_t *p)
void Abc_NtkDontCareWinCollectRoots(Odc_Man_t *p)
static void Odc_ManIncrementTravId(Odc_Man_t *p)
static void Vec_PtrClear(Vec_Ptr_t *p)
void Abc_NtkDontCareFree(Odc_Man_t *p)
static void Abc_InfoRandom(unsigned *p, int nWords)
static void Vec_IntFree(Vec_Int_t *p)
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
static int Abc_ObjIsComplement(Abc_Obj_t *p)
static void Vec_IntClear(Vec_Int_t *p)
static int Odc_ObjFaninC0(Odc_Obj_t *pObj)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
static Odc_Lit_t Odc_Const1()
static Vec_Ptr_t * Vec_PtrAllocSimInfo(int nEntries, int nWords)
static void Abc_NodeSetTravIdCurrent(Abc_Obj_t *p)
static void Vec_PtrFree(Vec_Ptr_t *p)
static int Odc_PiNum(Odc_Man_t *p)