30static inline int Cec_ObjSatNum(
Cec_ManSat_t *
p,
Gia_Obj_t * pObj ) {
return p->pSatVars[Gia_ObjId(
p->pAig,pObj)]; }
31static inline void Cec_ObjSetSatNum(
Cec_ManSat_t *
p,
Gia_Obj_t * pObj,
int Num ) {
p->pSatVars[Gia_ObjId(
p->pAig,pObj)] = Num; }
50 return sat_solver_var_value(
p->pSat, Cec_ObjSatNum(
p, pObj) );
67 int pLits[4], RetValue, VarF, VarI, VarT, VarE, fCompT, fCompE;
69 assert( !Gia_IsComplement( pNode ) );
74 VarF = Cec_ObjSatNum(
p,pNode);
75 VarI = Cec_ObjSatNum(
p,pNodeI);
76 VarT = Cec_ObjSatNum(
p,Gia_Regular(pNodeT));
77 VarE = Cec_ObjSatNum(
p,Gia_Regular(pNodeE));
79 fCompT = Gia_IsComplement(pNodeT);
80 fCompE = Gia_IsComplement(pNodeE);
90 pLits[0] = toLitCond(VarI, 1);
91 pLits[1] = toLitCond(VarT, 1^fCompT);
92 pLits[2] = toLitCond(VarF, 0);
93 if (
p->pPars->fPolarFlip )
95 if ( pNodeI->
fPhase ) pLits[0] = lit_neg( pLits[0] );
96 if ( Gia_Regular(pNodeT)->fPhase ) pLits[1] = lit_neg( pLits[1] );
97 if ( pNode->
fPhase ) pLits[2] = lit_neg( pLits[2] );
101 pLits[0] = toLitCond(VarI, 1);
102 pLits[1] = toLitCond(VarT, 0^fCompT);
103 pLits[2] = toLitCond(VarF, 1);
104 if (
p->pPars->fPolarFlip )
106 if ( pNodeI->
fPhase ) pLits[0] = lit_neg( pLits[0] );
107 if ( Gia_Regular(pNodeT)->fPhase ) pLits[1] = lit_neg( pLits[1] );
108 if ( pNode->
fPhase ) pLits[2] = lit_neg( pLits[2] );
112 pLits[0] = toLitCond(VarI, 0);
113 pLits[1] = toLitCond(VarE, 1^fCompE);
114 pLits[2] = toLitCond(VarF, 0);
115 if (
p->pPars->fPolarFlip )
117 if ( pNodeI->
fPhase ) pLits[0] = lit_neg( pLits[0] );
118 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = lit_neg( pLits[1] );
119 if ( pNode->
fPhase ) pLits[2] = lit_neg( pLits[2] );
123 pLits[0] = toLitCond(VarI, 0);
124 pLits[1] = toLitCond(VarE, 0^fCompE);
125 pLits[2] = toLitCond(VarF, 1);
126 if (
p->pPars->fPolarFlip )
128 if ( pNodeI->
fPhase ) pLits[0] = lit_neg( pLits[0] );
129 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = lit_neg( pLits[1] );
130 if ( pNode->
fPhase ) pLits[2] = lit_neg( pLits[2] );
148 pLits[0] = toLitCond(VarT, 0^fCompT);
149 pLits[1] = toLitCond(VarE, 0^fCompE);
150 pLits[2] = toLitCond(VarF, 1);
151 if (
p->pPars->fPolarFlip )
153 if ( Gia_Regular(pNodeT)->fPhase ) pLits[0] = lit_neg( pLits[0] );
154 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = lit_neg( pLits[1] );
155 if ( pNode->
fPhase ) pLits[2] = lit_neg( pLits[2] );
159 pLits[0] = toLitCond(VarT, 1^fCompT);
160 pLits[1] = toLitCond(VarE, 1^fCompE);
161 pLits[2] = toLitCond(VarF, 0);
162 if (
p->pPars->fPolarFlip )
164 if ( Gia_Regular(pNodeT)->fPhase ) pLits[0] = lit_neg( pLits[0] );
165 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = lit_neg( pLits[1] );
166 if ( pNode->
fPhase ) pLits[2] = lit_neg( pLits[2] );
186 int * pLits, nLits, RetValue, i;
187 assert( !Gia_IsComplement(pNode) );
188 assert( Gia_ObjIsAnd( pNode ) );
190 nLits = Vec_PtrSize(vSuper) + 1;
196 pLits[0] = toLitCond(Cec_ObjSatNum(
p,Gia_Regular(pFanin)), Gia_IsComplement(pFanin));
197 pLits[1] = toLitCond(Cec_ObjSatNum(
p,pNode), 1);
198 if (
p->pPars->fPolarFlip )
200 if ( Gia_Regular(pFanin)->fPhase ) pLits[0] = lit_neg( pLits[0] );
201 if ( pNode->
fPhase ) pLits[1] = lit_neg( pLits[1] );
209 pLits[i] = toLitCond(Cec_ObjSatNum(
p,Gia_Regular(pFanin)), !Gia_IsComplement(pFanin));
210 if (
p->pPars->fPolarFlip )
212 if ( Gia_Regular(pFanin)->fPhase ) pLits[i] = lit_neg( pLits[i] );
215 pLits[nLits-1] = toLitCond(Cec_ObjSatNum(
p,pNode), 0);
216 if (
p->pPars->fPolarFlip )
218 if ( pNode->
fPhase ) pLits[nLits-1] = lit_neg( pLits[nLits-1] );
239 if ( Gia_IsComplement(pObj) || Gia_ObjIsCi(pObj) ||
240 (!fFirst && Gia_ObjValue(pObj) > 1) ||
243 Vec_PtrPushUnique( vSuper, pObj );
264 assert( !Gia_IsComplement(pObj) );
265 assert( !Gia_ObjIsCi(pObj) );
266 Vec_PtrClear( vSuper );
283 assert( !Gia_IsComplement(pObj) );
284 if ( Cec_ObjSatNum(
p,pObj) )
286 assert( Cec_ObjSatNum(
p,pObj) == 0 );
287 if ( Gia_ObjIsConst0(pObj) )
289 Vec_PtrPush(
p->vUsedNodes, pObj );
290 Cec_ObjSetSatNum(
p, pObj,
p->nSatVars++ );
291 if ( Gia_ObjIsAnd(pObj) )
292 Vec_PtrPush( vFrontier, pObj );
310 int i, k, fUseMuxes = 1;
312 if ( Cec_ObjSatNum(
p,pObj) )
314 if ( Gia_ObjIsCi(pObj) )
316 Vec_PtrPush(
p->vUsedNodes, pObj );
317 Cec_ObjSetSatNum(
p, pObj,
p->nSatVars++ );
321 assert( Gia_ObjIsAnd(pObj) );
323 vFrontier = Vec_PtrAlloc( 100 );
329 assert( Cec_ObjSatNum(
p,pNode) );
332 Vec_PtrClear(
p->vFanins );
333 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin0( Gia_ObjFanin0(pNode) ) );
334 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin0( Gia_ObjFanin1(pNode) ) );
335 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin1( Gia_ObjFanin0(pNode) ) );
336 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin1( Gia_ObjFanin1(pNode) ) );
348 assert( Vec_PtrSize(
p->vFanins) > 1 );
350 Vec_PtrFree( vFrontier );
373 Cec_ObjSetSatNum(
p, pObj, 0 );
374 Vec_PtrClear(
p->vUsedNodes );
385 Lit = toLitCond(
p->nSatVars, 1 );
389 Cec_ObjSetSatNum(
p, Gia_ManConst0(
p->pAig),
p->nSatVars++ );
408 float dActConeBumpMax = 20.0;
411 if ( Gia_ObjIsTravIdCurrent(
p->pAig, pObj) )
413 Gia_ObjSetTravIdCurrent(
p->pAig, pObj);
415 if ( Gia_ObjLevel(
p->pAig, pObj) <= LevelMin || Gia_ObjIsCi(pObj) )
419 if ( (iVar = Cec_ObjSatNum(
p,pObj)) )
421 p->pSat->factors[iVar] = dActConeBumpMax * (Gia_ObjLevel(
p->pAig, pObj) - LevelMin)/(LevelMax - LevelMin);
422 veci_push(&
p->pSat->act_vars, iVar);
442 float dActConeRatio = 0.5;
443 int LevelMin, LevelMax;
445 veci_resize(&
p->pSat->act_vars, 0);
449 assert( dActConeRatio > 0 && dActConeRatio < 1 );
450 LevelMax = Gia_ObjLevel(
p->pAig,pObj);
451 LevelMin = (int)(LevelMax * (1.0 - dActConeRatio));
473 int nBTLimit =
p->pPars->nBTLimit;
474 int Lit, RetValue, status, nConflicts;
477 if ( pObj == Gia_ManConst0(
p->pAig) )
479 if ( pObj == Gia_ManConst1(
p->pAig) )
489 if (
p->pSat == NULL ||
490 (
p->pPars->nSatVarMax &&
491 p->nSatVars >
p->pPars->nSatVarMax &&
492 p->nCallsSince >
p->pPars->nCallsRecycle) )
506 if (
p->pSat->qtail !=
p->pSat->qhead )
510 assert(
p->pSat->qtail ==
p->pSat->qhead );
515 Lit = toLitCond( Cec_ObjSatNum(
p,pObjR), Gia_IsComplement(pObj) );
516 if (
p->pPars->fPolarFlip )
518 if ( pObjR->
fPhase ) Lit = lit_neg( Lit );
522 nConflicts =
p->pSat->stats.conflicts;
526 (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
531p->timeSatUnsat += Abc_Clock() - clk;
532 Lit = lit_neg( Lit );
536 p->nConfUnsat +=
p->pSat->stats.conflicts - nConflicts;
540 else if ( RetValue ==
l_True )
542p->timeSatSat += Abc_Clock() - clk;
544 p->nConfSat +=
p->pSat->stats.conflicts - nConflicts;
550p->timeSatUndec += Abc_Clock() - clk;
552 p->nConfUndec +=
p->pSat->stats.conflicts - nConflicts;
573 int nBTLimit =
p->pPars->nBTLimit;
574 int Lits[2], RetValue, status, nConflicts;
577 if ( pObj1 == Gia_ManConst0(
p->pAig) || pObj2 == Gia_ManConst0(
p->pAig) || pObj1 == Gia_Not(pObj2) )
579 if ( pObj1 == Gia_ManConst1(
p->pAig) && (pObj2 == NULL || pObj2 == Gia_ManConst1(
p->pAig)) )
589 if (
p->pSat == NULL ||
590 (
p->pPars->nSatVarMax &&
591 p->nSatVars >
p->pPars->nSatVarMax &&
592 p->nCallsSince >
p->pPars->nCallsRecycle) )
608 if (
p->pSat->qtail !=
p->pSat->qhead )
612 assert(
p->pSat->qtail ==
p->pSat->qhead );
617 Lits[0] = toLitCond( Cec_ObjSatNum(
p,pObjR1), Gia_IsComplement(pObj1) );
618 Lits[1] = toLitCond( Cec_ObjSatNum(
p,pObjR2), Gia_IsComplement(pObj2) );
619 if (
p->pPars->fPolarFlip )
621 if ( pObjR1->
fPhase ) Lits[0] = lit_neg( Lits[0] );
622 if ( pObjR2->
fPhase ) Lits[1] = lit_neg( Lits[1] );
626 nConflicts =
p->pSat->stats.conflicts;
630 (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
635p->timeSatUnsat += Abc_Clock() - clk;
636 Lits[0] = lit_neg( Lits[0] );
637 Lits[1] = lit_neg( Lits[1] );
641 p->nConfUnsat +=
p->pSat->stats.conflicts - nConflicts;
645 else if ( RetValue ==
l_True )
647p->timeSatSat += Abc_Clock() - clk;
649 p->nConfSat +=
p->pSat->stats.conflicts - nConflicts;
655p->timeSatUndec += Abc_Clock() - clk;
657 p->nConfUndec +=
p->pSat->stats.conflicts - nConflicts;
691 for ( i = 0; i < Gia_ManCiNum(
p->pAig); i++ )
693 int iVar = Cec_ObjSatNum(
p, Gia_ManCi(
p->pAig, i));
694 if ( iVar > 0 && sat_solver_var_value(
p->pSat, iVar) )
695 pCex->pData[i>>5] |= (1<<(i & 31));
705 abctime clk = Abc_Clock(), clk2;
707 if ( pPars->fSaveCexes )
708 pAig->
vSeqModelVec = Vec_PtrStart( Gia_ManCoNum(pAig) );
712 pPat->iStart = Vec_StrSize(pPat->vStorage);
715 pPat->nPatLitsMin = 0;
724 if ( Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) )
726 status = !Gia_ObjFaninC0(pObj);
727 pObj->
fMark0 = (status == 0);
728 pObj->
fMark1 = (status == 1);
729 if ( pPars->fSaveCexes )
733 Bar_ProgressUpdate( pProgress, i,
"SAT..." );
736 pObj->
fMark0 = (status == 0);
737 pObj->
fMark1 = (status == 1);
738 if ( status == 1 && vIdsOrig )
740 int iObj1 = Vec_IntEntry(vMiterPairs, 2*i);
741 int iObj2 = Vec_IntEntry(vMiterPairs, 2*i+1);
742 int OrigId1 = Vec_IntEntry(vIdsOrig, iObj1);
743 int OrigId2 = Vec_IntEntry(vIdsOrig, iObj2);
744 assert( OrigId1 >= 0 && OrigId2 >= 0 );
745 Vec_IntPushTwo( vEquivPairs, OrigId1, OrigId2 );
747 if ( pPars->fSaveCexes && status != -1 )
750 if ( f0Proved && status == 1 )
751 Gia_ManPatchCoDriver( pAig, i, 0 );
769 pPat->timeTotalSave += Abc_Clock() - clk3;
772 if ( pPars->fCheckMiter )
775 p->timeTotal = Abc_Clock() - clk;
777 if ( pPars->fVerbose )
797 Vec_IntClear( vPat );
801 nSize = Vec_IntEntry( vCexStore, iStart++ );
805 for ( k = 0; k < nSize; k++ )
806 Vec_IntPush( vPat, Vec_IntEntry( vCexStore, iStart++ ) );
815 int i, status, iStart = 0;
816 assert( Vec_StrSize(vStatus) == Gia_ManCoNum(pAig) );
820 pPat->iStart = Vec_StrSize(pPat->vStorage);
823 pPat->nPatLitsMin = 0;
827 status = (int)Vec_StrEntry(vStatus, i);
828 pObj->
fMark0 = (status == 0);
829 pObj->
fMark1 = (status == 1);
830 if ( Vec_IntSize(vCexStore) > 0 && status != 1 )
835 if ( pPat && Vec_IntSize(vPat) > 0 )
839 pPat->timeTotalSave += Abc_Clock() - clk3;
842 if ( pPars->fCheckMiter )
845 assert( iStart == Vec_IntSize(vCexStore) );
847 Vec_StrFree( vStatus );
848 Vec_IntFree( vCexStore );
882 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
884 Gia_ObjSetTravIdCurrent(
p, pObj);
885 if ( Gia_ObjIsCi(pObj) )
887 unsigned * pInfo = (
unsigned *)Vec_PtrEntry( vInfo, nRegs + Gia_ObjCioId(pObj) );
889 Abc_InfoXorBit( pInfo, iPat );
894 assert( Gia_ObjIsAnd(pObj) );
917 int iPat = 0, nPatsInit, nPats;
920 nPatsInit = nPats = 32 * Vec_PtrReadWordsSimInfo(vPatts);
925 vStatus = Vec_StrAlloc( Gia_ManPoNum(pAig) );
929 Bar_ProgressUpdate( pProgress, i,
"SAT..." );
930 if ( Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) )
932 if ( Gia_ObjFaninC0(pObj) )
935 Vec_StrPush( vStatus, 0 );
940 Vec_StrPush( vStatus, 1 );
946 Vec_StrPush( vStatus, (
char)status );
952 int nWords = Vec_PtrReadWordsSimInfo(vPatts);
953 Vec_PtrReallocSimInfo( vPatts );
955 nPats = 32 * Vec_PtrReadWordsSimInfo(vPatts);
957 if ( iPat % nPatsInit == 0 )
973 p->timeTotal = Abc_Clock() - clk;
975 if ( pPars->fVerbose )
999 Vec_IntPush( vCexStore, Out );
1002 Vec_IntPush( vCexStore, -1 );
1006 Vec_IntPush( vCexStore, Vec_IntSize(vCex) );
1008 Vec_IntPush( vCexStore, Entry );
1024 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
1026 Gia_ObjSetTravIdCurrent(
p, pObj);
1027 if ( Gia_ObjIsCi(pObj) )
1033 assert( Gia_ObjIsAnd(pObj) );
1051 Vec_IntClear(
p->vCex );
1084 vStatus = Vec_StrAlloc( Gia_ManPoNum(pAig) );
1085 vCexStore = Vec_IntAlloc( 10000 );
1091 Vec_IntClear(
p->vCex );
1092 Bar_ProgressUpdate( pProgress, i,
"SAT..." );
1093 if ( Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) )
1095 if ( Gia_ObjFaninC0(pObj) )
1099 Vec_StrPush( vStatus, 0 );
1104 Vec_StrPush( vStatus, 1 );
1109 Vec_StrPush( vStatus, (
char)status );
1125 p->timeTotal = Abc_Clock() - clk;
1130 *pvStatus = vStatus;
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Bar_ProgressStop(Bar_Progress_t *p)
Bar_Progress_t * Bar_ProgressStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
struct Bar_Progress_t_ Bar_Progress_t
BASIC TYPES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
void Cec_ManPatSavePattern(Cec_ManPat_t *pPat, Cec_ManSat_t *p, Gia_Obj_t *pObj)
void Cec_ManPatSavePatternCSat(Cec_ManPat_t *pMan, Vec_Int_t *vPat)
void Cec_ManSatPrintStats(Cec_ManSat_t *p)
typedefABC_NAMESPACE_HEADER_START struct Cec_ManPat_t_ Cec_ManPat_t
INCLUDES ///.
void Cec_ManSatStop(Cec_ManSat_t *p)
struct Cec_ManSat_t_ Cec_ManSat_t
Cec_ManSat_t * Cec_ManSatCreate(Gia_Man_t *pAig, Cec_ParSat_t *pPars)
DECLARATIONS ///.
#define sat_solver_addclause
void Cec_CollectSuper_rec(Gia_Obj_t *pObj, Vec_Ptr_t *vSuper, int fFirst, int fUseMuxes)
void Cec_CnfNodeAddToSolver(Cec_ManSat_t *p, Gia_Obj_t *pObj)
void Cec_SetActivityFactors_rec(Cec_ManSat_t *p, Gia_Obj_t *pObj, int LevelMin, int LevelMax)
void Cec_ManSatAddToStore(Vec_Int_t *vCexStore, Vec_Int_t *vCex, int Out)
int Cec_ManSatCheckNode(Cec_ManSat_t *p, Gia_Obj_t *pObj)
void Cec_ManSatSolveCSat(Cec_ManPat_t *pPat, Gia_Man_t *pAig, Cec_ParSat_t *pPars)
void Cec_ManSavePattern(Cec_ManSat_t *p, Gia_Obj_t *pObj1, Gia_Obj_t *pObj2)
Abc_Cex_t * Cex_ManGenSimple(Cec_ManSat_t *p, int iOut)
Abc_Cex_t * Cex_ManGenCex(Cec_ManSat_t *p, int iOut)
Vec_Int_t * Cec_ManSatReadCex(Cec_ManSat_t *pSat)
int Cec_ManSatCheckNodeTwo(Cec_ManSat_t *p, Gia_Obj_t *pObj1, Gia_Obj_t *pObj2)
Vec_Str_t * Cec_ManSatSolveSeq(Vec_Ptr_t *vPatts, Gia_Man_t *pAig, Cec_ParSat_t *pPars, int nRegs, int *pnPats)
int Cec_SetActivityFactors(Cec_ManSat_t *p, Gia_Obj_t *pObj)
void Cec_ManSatSolveMiter_rec(Cec_ManSat_t *pSat, Gia_Man_t *p, Gia_Obj_t *pObj)
void Cec_ObjAddToFrontier(Cec_ManSat_t *p, Gia_Obj_t *pObj, Vec_Ptr_t *vFrontier)
void Cec_CollectSuper(Gia_Obj_t *pObj, int fUseMuxes, Vec_Ptr_t *vSuper)
void Cec_AddClausesMux(Cec_ManSat_t *p, Gia_Obj_t *pNode)
void Cec_AddClausesSuper(Cec_ManSat_t *p, Gia_Obj_t *pNode, Vec_Ptr_t *vSuper)
void Cec_ManSatSolve(Cec_ManPat_t *pPat, Gia_Man_t *pAig, Cec_ParSat_t *pPars, Vec_Int_t *vIdsOrig, Vec_Int_t *vMiterPairs, Vec_Int_t *vEquivPairs, int f0Proved)
int Cec_ObjSatVarValue(Cec_ManSat_t *p, Gia_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
void Cec_ManSatSolverRecycle(Cec_ManSat_t *p)
Vec_Int_t * Cec_ManSatSolveMiter(Gia_Man_t *pAig, Cec_ParSat_t *pPars, Vec_Str_t **pvStatus)
void Cec_ManSatSolveSeq_rec(Cec_ManSat_t *pSat, Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Ptr_t *vInfo, int iPat, int nRegs)
int Cec_ManSatSolveExractPattern(Vec_Int_t *vCexStore, int iStart, Vec_Int_t *vPat)
typedefABC_NAMESPACE_HEADER_START struct Cec_ParSat_t_ Cec_ParSat_t
INCLUDES ///.
Gia_Obj_t * Gia_ObjRecognizeMux(Gia_Obj_t *pNode, Gia_Obj_t **ppNodeT, Gia_Obj_t **ppNodeE)
struct Gia_Obj_t_ Gia_Obj_t
int Gia_ObjIsMuxType(Gia_Obj_t *pNode)
struct Gia_Man_t_ Gia_Man_t
Vec_Int_t * Cbs_ManSolveMiterNc(Gia_Man_t *pGia, int nConfs, Vec_Str_t **pvStatus, int f0Proved, int fVerbose)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachCo(p, pObj, i)
void Gia_ManSetPhase(Gia_Man_t *p)
int Gia_ManLevelNum(Gia_Man_t *p)
sat_solver * sat_solver_new(void)
int sat_solver_simplify(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
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_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 ///.