71 p->vCis[0] = Vec_IntAlloc( 512 );
72 p->vCis[1] = Vec_IntAlloc( 512 );
73 p->vObjs[0] = Vec_IntAlloc( 512 );
74 p->vObjs[1] = Vec_IntAlloc( 512 );
75 p->vCleared = Vec_IntAlloc( 512 );
76 p->dd = Cudd_Init( 0, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
78 Cudd_AutodynDisable(
p->dd );
79 p->vFuncs = Vec_PtrAlloc( 10000 );
80 p->vSupp = Vec_IntAlloc( 10000 );
85 Vec_IntFreeP( &
p->vCis[0] );
86 Vec_IntFreeP( &
p->vCis[1] );
87 Vec_IntFreeP( &
p->vObjs[0] );
88 Vec_IntFreeP( &
p->vObjs[1] );
89 Vec_IntFreeP( &
p->vCleared );
90 Vec_PtrFreeP( &
p->vFuncs );
91 Vec_IntFreeP( &
p->vSupp );
92 printf(
"Refs = %d. \n", Cudd_CheckZeroRef(
p->dd ) );
114 int nBddLimit = 100000;
115 int nPart0 = Vec_IntSize(
p->vCis[0]);
116 int n, i, iObj, nVars = 0;
117 DdNode * bFunc0, * bFunc1, * bFunc;
118 Vec_PtrFillExtra(
p->vFuncs, Gia_ManObjNum(
p->pGia), NULL );
120 for ( n = 0; n < 2; n++ )
122 Vec_PtrWriteEntry(
p->vFuncs, iObj, Cudd_bddIthVar(
p->dd, nVars++) );
124 for ( n = 0; n < 2; n++ )
127 Gia_Obj_t * pObj = Gia_ManObj(
p->pGia, iObj );
128 bFunc0 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(
p->vFuncs, Gia_ObjFaninId0(pObj, iObj)), Gia_ObjFaninC0(pObj) );
129 bFunc1 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(
p->vFuncs, Gia_ObjFaninId1(pObj, iObj)), Gia_ObjFaninC1(pObj) );
130 bFunc = Cudd_bddAndLimit(
p->dd, bFunc0, bFunc1, nBddLimit );
133 Vec_PtrWriteEntry(
p->vFuncs, iObj, bFunc );
136 bFunc0 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(
p->vFuncs, Abc_Lit2Var(
p->iLits[0])), Abc_LitIsCompl(
p->iLits[0]) );
137 bFunc1 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(
p->vFuncs, Abc_Lit2Var(
p->iLits[1])), Abc_LitIsCompl(
p->iLits[1]) );
138 bFunc = Cudd_bddAndLimit(
p->dd, bFunc0, bFunc1, nBddLimit );
143 Vec_IntFill(
p->vSupp, nVars, 0 );
147 Vec_IntClear(
p->vCleared );
148 for ( i = 0; i < nVars; i++ )
149 if ( Vec_IntEntry(
p->vSupp, i) == 0 )
150 Vec_IntPush(
p->vCleared, i < nPart0 ? Vec_IntEntry(
p->vCis[0], i) : Vec_IntEntry(
p->vCis[1], i-nPart0) );
153 Cudd_RecursiveDeref(
p->dd, bFunc );
154 for ( n = 0; n < 2; n++ )
156 Cudd_RecursiveDeref(
p->dd, (DdNode *)Vec_PtrEntry(
p->vFuncs, iObj) );
158 return Vec_IntSize(
p->vCleared);
174 int i, iObj, iGiaLitNew = -1;
178 Vec_IntFillExtra( vCopies, Gia_ManObjNum(
p->pGia), -1 );
182 Vec_IntWriteEntry( vCopies, iObj, Abc_Var2Lit(iObj, 0) );
184 assert( Vec_IntSize(
p->vCleared) > 0 );
186 Vec_IntWriteEntry( vCopies, iObj, 0 );
187 if ( Vec_IntSize(vTempNds) == 0 )
188 iGiaLitNew = Vec_IntEntry( vCopies, Abc_Lit2Var(
p->iLits[n]) );
193 Gia_Obj_t * pObj = Gia_ManObj(
p->pGia, iObj );
194 int iGiaLit0 = Vec_IntEntry( vCopies, Gia_ObjFaninId0p(
p->pGia, pObj) );
195 int iGiaLit1 = Vec_IntEntry( vCopies, Gia_ObjFaninId1p(
p->pGia, pObj) );
196 iGiaLit0 = Abc_LitNotCond( iGiaLit0, Gia_ObjFaninC0(pObj) );
197 iGiaLit1 = Abc_LitNotCond( iGiaLit1, Gia_ObjFaninC1(pObj) );
199 Vec_IntWriteEntry( vCopies, iObj, iGiaLitNew );
201 assert( Abc_Lit2Var(
p->iLits[n]) == iObj );
203 return Abc_LitNotCond( iGiaLitNew, Abc_LitIsCompl(
p->iLits[n]) );
221 if ( Gia_ObjIsTravIdPreviousId(
p, iObj) )
223 if ( Gia_ObjIsTravIdCurrentId(
p, iObj) )
225 Gia_ObjSetTravIdCurrentId(
p, iObj);
226 pObj = Gia_ManObj(
p, iObj );
227 if ( Gia_ObjIsCi(pObj) )
229 Vec_IntPush( vCis, iObj );
232 assert( Gia_ObjIsAnd(pObj) );
233 Val0 = Gia_ManGatherSupp_rec(
p, Gia_ObjFaninId0(pObj, iObj), vCis, vObjs );
234 Val1 = Gia_ManGatherSupp_rec(
p, Gia_ObjFaninId1(pObj, iObj), vCis, vObjs );
235 Vec_IntPush( vObjs, iObj );
242 for ( n = 0; n < 2; n++ )
244 Vec_IntClear(
p->vCis[n] );
245 Vec_IntClear(
p->vObjs[n] );
247 Overlap = Gia_ManGatherSupp_rec(
p->pGia, Abc_Lit2Var(
p->iLits[n]),
p->vCis[n],
p->vObjs[n] );
266 int iLitNew0, iLitNew1;
269 if ( iLit0 < 2 || iLit1 < 2 || !Gia_ManGatherSupp(
p) || !Gia_ManFindRemoved(
p) )
271 iLitNew0 = Gia_ManRebuildOne(
p, 0 );
272 iLitNew1 = Gia_ManRebuildOne(
p, 1 );
308 Gia_ManConst0(pGia)->Value = 0;
312 if ( Gia_ObjIsAnd(pObj) )
317 else if ( Gia_ObjIsCi(pObj) )
318 pObj->
Value = Gia_ManAppendCi( pNew );
319 else if ( Gia_ObjIsCo(pObj) )
320 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
323 if ( i % 10000 == 0 )
359static inline int Gia_Min2ObjSatId(
Gia_Man_t *
p,
Gia_Obj_t * pObj ) {
return Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj)); }
360static inline int Gia_Min2ObjSetSatId(
Gia_Man_t *
p,
Gia_Obj_t * pObj,
int Num ) {
assert(Gia_Min2ObjSatId(
p, pObj) == -1); Gia_ObjSetCopyArray(
p, Gia_ObjId(
p, pObj), Num);
return Num; }
361static inline void Gia_Min2ObjCleanSatId(
Gia_Man_t *
p,
Gia_Obj_t * pObj ) {
assert(Gia_Min2ObjSatId(
p, pObj) != -1); Gia_ObjSetCopyArray(
p, Gia_ObjId(
p, pObj), -1); }
380 p->vCis[0] = Vec_IntAlloc( 512 );
381 p->vCis[1] = Vec_IntAlloc( 512 );
382 p->vObjs[0] = Vec_IntAlloc( 512 );
383 p->vObjs[1] = Vec_IntAlloc( 512 );
386 p->vSims = Vec_WrdAlloc( 1000 );
387 p->vFrontier = Vec_PtrAlloc( 1000 );
388 p->vFanins = Vec_PtrAlloc( 100 );
389 p->vSatVars = Vec_IntAlloc( 100 );
398 Vec_IntFreeP( &
p->vCis[0] );
399 Vec_IntFreeP( &
p->vCis[1] );
400 Vec_IntFreeP( &
p->vObjs[0] );
401 Vec_IntFreeP( &
p->vObjs[1] );
404 Vec_WrdFreeP( &
p->vSims );
405 Vec_PtrFreeP( &
p->vFrontier );
406 Vec_PtrFreeP( &
p->vFanins );
407 Vec_IntFreeP( &
p->vSatVars );
426 int pLits[4], RetValue, VarF, VarI, VarT, VarE, fCompT, fCompE;
428 assert( !Gia_IsComplement( pNode ) );
433 VarF = Gia_Min2ObjSatId(
p, pNode);
434 VarI = Gia_Min2ObjSatId(
p, pNodeI);
435 VarT = Gia_Min2ObjSatId(
p, Gia_Regular(pNodeT));
436 VarE = Gia_Min2ObjSatId(
p, Gia_Regular(pNodeE));
438 fCompT = Gia_IsComplement(pNodeT);
439 fCompE = Gia_IsComplement(pNodeE);
449 pLits[0] = Abc_Var2Lit(VarI, 1);
450 pLits[1] = Abc_Var2Lit(VarT, 1^fCompT);
451 pLits[2] = Abc_Var2Lit(VarF, 0);
454 if ( pNodeI->
fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
455 if ( Gia_Regular(pNodeT)->fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
456 if ( pNode->
fPhase ) pLits[2] = Abc_LitNot( pLits[2] );
460 pLits[0] = Abc_Var2Lit(VarI, 1);
461 pLits[1] = Abc_Var2Lit(VarT, 0^fCompT);
462 pLits[2] = Abc_Var2Lit(VarF, 1);
465 if ( pNodeI->
fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
466 if ( Gia_Regular(pNodeT)->fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
467 if ( pNode->
fPhase ) pLits[2] = Abc_LitNot( pLits[2] );
471 pLits[0] = Abc_Var2Lit(VarI, 0);
472 pLits[1] = Abc_Var2Lit(VarE, 1^fCompE);
473 pLits[2] = Abc_Var2Lit(VarF, 0);
476 if ( pNodeI->
fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
477 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
478 if ( pNode->
fPhase ) pLits[2] = Abc_LitNot( pLits[2] );
482 pLits[0] = Abc_Var2Lit(VarI, 0);
483 pLits[1] = Abc_Var2Lit(VarE, 0^fCompE);
484 pLits[2] = Abc_Var2Lit(VarF, 1);
487 if ( pNodeI->
fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
488 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
489 if ( pNode->
fPhase ) pLits[2] = Abc_LitNot( pLits[2] );
507 pLits[0] = Abc_Var2Lit(VarT, 0^fCompT);
508 pLits[1] = Abc_Var2Lit(VarE, 0^fCompE);
509 pLits[2] = Abc_Var2Lit(VarF, 1);
512 if ( Gia_Regular(pNodeT)->fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
513 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
514 if ( pNode->
fPhase ) pLits[2] = Abc_LitNot( pLits[2] );
518 pLits[0] = Abc_Var2Lit(VarT, 1^fCompT);
519 pLits[1] = Abc_Var2Lit(VarE, 1^fCompE);
520 pLits[2] = Abc_Var2Lit(VarF, 0);
523 if ( Gia_Regular(pNodeT)->fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
524 if ( Gia_Regular(pNodeE)->fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
525 if ( pNode->
fPhase ) pLits[2] = Abc_LitNot( pLits[2] );
534 int * pLits, nLits, RetValue, i;
535 assert( !Gia_IsComplement(pNode) );
536 assert( Gia_ObjIsAnd( pNode ) );
538 nLits = Vec_PtrSize(vSuper) + 1;
544 pLits[0] = Abc_Var2Lit(Gia_Min2ObjSatId(
p, Gia_Regular(pFanin)), Gia_IsComplement(pFanin));
545 pLits[1] = Abc_Var2Lit(Gia_Min2ObjSatId(
p, pNode), 1);
548 if ( Gia_Regular(pFanin)->fPhase ) pLits[0] = Abc_LitNot( pLits[0] );
549 if ( pNode->
fPhase ) pLits[1] = Abc_LitNot( pLits[1] );
557 pLits[i] = Abc_Var2Lit(Gia_Min2ObjSatId(
p, Gia_Regular(pFanin)), !Gia_IsComplement(pFanin));
560 if ( Gia_Regular(pFanin)->fPhase ) pLits[i] = Abc_LitNot( pLits[i] );
563 pLits[nLits-1] = Abc_Var2Lit(Gia_Min2ObjSatId(
p, pNode), 0);
566 if ( pNode->
fPhase ) pLits[nLits-1] = Abc_LitNot( pLits[nLits-1] );
587 if ( Gia_IsComplement(pObj) || Gia_ObjIsCi(pObj) ||
588 (!fFirst && Gia_ObjValue(pObj) > 1) ||
589 (fUseMuxes && pObj->
fMark0) )
591 Vec_PtrPushUnique( vSuper, pObj );
600 assert( !Gia_IsComplement(pObj) );
601 assert( !Gia_ObjIsCi(pObj) );
602 Vec_PtrClear( vSuper );
607 assert( !Gia_IsComplement(pObj) );
608 assert( !Gia_ObjIsConst0(pObj) );
609 if ( Gia_Min2ObjSatId(
p, pObj) >= 0 )
611 assert( Gia_Min2ObjSatId(
p, pObj) == -1 );
612 Vec_IntPush( vSatVars, Gia_ObjId(
p, pObj) );
614 if ( Gia_ObjIsAnd(pObj) )
615 Vec_PtrPush( vFrontier, pObj );
621 int i, k, fUseMuxes = 1;
622 if ( Gia_Min2ObjSatId(
p->pGia, pObj) >= 0 )
623 return Gia_Min2ObjSatId(
p->pGia, pObj);
624 if ( Gia_ObjIsCi(pObj) )
626 Vec_IntPush(
p->vSatVars, iObj );
629 assert( Gia_ObjIsAnd(pObj) );
631 Vec_PtrClear(
p->vFrontier );
636 assert( Gia_Min2ObjSatId(
p->pGia,pNode) >= 0 );
637 if ( fUseMuxes && pNode->
fMark0 )
639 Vec_PtrClear(
p->vFanins );
640 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin0( Gia_ObjFanin0(pNode) ) );
641 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin0( Gia_ObjFanin1(pNode) ) );
642 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin1( Gia_ObjFanin0(pNode) ) );
643 Vec_PtrPushUnique(
p->vFanins, Gia_ObjFanin1( Gia_ObjFanin1(pNode) ) );
655 assert( Vec_PtrSize(
p->vFanins) > 1 );
657 return Gia_Min2ObjSatId(
p->pGia,pObj);
673 word Sim0, Sim1;
int n, i, iObj;
676 Vec_WrdFillExtra(
p->vSims, Gia_ManObjNum(
p->pGia), 0 );
677 for ( i =
p->nCisOld; i < Gia_ManCiNum(
p->pGia); i++ )
678 Vec_WrdWriteEntry(
p->vSims, Gia_ManCiIdToId(
p->pGia, i),
Gia_ManRandomW( 0 ) << 1 );
679 p->nCisOld = Gia_ManCiNum(
p->pGia);
681 for ( n = 0; n < 2; n++ )
684 Gia_Obj_t * pObj = Gia_ManObj(
p->pGia, iObj );
685 Sim0 = Vec_WrdEntry(
p->vSims, Gia_ObjFaninId0p(
p->pGia, pObj) );
686 Sim1 = Vec_WrdEntry(
p->vSims, Gia_ObjFaninId1p(
p->pGia, pObj) );
687 Sim0 = Gia_ObjFaninC0(pObj) ? ~Sim0 : Sim0;
688 Sim1 = Gia_ObjFaninC1(pObj) ? ~Sim1 : Sim1;
689 Vec_WrdWriteEntry(
p->vSims, iObj, Sim0 & Sim1 );
691 Sim0 = Vec_WrdEntry(
p->vSims, Abc_Lit2Var(
p->iLits[0]) );
692 Sim1 = Vec_WrdEntry(
p->vSims, Abc_Lit2Var(
p->iLits[1]) );
693 Sim0 = Abc_LitIsCompl(
p->iLits[0]) ? ~Sim0 : Sim0;
694 Sim1 = Abc_LitIsCompl(
p->iLits[1]) ? ~Sim1 : Sim1;
696 return (Sim0 & Sim1) == 0;
710static inline void Gia_Min2SimSetInputBit(
Gia_Man2Min_t *
p,
int iObj,
int Bit,
int iPattern )
712 word * pSim = Vec_WrdEntryP(
p->vSims, iObj );
713 assert( iPattern > 0 && iPattern < 64 );
714 if ( Abc_InfoHasBit( (
unsigned*)pSim, iPattern ) != Bit )
715 Abc_InfoXorBit( (
unsigned*)pSim, iPattern );
719 int iObj0 = Abc_Lit2Var(
p->iLits[0]);
720 int iObj1 = Abc_Lit2Var(
p->iLits[1]);
721 int n, i, status, iVar0, iVar1, iTemp;
722 assert( iObj0 > 0 && iObj1 > 0 );
725 Vec_IntFillExtra( &
p->pGia->vCopies, Gia_ManObjNum(
p->pGia), -1 );
726 Vec_IntClear(
p->vSatVars );
739 for ( n = 0; n < 2; n++ )
743 p->iPattern =
p->iPattern == 63 ? 1 :
p->iPattern + 1;
752 Gia_Min2ObjCleanSatId(
p->pGia, Gia_ManObj(
p->pGia, iTemp) );
771 if ( Gia_ObjIsTravIdPreviousId(
p, iObj) )
773 if ( Gia_ObjIsTravIdCurrentId(
p, iObj) )
775 Gia_ObjSetTravIdCurrentId(
p, iObj);
776 pObj = Gia_ManObj(
p, iObj );
777 if ( Gia_ObjIsCi(pObj) )
779 Vec_IntPush( vCis, iObj );
782 assert( Gia_ObjIsAnd(pObj) );
783 Val0 = Gia_Min2ManGatherSupp_rec(
p, Gia_ObjFaninId0(pObj, iObj), vCis, vObjs );
784 Val1 = Gia_Min2ManGatherSupp_rec(
p, Gia_ObjFaninId1(pObj, iObj), vCis, vObjs );
785 Vec_IntPush( vObjs, iObj );
793 for ( n = 0; n < 2; n++ )
795 Vec_IntClear(
p->vCis[n] );
796 Vec_IntClear(
p->vObjs[n] );
798 Overlap = Gia_Min2ManGatherSupp_rec(
p->pGia, Abc_Lit2Var(
p->iLits[n]),
p->vCis[n],
p->vObjs[n] );
821 if ( iLit0 < 2 || iLit1 < 2 || Abc_Lit2Var(iLit0) == Abc_Lit2Var(iLit1) ||
Gia_ManHashLookupInt(
p->pGia, iLit0, iLit1) ||
852 Gia_ManConst0(pGia)->Value = 0;
856 if ( Gia_ObjIsAnd(pObj) )
861 else if ( Gia_ObjIsCi(pObj) )
862 pObj->
Value = Gia_ManAppendCi( pNew );
863 else if ( Gia_ObjIsCo(pObj) )
864 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Gia_Min2ObjGetCnfVar(Gia_Man2Min_t *p, int iObj)
int Gia_ManSupportAnd(Gia_ManMin_t *p, int iLit0, int iLit1)
void Gia_Min2AddClausesSuper(Gia_Man_t *p, Gia_Obj_t *pNode, Vec_Ptr_t *vSuper, satoko_t *pSat)
Gia_Man2Min_t * Gia_Man2SuppStart(Gia_Man_t *pGia)
void Gia_Min2ObjAddToFrontier(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Ptr_t *vFrontier, satoko_t *pSat, Vec_Int_t *vSatVars)
void Gia_Min2CollectSuper_rec(Gia_Obj_t *pObj, Vec_Ptr_t *vSuper, int fFirst, int fUseMuxes)
Gia_Man_t * Gia_Man2SupportAndTest(Gia_Man_t *pGia)
int Gia_Min2ManSimulate(Gia_Man2Min_t *p)
int Gia_Min2ManGatherSupp(Gia_Man2Min_t *p)
void Gia_Man2SuppStop(Gia_Man2Min_t *p)
void Gia_Min2AddClausesMux(Gia_Man_t *p, Gia_Obj_t *pNode, satoko_t *pSat)
Gia_Man_t * Gia_ManSupportAndTest(Gia_Man_t *pGia)
ABC_NAMESPACE_IMPL_START Gia_ManMin_t * Gia_ManSuppStart(Gia_Man_t *pGia)
DECLARATIONS ///.
void Gia_Min2CollectSuper(Gia_Obj_t *pObj, int fUseMuxes, Vec_Ptr_t *vSuper)
int Gia_Min2ManSolve(Gia_Man2Min_t *p)
int Gia_Man2SupportAnd(Gia_Man2Min_t *p, int iLit0, int iLit1)
void Gia_ManSuppStop(Gia_ManMin_t *p)
void Gia_ManStop(Gia_Man_t *p)
Gia_Obj_t * Gia_ObjRecognizeMux(Gia_Obj_t *pNode, Gia_Obj_t **ppNodeT, Gia_Obj_t **ppNodeE)
word Gia_ManRandomW(int fReset)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObj1(p, pObj, i)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
struct Gia_Man2Min_t_ Gia_Man2Min_t
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManIncrementTravId(Gia_Man_t *p)
struct Gia_ManMin_t_ Gia_ManMin_t
int Gia_ManHashLookupInt(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManCleanMark01(Gia_Man_t *p)
unsigned __int64 word
DECLARATIONS ///.
int satoko_solve(satoko_t *)
char satoko_var_polarity(satoko_t *, unsigned)
int satoko_varnum(satoko_t *)
int satoko_add_variable(satoko_t *, char)
void satoko_rollback(satoko_t *)
int satoko_add_clause(satoko_t *, int *, int)
struct solver_t_ satoko_t
void satoko_assump_push(satoko_t *s, int)
void satoko_assump_pop(satoko_t *s)
void satoko_destroy(satoko_t *)
satoko_t * satoko_create(void)
satoko_opts_t * satoko_options(satoko_t *)
#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 ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.