51 int i, k, Level, Volume;
58 if ( LevelOld < (
int)p0->
Level )
61 printf(
"Starting level %d (at %d nodes).\n", LevelOld+1, i );
62 printf(
"Considered = %5d M. Found = %8d. Classes = %6d. Trying %7d.\n",
63 p->nConsidered/1000000,
p->vForest->nSize,
p->nClasses, i );
71 if ( p0->
Level + p1->Level > 5 )
78 Level = 1 + Abc_MaxInt( p0->
Level, p1->Level );
81 Rwr_ManTryNode(
p, p0 , p1 , 0, Level, Volume );
82 Rwr_ManTryNode(
p, Rwr_Not(p0), p1 , 0, Level, Volume );
83 Rwr_ManTryNode(
p, p0 , Rwr_Not(p1), 0, Level, Volume );
84 Rwr_ManTryNode(
p, Rwr_Not(p0), Rwr_Not(p1), 0, Level, Volume );
86 Rwr_ManTryNode(
p, p0 , p1 , 1, Level, Volume + 1 );
88 if (
p->nConsidered % 50000000 == 0 )
89 printf(
"Considered = %5d M. Found = %8d. Classes = %6d. Trying %7d.\n",
90 p->nConsidered/1000000,
p->vForest->nSize,
p->nClasses, i );
94 printf(
"Considered = %5d M. Found = %8d. Classes = %6d. Trying %7d.\n",
95 p->nConsidered/1000000,
p->vForest->nSize,
p->nClasses, i );
108 Rwr_MarkUsed_rec(
p, p0 );
117 p->vForest->pArray[k] = p0;
120 p->vForest->nSize = k;
121 printf(
"Total canonical = %4d. Total used = %5d.\n", nNodes,
p->vForest->nSize );
144 uTruth = (p0->
uTruth ^ p1->uTruth);
147 uTruth = (Rwr_IsComplement(p0)? ~Rwr_Regular(p0)->uTruth : Rwr_Regular(p0)->uTruth) &
148 (Rwr_IsComplement(p1)? ~Rwr_Regular(p1)->uTruth : Rwr_Regular(p1)->uTruth) & 0xFFFF;
150 if ( Level > 2 && !
p->pPractical[
p->puCanons[uTruth]] )
153 ppPlace =
p->pTable + uTruth;
154 for ( pOld = *ppPlace; pOld; ppPlace = &pOld->
pNext, pOld = pOld->
pNext )
156 if ( pOld->
Level < (
unsigned)Level && pOld->
Volume < (
unsigned)Volume )
158 if ( pOld->
Level == (
unsigned)Level && pOld->
Volume < (
unsigned)Volume )
176 if (
p->pTable[uTruth] == NULL &&
p->puCanons[uTruth] == uTruth )
180 pNew->
Id =
p->vForest->nSize;
190 Vec_PtrPush(
p->vForest, pNew );
213 uTruth = (p0->
uTruth ^ p1->uTruth);
215 uTruth = (Rwr_IsComplement(p0)? ~Rwr_Regular(p0)->uTruth : Rwr_Regular(p0)->uTruth) &
216 (Rwr_IsComplement(p1)? ~Rwr_Regular(p1)->uTruth : Rwr_Regular(p1)->uTruth) & 0xFFFF;
219 pNew->
Id =
p->vForest->nSize;
229 Vec_PtrPush(
p->vForest, pNew );
231 if ( uTruth !=
p->puCanons[uTruth] )
236 if (
p->pTable[uTruth] == NULL )
257 pNew->
Id =
p->vForest->nSize;
267 Vec_PtrPush(
p->vForest, pNew );
292 Rwr_MarkUsed_rec(
p, Rwr_Regular(pNode->
p0) );
293 Rwr_MarkUsed_rec(
p, Rwr_Regular(pNode->
p1) );
354 if (
p->nTravIds++ < 0x8FFFFFFF )
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Rwr_Node_t * Rwr_ManAddVar(Rwr_Man_t *p, unsigned uTruth, int fPrecompute)
void Rwr_Trav_rec(Rwr_Man_t *p, Rwr_Node_t *pNode, int *pVolume)
Rwr_Node_t * Rwr_ManAddNode(Rwr_Man_t *p, Rwr_Node_t *p0, Rwr_Node_t *p1, int fExor, int Level, int Volume)
int Rwr_ManNodeVolume(Rwr_Man_t *p, Rwr_Node_t *p0, Rwr_Node_t *p1)
void Rwr_ManPrecompute(Rwr_Man_t *p)
FUNCTION DEFINITIONS ///.
void Rwr_ManIncTravId(Rwr_Man_t *p)
struct Rwr_Man_t_ Rwr_Man_t
#define RWR_LIMIT
INCLUDES ///.
struct Rwr_Node_t_ Rwr_Node_t
void Rwr_ListAddToTail(Rwr_Node_t **ppList, Rwr_Node_t *pNode)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.