51 int i, ThisSize, Length, LengthStart;
52 if ( Vec_PtrSize(
p->vSolvers) < 2 )
54 Abc_Print(1,
"Frame " );
55 Abc_Print(1,
"Clauses " );
56 Abc_Print(1,
"Max Queue " );
57 Abc_Print(1,
"Flops " );
58 Abc_Print(1,
"Cex " );
59 Abc_Print(1,
"Time" );
68 Length += 1 + Abc_Base10Log(Vec_PtrSize(vVec)+1);
70 LengthStart = Abc_MaxInt( 0, Length - 60 );
71 Abc_Print( 1,
"%3d :", Vec_PtrSize(
p->vSolvers)-1 );
73 if ( LengthStart > 0 )
75 Abc_Print( 1,
" ..." );
81 if ( Length < LengthStart )
83 Length += 1 + Abc_Base10Log(Vec_PtrSize(vVec)+1);
86 Abc_Print( 1,
" %d", Vec_PtrSize(vVec) );
87 Length += 1 + Abc_Base10Log(Vec_PtrSize(vVec)+1);
88 ThisSize += 1 + Abc_Base10Log(Vec_PtrSize(vVec)+1);
90 for ( i = ThisSize; i < 70; i++ )
92 Abc_Print( 1,
"%5d",
p->nQueMax );
93 Abc_Print( 1,
"%6d",
p->vAbsFlops ? Vec_IntCountPositive(
p->vAbsFlops) :
p->nAbsFlops );
94 if (
p->pPars->fUseAbs )
95 Abc_Print( 1,
"%4d",
p->nCexes );
96 Abc_Print( 1,
"%10.2f sec", 1.0*Time/CLOCKS_PER_SEC );
97 if (
p->pPars->fSolveAll )
98 Abc_Print( 1,
" CEX =%4d",
p->pPars->nFailOuts );
99 if (
p->pPars->nTimeOutOne )
100 Abc_Print( 1,
" T/O =%3d",
p->pPars->nDropOuts );
101 Abc_Print( 1,
"%s", fClose ?
"\n":
"\r" );
103 p->nQueMax = 0,
p->nCexes = 0;
123 vFlopCount = Vec_IntStart( Aig_ManRegNum(
p->pAig) );
126 if ( pCube->
nRefs == -1 )
128 for ( n = 0; n < pCube->
nLits; n++ )
130 assert( pCube->
Lits[n] >= 0 && pCube->
Lits[n] < 2*Aig_ManRegNum(
p->pAig) );
131 Vec_IntAddToEntry( vFlopCount, pCube->
Lits[n] >> 1, 1 );
151 int k, kMax = Vec_PtrSize(
p->vSolvers)-1;
153 if ( Vec_PtrSize(vArrayK) == 0 )
178 vResult = Vec_PtrAlloc( 100 );
181 Vec_PtrPush( vResult, pSet );
220 int i, Entry, Counter = 0;
221 if (
p->vInfCubes == NULL )
224 vCubes = Vec_PtrDup(
p->vInfCubes );
227 Counter += (Entry > 0);
228 Vec_IntFreeP( &vFlopCounts );
229 Vec_PtrFree( vCubes );
248 int i, k, Counter = 0;
251 Vec_PtrSort( vArrayK, (
int (*)(
const void *,
const void *))
Pdr_SetCompare );
254 Abc_Print( 1,
"C=%4d. F=%4d ", Counter++, k );
256 Abc_Print( 1,
"\n" );
275 Abc_Print(1,
"Clause: {" );
276 for ( i = 0; i <
p->nLits; i++ )
277 Abc_Print(1,
" %s%d", Abc_LitIsCompl(
p->Lits[i])?
"!":
"", Abc_Lit2Var(
p->Lits[i]) );
278 Abc_Print(1,
" }\n" );
300 pNew->pName = Abc_UtilStrsav(
p->pName );
301 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
304 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
311 pObjNew = Aig_ManConst1(pNew);
312 for ( n = 0; n < pCube->
nLits; n++ )
314 assert( Abc_Lit2Var(pCube->
Lits[n]) < Saig_ManRegNum(
p) );
315 pLit = Aig_NotCond( Aig_ManCi(pNew, Saig_ManPiNum(
p) + Abc_Lit2Var(pCube->
Lits[n])), Abc_LitIsCompl(pCube->
Lits[n]) );
316 pObjNew =
Aig_And( pNew, pObjNew, pLit );
322 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
330 Abc_Print(1,
"Aig_ManDupSimple(): The check has failed.\n" );
338 Abc_Print(1,
"Dumped modified AIG into file \"aig_with_clauses.aig\".\n" );
359 int i, kStart, Count = 0;
361 pFile = fopen( pFileName,
"w" );
364 Abc_Print( 1,
"Cannot open file \"%s\" for writing invariant.\n", pFileName );
372 vCubes = Vec_PtrDup(
p->vInfCubes );
373 Vec_PtrSort( vCubes, (
int (*)(
const void *,
const void *))
Pdr_SetCompare );
379 if ( pCube->
nRefs == -1 )
387 fprintf( pFile,
"# Inductive invariant for \"%s\"\n",
p->pAig->pName );
389 fprintf( pFile,
"# Clauses of the last timeframe for \"%s\"\n",
p->pAig->pName );
390 fprintf( pFile,
"# generated by PDR in ABC on %s\n",
Aig_TimeStamp() );
392 fprintf( pFile,
".o 1\n" );
393 fprintf( pFile,
".p %d\n", Count );
398 fprintf( pFile,
".ilb" );
399 for ( i = 0; i < Aig_ManRegNum(
p->pAig); i++ )
400 if ( !
p->pPars->fUseSupp || Vec_IntEntry( vFlopCounts, i ) )
401 fprintf( pFile,
" %s", pNamesCi[Saig_ManPiNum(
p->pAig) + i] );
402 fprintf( pFile,
"\n" );
404 fprintf( pFile,
".ob inv\n" );
409 if ( pCube->
nRefs == -1 )
411 Pdr_SetPrint( pFile, pCube, Aig_ManRegNum(
p->pAig), vFlopCounts );
412 fprintf( pFile,
" 1\n" );
414 fprintf( pFile,
".e\n\n" );
416 Vec_IntFreeP( &vFlopCounts );
417 Vec_PtrFree( vCubes );
419 Abc_Print( 1,
"Inductive invariant was written into file \"%s\".\n", pFileName );
421 Abc_Print( 1,
"Clauses of the last timeframe were written into file \"%s\".\n", pFileName );
442 vStr = Vec_StrAlloc( 1000 );
445 if (
p->vInfCubes == NULL )
448 vCubes = Vec_PtrDup(
p->vInfCubes );
449 Vec_PtrSort( vCubes, (
int (*)(
const void *,
const void *))
Pdr_SetCompare );
455 if ( pCube->
nRefs == -1 )
459 Vec_IntFreeP( &vFlopCounts );
460 Vec_PtrFree( vCubes );
461 Vec_StrPush( vStr,
'\0' );
482 Abc_Print( 1,
"Invariant F[%d] : %d clauses with %d flops (out of %d) (cex = %d, ave = %.2f)\n",
483 kStart, Vec_PtrSize(vCubes),
Pdr_ManCountVariables(
p, kStart), Aig_ManRegNum(
p->pAig),
p->nCexesTotal, 1.0*
p->nXsimLits/
p->nXsimRuns );
486 Vec_PtrFree( vCubes );
506 int i, kStart, kThis, RetValue, Counter = 0;
512 kThis = Vec_PtrSize(
p->vSolvers);
520 RetValue =
sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits) );
522 sat_solver_compress( pSat );
528 RetValue =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), 0, 0, 0, 0 );
531 Abc_Print( 1,
"Verification of clause %d failed.\n", i );
536 Abc_Print( 1,
"Verification of %d clauses has failed.\n", Counter );
539 Abc_Print( 1,
"Verification of invariant with %d clauses was successful. ", Vec_PtrSize(vCubes) );
540 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
543 Vec_PtrFree( vCubes );
562 int i, kThis, RetValue, fChanges = 0, Counter = 0;
564 kThis = Vec_PtrSize(
p->vSolvers);
569 if ( pCube->
nRefs == -1 )
572 RetValue =
sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits) );
574 sat_solver_compress( pSat );
579 if ( pCube->
nRefs == -1 )
582 RetValue =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), 0, 0, 0, 0 );
608 vResult = Vec_IntAlloc( 1000 );
609 Vec_IntPush( vResult, 0 );
612 if ( pCube->
nRefs == -1 )
614 Vec_IntAddToEntry( vResult, 0, 1 );
615 Vec_IntPush( vResult, pCube->
nLits );
616 for ( v = 0; v < pCube->
nLits; v++ )
617 Vec_IntPush( vResult, pCube->
Lits[v] );
620 Vec_PtrFreeP( &
p->vInfCubes );
621 p->vInfCubes = vCubes;
622 Vec_IntPush( vResult, Aig_ManRegNum(
p->pAig) );
639#define Pdr_ForEachCube( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 1 )
644 Vec_Int_t * vMap = Vec_IntStart( Vec_IntSize(vCounts) );
647 Vec_IntWriteEntry( vMap, i, k++ );
652 int i, k, * pCube, * pList = Vec_IntArray(vInv);
653 Vec_Int_t * vCounts = Vec_IntStart( Vec_IntEntryLast(vInv) );
655 for ( k = 0; k < pCube[0]; k++ )
656 Vec_IntAddToEntry( vCounts, Abc_Lit2Var(pCube[k+1]), 1 );
662 int nZeros = Vec_IntCountZero( vCounts );
663 Vec_IntFree( vCounts );
664 return Vec_IntEntryLast(vInv) - nZeros;
671 int nVars = Vec_IntSize(vCounts) - Vec_IntCountZero(vCounts);
672 int i, k, * pCube, * pList = Vec_IntArray(vInv);
673 char * pBuffer =
ABC_ALLOC(
char, (
size_t)(
unsigned)nVars );
674 for ( i = 0; i < nVars; i++ )
678 for ( k = 0; k < pCube[0]; k++ )
679 pBuffer[Vec_IntEntry(vMap, Abc_Lit2Var(pCube[k+1]))] =
'0' + !Abc_LitIsCompl(pCube[k+1]);
680 for ( k = 0; k < nVars; k++ )
681 Vec_StrPush( vStr, pBuffer[k] );
682 Vec_StrPush( vStr,
' ' );
683 Vec_StrPush( vStr,
'1' );
684 Vec_StrPush( vStr,
'\n' );
685 for ( k = 0; k < pCube[0]; k++ )
686 pBuffer[Vec_IntEntry(vMap, Abc_Lit2Var(pCube[k+1]))] =
'-';
688 Vec_StrPush( vStr,
'\0' );
695 Abc_Print(1,
"Invariant contains %d clauses with %d literals and %d flops (out of %d).\n", Vec_IntEntry(vInv, 0), Vec_IntSize(vInv)-Vec_IntEntry(vInv, 0)-2,
Pdr_InvUsedFlopNum(vInv), Vec_IntEntryLast(vInv) );
700 Abc_Print(1,
"%s", Vec_StrArray( vStr ) );
701 Vec_IntFree( vCounts );
709 int fCheckProperty = 1;
710 int i, k, status, nFailed = 0, nFailedOuts = 0;
712 int * pCube, * pList = Vec_IntArray(vInv);
716 int iFiVarBeg = 1 + Gia_ManPoNum(
p);
721 Vec_IntClear( vLits );
722 for ( k = 0; k < pCube[0]; k++ )
723 if ( pCube[k+1] != -1 )
724 Vec_IntPush( vLits, Abc_Var2Lit(iFoVarBeg + Abc_Lit2Var(pCube[k+1]), !Abc_LitIsCompl(pCube[k+1])) );
725 if ( Vec_IntSize(vLits) == 0 )
727 Vec_IntFree( vLits );
735 if ( fCheckProperty )
737 for ( i = 0; i < Gia_ManPoNum(
p); i++ )
739 Vec_IntFill( vLits, 1, Abc_Var2Lit(1+i, 0) );
740 status =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntLimit(vLits), nBTLimit, 0, 0, 0 );
746 Abc_Print(1,
"Coverage check failed for output %d.\n", i );
750 Vec_IntFree( vLits );
762 Vec_IntClear( vLits );
763 for ( k = 0; k < pCube[0]; k++ )
764 if ( pCube[k+1] != -1 )
765 Vec_IntPush( vLits, Abc_Var2Lit(iFiVarBeg + Abc_Lit2Var(pCube[k+1]), Abc_LitIsCompl(pCube[k+1])) );
768 status =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntLimit(vLits), nBTLimit, 0, 0, 0 );
769 if ( status !=
l_True && fVerbose )
770 Abc_Print(1,
"Finished checking clause %d (out of %d)...\r", i, pList[0] );
777 Abc_Print(1,
"Inductiveness check failed for clause %d.\n", i );
781 Vec_IntFree( vLits );
785 Vec_IntFree( vLits );
786 return nFailed + nFailedOuts;
804 int fCheckProperty = 1;
806 int n, i, k, status, nLits, fFailed = 0, fCannot = 0, nRemoved = 0;
811 int * pCube, * pList = Vec_IntArray(vInv), nCubes = pList[0];
814 Vec_Bit_t * vRemoved = Vec_BitStart( nCubes );
815 int iFoVarBeg = pCnf->
nVars - Gia_ManRegNum(
p);
816 int iFiVarBeg = 1 + Gia_ManPoNum(
p);
825 Vec_IntFill( vLits, 1, Abc_Var2Lit(iAuxVarBeg + i, 1) );
826 for ( k = 0; k < pCube[0]; k++ )
827 Vec_IntPush( vLits, Abc_Var2Lit(iFoVarBeg + Abc_Lit2Var(pCube[k+1]), !Abc_LitIsCompl(pCube[k+1])) );
835 if ( Vec_BitEntry(vRemoved, i) )
838 Vec_IntClear( vLits );
839 for ( k = 0; k < nCubes; k++ )
840 if ( k != i && !Vec_BitEntry(vRemoved, k) )
841 Vec_IntPush( vLits, Abc_Var2Lit(iAuxVarBeg + k, 0) );
842 nLits = Vec_IntSize( vLits );
844 if ( fCheckProperty )
846 for ( k = 0; k < Gia_ManPoNum(
p); k++ )
848 Vec_IntShrink( vLits, nLits );
849 Vec_IntPush( vLits, Abc_Var2Lit(1+k, 0) );
850 status =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntLimit(vLits), nBTLimit, 0, 0, 0 );
862 if ( k < Gia_ManPoNum(
p) )
869 if ( Vec_BitEntry(vRemoved, n) || n == i )
872 Vec_IntShrink( vLits, nLits );
873 for ( k = 0; k < pCube[0]; k++ )
874 Vec_IntPush( vLits, Abc_Var2Lit(iFiVarBeg + Abc_Lit2Var(pCube[k+1]), Abc_LitIsCompl(pCube[k+1])) );
877 status =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntLimit(vLits), nBTLimit, 0, 0, 0 );
895 Abc_Print(1,
"Removing clause %d.\n", i );
896 Vec_BitWriteEntry( vRemoved, i, 1 );
900 Abc_Print(1,
"Invariant minimization reduced %d clauses (out of %d). ", nRemoved, nCubes );
902 Abc_Print(1,
"Invariant minimization did not change the invariant. " );
903 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
905 if ( !fFailed && nRemoved > 0 )
907 vRes = Vec_IntAlloc( 1000 );
908 Vec_IntPush( vRes, nCubes-nRemoved );
910 if ( !Vec_BitEntry(vRemoved, i) )
911 for ( k = 0; k <= pCube[0]; k++ )
912 Vec_IntPush( vRes, pCube[k] );
913 Vec_IntPush( vRes, Vec_IntEntryLast(vInv) );
917 Vec_BitFree( vRemoved );
918 Vec_IntFree( vLits );
926 int i, k, nLits = 0, * pCube, * pList = Vec_IntArray(vInv), nRemoved = 0;
933 for ( k = 0; k < pCube[0]; k++ )
935 int Save = pCube[k+1];
944 Abc_Print(1,
"Removing lit %d from clause %d.\n", k, i );
955 Abc_Print(1,
"Invariant minimization reduced %d literals (out of %d). ", nRemoved, nLits );
957 Abc_Print(1,
"Invariant minimization did not change the invariant. " );
958 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
961 vRes = Vec_IntAlloc( 1000 );
962 Vec_IntPush( vRes, pList[0] );
966 for ( k = 0; k < pCube[0]; k++ )
967 if ( pCube[k+1] != -1 )
969 Vec_IntPush( vRes, nLits );
970 for ( k = 0; k < pCube[0]; k++ )
971 if ( pCube[k+1] != -1 )
972 Vec_IntPush( vRes, pCube[k+1] );
974 Vec_IntPush( vRes, Vec_IntEntryLast(vInv) );
ABC_DLL char ** Abc_NtkCollectCioNames(Abc_Ntk_t *pNtk, int fCollectCos)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManCleanData(Aig_Man_t *p)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
ABC_DLL Abc_Frame_t * Abc_FrameReadGlobalFrame()
ABC_DLL Abc_Ntk_t * Abc_FrameReadNtk(Abc_Frame_t *p)
ABC_DLL int Abc_FrameIsBatchMode()
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
#define sat_solver_addclause
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
struct Gia_Man_t_ Gia_Man_t
void * Mf_ManGenerateCnf(Gia_Man_t *pGia, int nLutSize, int fCnfObjIds, int fAddOrCla, int fMapping, int fVerbose)
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
struct Pdr_Set_t_ Pdr_Set_t
void Pdr_SetPrintStr(Vec_Str_t *vStr, Pdr_Set_t *p, int nRegs, Vec_Int_t *vFlopCounts)
void Pdr_SetPrint(FILE *pFile, Pdr_Set_t *p, int nRegs, Vec_Int_t *vFlopCounts)
int Pdr_SetCompare(Pdr_Set_t **pp1, Pdr_Set_t **pp2)
sat_solver * Pdr_ManCreateSolver(Pdr_Man_t *p, int k)
DECLARATIONS ///.
struct Pdr_Man_t_ Pdr_Man_t
Vec_Int_t * Pdr_ManCubeToLits(Pdr_Man_t *p, int k, Pdr_Set_t *pCube, int fCompl, int fNext)
int Pdr_InvCheck_int(Gia_Man_t *p, Vec_Int_t *vInv, int fVerbose, sat_solver *pSat, int fSkip)
int Pdr_ManCountVariables(Pdr_Man_t *p, int kStart)
Vec_Int_t * Pdr_ManDeriveInfinityClauses(Pdr_Man_t *p, int fReduce)
void Pdr_ManPrintClauses(Pdr_Man_t *p, int kStart)
Vec_Int_t * Pdr_ManCountFlopsInv(Pdr_Man_t *p)
Vec_Int_t * Pdr_InvMap(Vec_Int_t *vCounts)
void Pdr_ManDumpClauses(Pdr_Man_t *p, char *pFileName, int fProved)
ABC_NAMESPACE_IMPL_START void Pdr_ManPrintProgress(Pdr_Man_t *p, int fClose, abctime Time)
DECLARATIONS ///.
int Pdr_InvCheck(Gia_Man_t *p, Vec_Int_t *vInv, int fVerbose)
int Pdr_ManFindInvariantStart(Pdr_Man_t *p)
int Pdr_ManDeriveMarkNonInductive(Pdr_Man_t *p, Vec_Ptr_t *vCubes)
int Pdr_InvUsedFlopNum(Vec_Int_t *vInv)
Aig_Man_t * Pdr_ManDupAigWithClauses(Aig_Man_t *p, Vec_Ptr_t *vCubes)
void Pdr_ManReportInvariant(Pdr_Man_t *p)
Vec_Str_t * Pdr_InvPrintStr(Vec_Int_t *vInv, Vec_Int_t *vCounts)
void Pdr_InvPrint(Vec_Int_t *vInv, int fVerbose)
Vec_Int_t * Pdr_InvMinimizeLits(Gia_Man_t *p, Vec_Int_t *vInv, int fVerbose)
void Pdr_ManDumpAig(Aig_Man_t *p, Vec_Ptr_t *vCubes)
void Pdr_ManVerifyInvariant(Pdr_Man_t *p)
void Pdr_SetPrintOne(Pdr_Set_t *p)
Vec_Int_t * Pdr_InvCounts(Vec_Int_t *vInv)
Vec_Str_t * Pdr_ManDumpString(Pdr_Man_t *p)
Vec_Ptr_t * Pdr_ManCollectCubes(Pdr_Man_t *p, int kStart)
Vec_Int_t * Pdr_InvMinimize(Gia_Man_t *p, Vec_Int_t *vInv, int fVerbose)
Vec_Int_t * Pdr_ManCountFlops(Pdr_Man_t *p, Vec_Ptr_t *vCubes)
#define Pdr_ForEachCube(pList, pCut, i)
void * Cnf_DataWriteIntoSolver(Cnf_Dat_t *p, int nFrames, int fInit)
#define Saig_ManForEachLi(p, pObj, i)
void sat_solver_setnvars(sat_solver *s, int n)
int sat_solver_nvars(sat_solver *s)
void sat_solver_delete(sat_solver *s)
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachLevelStart(vGlob, vVec, i, LevelStart)
#define Vec_VecForEachLevelStartStop(vGlob, vVec, i, LevelStart, LevelStop)
#define Vec_VecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.