90 DdNode * bCof, * bVar;
91 int i, iVar, iVarBest = -1, iValue, iValueBest =
ABC_INFINITY, Size0Best = -1;
92 int Size, Size0, Size1;
94 Size = Cudd_DagSize(bFunc);
99 iVar = Aig_ObjId(pObj);
102printf(
"Var =%3d : ", iVar );
103 bVar = Cudd_bddIthVar(dd, iVar);
105 bCof = Cudd_bddAnd( dd, bFunc, Cudd_Not(bVar) ); Cudd_Ref( bCof );
106 Size0 = Cudd_DagSize(bCof);
108printf(
"Supp0 =%3d ", Cudd_SupportSize(dd, bCof) );
110printf(
"Size0 =%6d ", Size0 );
111 Cudd_RecursiveDeref( dd, bCof );
113 bCof = Cudd_bddAnd( dd, bFunc, bVar ); Cudd_Ref( bCof );
114 Size1 = Cudd_DagSize(bCof);
116printf(
"Supp1 =%3d ", Cudd_SupportSize(dd, bCof) );
118printf(
"Size1 =%6d ", Size1 );
119 Cudd_RecursiveDeref( dd, bCof );
121 iValue = Abc_MaxInt(Size0, Size1) - Abc_MinInt(Size0, Size1) + Size0 + Size1 - Size;
123printf(
"D =%6d ", Size0 + Size1 - Size );
125printf(
"B =%6d ", Abc_MaxInt(Size0, Size1) - Abc_MinInt(Size0, Size1) );
127printf(
"S =%6d\n", iValue );
128 if ( Size0 > 1 && Size1 > 1 && iValueBest > iValue )
135 printf(
"BestVar = %4d/%4d. Value =%6d. Orig =%6d. Size0 =%6d. ",
136 iVarBest, Aig_ObjId(Saig_ManLo(pAig,iVarBest)), iValueBest, Size, Size0Best );
137 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
156 printf(
"Original = %6d. SuppSize = %3d. ",
157 Cudd_DagSize(bFunc), Cudd_SupportSize(dd, bFunc) );
158 bNew = Cudd_SubsetHeavyBranch( dd, bFunc, Cudd_SupportSize(dd, bFunc), 1000 ); Cudd_Ref( bNew );
159 printf(
"Result = %6d. SuppSize = %3d.\n",
160 Cudd_DagSize(bNew), Cudd_SupportSize(dd, bNew) );
161 Cudd_RecursiveDeref( dd, bNew );
178 int i, iVarLi, iVarLo;
179 p->vCs2Glo = Vec_IntStartFull( Aig_ManObjNumMax(
p->pAig) );
180 p->vNs2Glo = Vec_IntStartFull( Aig_ManObjNumMax(
p->pAig) );
181 p->vGlo2Cs = Vec_IntStartFull( Aig_ManRegNum(
p->pAig) );
182 p->vGlo2Ns = Vec_IntStartFull( Aig_ManRegNum(
p->pAig) );
185 iVarLi = Aig_ObjId(pObjLi);
186 iVarLo = Aig_ObjId(pObjLo);
187 assert( iVarLi >= 0 && iVarLi < Aig_ManObjNumMax(
p->pAig) );
188 assert( iVarLo >= 0 && iVarLo < Aig_ManObjNumMax(
p->pAig) );
189 Vec_IntWriteEntry(
p->vCs2Glo, iVarLo, i );
190 Vec_IntWriteEntry(
p->vNs2Glo, iVarLi, i );
191 Vec_IntWriteEntry(
p->vGlo2Cs, i, iVarLo );
192 Vec_IntWriteEntry(
p->vGlo2Ns, i, iVarLi );
197 Vec_IntWriteEntry(
p->vCs2Glo, Aig_ObjId(pObj), Aig_ManRegNum(
p->pAig)+i );
198 Vec_IntWriteEntry(
p->vNs2Glo, Aig_ObjId(pObj), Aig_ManRegNum(
p->pAig)+i );
217 DdNode * bRes, * bVar, * bTemp;
220 TimeStop = dd->TimeStop; dd->TimeStop = 0;
221 bRes = Cudd_ReadOne( dd ); Cudd_Ref( bRes );
224 iVar = (Cudd_ReadSize(dd) == Aig_ManRegNum(pAig)) ? i : Aig_ObjId(pObj);
225 bVar = Cudd_bddIthVar( dd, iVar );
226 bRes = Cudd_bddAnd( dd, bTemp = bRes, Cudd_Not(bVar) ); Cudd_Ref( bRes );
227 Cudd_RecursiveDeref( dd, bTemp );
230 dd->TimeStop = TimeStop;
251 DdNode * bState = NULL, * bImage, * bOneCube, * bTemp, * bRing;
252 int i, v, RetValue, nPiOffset;
253 char * pValues =
ABC_ALLOC(
char, Cudd_ReadSize(
p->ddR) );
254 assert( Vec_PtrSize(
p->vRings) > 0 );
257 p->ddR->TimeStop = 0;
260 memset(
p->pVars2Q, 0,
sizeof(
int) * Cudd_ReadSize(
p->dd) );
261 vVarsNs = Vec_IntAlloc( Aig_ManRegNum(
p->pAig) );
264 p->pVars2Q[Aig_ObjId(pObj)] = 1;
265 Vec_IntPush( vVarsNs, Aig_ObjId(pObj) );
276 pCex =
Abc_CexAlloc( Saig_ManRegNum(
p->pAig), Saig_ManPiNum(
p->pAig), Vec_PtrSize(
p->vRings) );
277 pCex->iFrame = Vec_PtrSize(
p->vRings) - 1;
281 bOneCube = Cudd_bddIntersect(
p->ddR, (DdNode *)Vec_PtrEntryLast(
p->vRings),
p->ddR->bFunc ); Cudd_Ref( bOneCube );
282 RetValue = Cudd_bddPickOneCube(
p->ddR, bOneCube, pValues );
283 Cudd_RecursiveDeref(
p->ddR, bOneCube );
287 nPiOffset = Saig_ManRegNum(
p->pAig) + Saig_ManPiNum(
p->pAig) * (Vec_PtrSize(
p->vRings) - 1);
289 if ( pValues[Saig_ManRegNum(
p->pAig)+i] == 1 )
290 Abc_InfoSetBit( pCex->pData, nPiOffset + i );
293 if ( Vec_PtrSize(
p->vRings) > 1 )
300 if ( v == Vec_PtrSize(
p->vRings) - 1 )
306 p->pPars->fReorder,
p->pPars->fVeryVerbose, NULL );
313 Cudd_RecursiveDeref(
p->dd, bTemp );
316 bOneCube = Cudd_bddIntersect(
p->ddR, bImage, bRing ); Cudd_Ref( bOneCube );
317 Cudd_RecursiveDeref(
p->ddR, bImage );
320 RetValue = Cudd_bddPickOneCube(
p->ddR, bOneCube, pValues );
321 Cudd_RecursiveDeref(
p->ddR, bOneCube );
325 nPiOffset -= Saig_ManPiNum(
p->pAig);
327 if ( pValues[Saig_ManRegNum(
p->pAig)+i] == 1 )
328 Abc_InfoSetBit( pCex->pData, nPiOffset + i );
334 assert( pValues[i] == 0 );
341 assert( nPiOffset == Saig_ManRegNum(
p->pAig) );
345 assert( RetValue >= 0 && RetValue < Saig_ManPoNum(
p->pInit) );
346 pCex->iPo = RetValue;
349 Vec_IntFree( vVarsNs );
371 for ( i = 0; i < Cudd_ReadSize(dd); i++ )
373 pObj = Aig_ManObj( pAig, i );
376 if ( Saig_ObjIsPi(pAig, pObj) )
378 else if ( Saig_ObjIsLo(pAig, pObj) )
380 else if ( Saig_ObjIsPo(pAig, pObj) )
382 else if ( Saig_ObjIsLi(pAig, pObj) )
385 printf(
"%d=%d ", i, dd->perm[i] );
405 int i, Sum = 0, Entry;
406 for ( i = 0; i < dd->size; i++ )
408 pSubt = &(dd->subtables[dd->perm[i]]);
409 if ( pSubt->keys == pSubt->dead + 1 )
411 Entry = Abc_MaxInt(dd->perm[i], pVar2Lev[i]) - Abc_MinInt(dd->perm[i], pVar2Lev[i]);
431 DdNode * bTemp, * bNext;
432 int nIters, nBddSize0, nBddSize = -1, NumCmp;
433 abctime clk2, clk3, clk = Abc_Clock();
434 assert( Aig_ManRegNum(
p->pAig) > 0 );
437 p->pPars->TimeTarget =
p->pPars->TimeLimit ?
p->pPars->TimeLimit * CLOCKS_PER_SEC + Abc_Clock(): 0;
440 p->dd->TimeStop =
p->pPars->TimeTarget;
441 p->ddG->TimeStop =
p->pPars->TimeTarget;
442 p->ddR->TimeStop =
p->pPars->TimeTarget;
445 assert(
p->dd->bFunc == NULL );
451 if (
p->ddR->bFunc == NULL )
453 if ( !
p->pPars->fSilent )
454 printf(
"Reached timeout (%d seconds) during constructing the bad states.\n",
p->pPars->TimeLimit );
455 p->pPars->iFrame = -1;
458 Cudd_Ref(
p->ddR->bFunc );
464 if ( !
p->pPars->fSilent )
465 printf(
"Reached timeout (%d seconds) during constructing the bad states.\n",
p->pPars->TimeLimit );
466 p->pPars->iFrame = -1;
472 for ( nIters = 0; nIters <
p->pPars->nIterMax; nIters++ )
476 if (
p->pPars->TimeLimit && Abc_Clock() >
p->pPars->TimeTarget )
478 if ( !
p->pPars->fSilent )
479 printf(
"Reached timeout (%d seconds) during image computation.\n",
p->pPars->TimeLimit );
480 p->pPars->iFrame = nIters - 1;
489 if ( !
p->pPars->fSilent )
490 printf(
"Reached timeout (%d seconds) during ring transfer.\n",
p->pPars->TimeLimit );
491 p->pPars->iFrame = nIters - 1;
496 Vec_PtrPush(
p->vRings, bTemp );
499 if ( !
p->pPars->fSkipOutCheck && !Cudd_bddLeq(
p->ddR, bTemp, Cudd_Not(
p->ddR->bFunc) ) )
501 assert(
p->pInit->pSeqModel == NULL );
502 if ( !
p->pPars->fBackward )
504 if ( !
p->pPars->fSilent )
506 if ( !
p->pPars->fBackward )
507 Abc_Print( 1,
"Output %d of miter \"%s\" was asserted in frame %d. ",
p->pInit->pSeqModel->iPo, nIters );
509 Abc_Print( 1,
"Output ??? was asserted in frame %d (counter-example is not produced). ", nIters );
510 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
512 p->pPars->iFrame = nIters - 1;
519 nBddSize0 = Cudd_DagSize(
p->dd->bFunc );
525 if ( !
p->pPars->fSilent )
526 printf(
"Reached timeout (%d seconds) during image computation in quantification.\n",
p->pPars->TimeLimit );
527 p->pPars->iFrame = nIters - 1;
532 nBddSize = Cudd_DagSize( bNext );
533 p->timeImage += Abc_Clock() - clk3;
538 Cudd_RecursiveDeref(
p->ddG,
p->ddG->bFunc2 );
541 if (
p->ddG->bFunc2 == NULL )
543 if ( !
p->pPars->fSilent )
544 printf(
"Reached timeout (%d seconds) during image computation in transfer 1.\n",
p->pPars->TimeLimit );
545 p->pPars->iFrame = nIters - 1;
546 Cudd_RecursiveDeref(
p->dd, bNext );
550 Cudd_Ref(
p->ddG->bFunc2 );
551 Cudd_RecursiveDeref(
p->dd, bNext );
552 p->timeTran1 += Abc_Clock() - clk3;
557 memcpy(
p->pOrderL2,
p->dd->perm,
sizeof(
int) *
p->dd->size );
559 p->timeReo += Cudd_ReadReorderingTime(
p->dd);
560 p->ddLocReos += Cudd_ReadReorderings(
p->dd);
561 p->ddLocGrbs += Cudd_ReadGarbageCollections(
p->dd);
566 if ( !
p->pPars->fSilent )
567 printf(
"Reached timeout (%d seconds) during constructing the bad states.\n",
p->pPars->TimeLimit );
568 p->pPars->iFrame = nIters - 1;
575 p->ddG->bFunc2 = Cudd_bddAnd(
p->ddG, bTemp =
p->ddG->bFunc2, Cudd_Not(
p->ddG->bFunc) );
576 if (
p->ddG->bFunc2 == NULL )
578 if ( !
p->pPars->fSilent )
579 printf(
"Reached timeout (%d seconds) during image computation in transfer 1.\n",
p->pPars->TimeLimit );
580 p->pPars->iFrame = nIters - 1;
581 Cudd_RecursiveDeref(
p->ddG, bTemp );
585 Cudd_Ref(
p->ddG->bFunc2 );
586 Cudd_RecursiveDeref(
p->ddG, bTemp );
587 p->timeGloba += Abc_Clock() - clk3;
589 if ( Cudd_IsConstant(
p->ddG->bFunc2) )
593 p->ddG->bFunc = Cudd_bddOr(
p->ddG, bTemp =
p->ddG->bFunc,
p->ddG->bFunc2 );
594 if (
p->ddG->bFunc == NULL )
596 if ( !
p->pPars->fSilent )
597 printf(
"Reached timeout (%d seconds) during image computation in transfer 1.\n",
p->pPars->TimeLimit );
598 p->pPars->iFrame = nIters - 1;
599 Cudd_RecursiveDeref(
p->ddG, bTemp );
603 Cudd_Ref(
p->ddG->bFunc );
604 Cudd_RecursiveDeref(
p->ddG, bTemp );
605 p->timeGloba += Abc_Clock() - clk3;
615 if (
p->dd->bFunc == NULL )
617 if ( !
p->pPars->fSilent )
618 printf(
"Reached timeout (%d seconds) during image computation in transfer 2.\n",
p->pPars->TimeLimit );
619 p->pPars->iFrame = nIters - 1;
623 Cudd_Ref(
p->dd->bFunc );
624 p->timeTran2 += Abc_Clock() - clk3;
627 if (
p->pPars->fVerbose )
629 printf(
"I =%3d : ", nIters );
630 printf(
"Fr =%7d ", nBddSize0 );
631 printf(
"Im =%7d ", nBddSize );
632 printf(
"(%4d %4d) ",
p->ddLocReos,
p->ddLocGrbs );
633 printf(
"Rea =%6d ", Cudd_DagSize(
p->ddG->bFunc) );
634 printf(
"(%4d %4d) ", Cudd_ReadReorderings(
p->ddG), Cudd_ReadGarbageCollections(
p->ddG) );
636 printf(
"cL =%5d ", NumCmp );
638 Abc_PrintTime( 1,
"T", Abc_Clock() - clk2 );
639 memcpy(
p->pOrderG,
p->ddG->perm,
sizeof(
int) *
p->ddG->size );
650 if ( nIters ==
p->pPars->nIterMax - 1 )
652 if ( !
p->pPars->fSilent )
653 printf(
"Reached limit on the number of timeframes (%d).\n",
p->pPars->nIterMax );
654 p->pPars->iFrame = nIters;
662 if (
p->pPars->fVerbose )
664 double nMints = Cudd_CountMinterm(
p->ddG,
p->ddG->bFunc, Saig_ManRegNum(
p->pAig) );
665 if ( nIters >=
p->pPars->nIterMax || nBddSize >
p->pPars->nBddMax )
666 printf(
"Reachability analysis is stopped after %d frames.\n", nIters );
668 printf(
"Reachability analysis completed after %d frames.\n", nIters );
669 printf(
"Reachable states = %.0f. (Ratio = %.4f %%)\n", nMints, 100.0*nMints/pow(2.0, Saig_ManRegNum(
p->pAig)) );
672 if ( nIters >=
p->pPars->nIterMax || nBddSize >
p->pPars->nBddMax )
674 if ( !
p->pPars->fSilent )
675 printf(
"Verified only for states reachable in %d frames. ", nIters );
676 p->pPars->iFrame =
p->pPars->nIterMax;
680 if ( !
p->pPars->fSilent )
681 printf(
"The miter is proved unreachable after %d iterations. ", nIters );
682 p->pPars->iFrame = nIters - 1;
683 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
707 p->dd = Cudd_Init( Aig_ManObjNumMax(pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
708 p->ddG = Cudd_Init( Aig_ManRegNum(pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
709 p->ddR = Cudd_Init( Aig_ManCiNum(pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
710 Cudd_AutodynEnable(
p->dd, CUDD_REORDER_SYMM_SIFT );
711 Cudd_AutodynEnable(
p->ddG, CUDD_REORDER_SYMM_SIFT );
712 Cudd_AutodynEnable(
p->ddR, CUDD_REORDER_SYMM_SIFT );
713 p->vRings = Vec_PtrAlloc( 100 );
715 p->vLeaves = Vec_PtrAlloc( Aig_ManCiNum(pAig) );
717 Vec_PtrPush(
p->vLeaves, pObj );
719 p->vRoots = Vec_PtrAlloc( Aig_ManCoNum(pAig) );
721 Vec_PtrPush(
p->vRoots, pObj );
723 p->pOrderL =
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
724 p->pOrderL2=
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
725 p->pOrderG =
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
726 p->pVars2Q =
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
728 p->pVars2Q[Aig_ObjId(pObj)] = 1;
729 for ( i = 0; i < Aig_ManObjNumMax(pAig); i++ )
730 p->pOrderL[i] =
p->pOrderL2[i] =
p->pOrderG[i] = i;
750 if (
p->pPars->fVerbose )
752 p->timeOther =
p->timeTotal -
p->timeImage -
p->timeTran1 -
p->timeTran2 -
p->timeGloba;
753 p->timeReoG = Cudd_ReadReorderingTime(
p->ddG);
754 ABC_PRTP(
"Image ",
p->timeImage,
p->timeTotal );
758 ABC_PRTP(
"Transfer1",
p->timeTran1,
p->timeTotal );
759 ABC_PRTP(
"Transfer2",
p->timeTran2,
p->timeTotal );
760 ABC_PRTP(
"Global ",
p->timeGloba,
p->timeTotal );
761 ABC_PRTP(
"Other ",
p->timeOther,
p->timeTotal );
762 ABC_PRTP(
"TOTAL ",
p->timeTotal,
p->timeTotal );
763 ABC_PRTP(
" reo ",
p->timeReo,
p->timeTotal );
764 ABC_PRTP(
" reoG ",
p->timeReoG,
p->timeTotal );
767 Cudd_RecursiveDeref(
p->ddR,
p->ddR->bFunc );
769 Cudd_RecursiveDeref(
p->ddR, bTemp );
770 Vec_PtrFree(
p->vRings );
772 Cudd_RecursiveDeref(
p->ddG,
p->ddG->bFunc );
773 if (
p->ddG->bFunc2 )
774 Cudd_RecursiveDeref(
p->ddG,
p->ddG->bFunc2 );
781 Vec_IntFreeP( &
p->vCs2Glo );
782 Vec_IntFreeP( &
p->vNs2Glo );
783 Vec_IntFreeP( &
p->vGlo2Cs );
784 Vec_IntFreeP( &
p->vGlo2Ns );
785 Vec_PtrFree(
p->vLeaves );
786 Vec_PtrFree(
p->vRoots );
823 pMnn->timeTotal = Abc_Clock() - clk;
848 if ( pPars->fVerbose )
850 if ( pPars->fVerbose )
853 if ( !pPars->fSkipReach )
858 pMnn->timeTotal = Abc_Clock() - clk;
#define ABC_ALLOC(type, num)
#define ABC_PRTP(a, t, T)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
void Aig_ManPrintStats(Aig_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Aig_Man_t * Aig_ManDupFlopsOnly(Aig_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
ABC_NAMESPACE_IMPL_START DdNode * Llb_BddComputeBad(Aig_Man_t *pInit, DdManager *dd, abctime TimeOut)
DECLARATIONS ///.
DdNode * Llb_CoreComputeCube(DdManager *dd, Vec_Int_t *vVars, int fUseVarIndex, char *pValues)
FUNCTION DEFINITIONS ///.
void Llb_NonlinImageQuit()
DdNode * Llb_NonlinImage(Aig_Man_t *pAig, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vRoots, int *pVars2Q, DdManager *dd, DdNode *bCurrent, int fReorder, int fVerbose, int *pOrder)
DdNode * Llb_NonlinImageCompute(DdNode *bCurrent, int fReorder, int fDrop, int fVerbose, int *pOrder)
DdManager * Llb_NonlinImageStart(Aig_Man_t *pAig, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vRoots, int *pVars2Q, int *pOrder, int fFirst, abctime TimeTarget)
int Llb_NonlinCompPerms(DdManager *dd, int *pVar2Lev)
int Llb_NonlinReachability(Llb_Mnn_t *p)
void Llb_NonlinExperiment(Aig_Man_t *pAig, int Num)
int Llb_NonlinReoHook(DdManager *dd, char *Type, void *Method)
void Llb_NonlinPrepareVarMap(Llb_Mnn_t *p)
void Llb_MnnStop(Llb_Mnn_t *p)
Abc_Cex_t * Llb_NonlinDeriveCex(Llb_Mnn_t *p)
int Llb_NonlinFindBestVar(DdManager *dd, DdNode *bFunc, Aig_Man_t *pAig)
FUNCTION DEFINITIONS ///.
void Llb_NonlinTrySubsetting(DdManager *dd, DdNode *bFunc)
DdNode * Llb_NonlinComputeInitState(Aig_Man_t *pAig, DdManager *dd)
Llb_Mnn_t * Llb_MnnStart(Aig_Man_t *pInit, Aig_Man_t *pAig, Gia_ParLlb_t *pPars)
typedefABC_NAMESPACE_IMPL_START struct Llb_Mnn_t_ Llb_Mnn_t
DECLARATIONS ///.
int Llb_NonlinCoreReach(Aig_Man_t *pAig, Gia_ParLlb_t *pPars)
void Llb_ManSetDefaultParams(Gia_ParLlb_t *pPars)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Gia_ParLlb_t_ Gia_ParLlb_t
INCLUDES ///.
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#define Saig_ManForEachLi(p, pObj, i)
int Saig_ManFindFailedPoCex(Aig_Man_t *pAig, Abc_Cex_t *p)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_PtrForEachEntryReverse(Type, vVec, pEntry, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.