1 /**CFile****************************************************************
2
3 FileName [extra.h]
4
5 SystemName [ABC: Logic synthesis and verification system.]
6
7 PackageName [extra]
8
9 Synopsis [Various reusable software utilities.]
10
11 Description [This library contains a number of operators and
12 traversal routines developed to extend the functionality of
13 CUDD v.2.3.x, by Fabio Somenzi (http://vlsi.colorado.edu/~fabio/)
14 To compile your code with the library, #include "extra.h"
15 in your source files and link your project to CUDD and this
16 library. Use the library at your own risk and with caution.
17 Note that debugging of some operators still continues.]
18
19 Author [Alan Mishchenko]
20
21 Affiliation [UC Berkeley]
22
23 Date [Ver. 1.0. Started - June 20, 2005.]
24
25 Revision [$Id: extra.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
26
27 ***********************************************************************/
28
29 #ifndef ABC__misc__extra__extra_h
30 #define ABC__misc__extra__extra_h
31
32
33 #ifdef _WIN32
34 #define inline __inline // compatible with MS VS 6.0
35 #endif
36
37 /*---------------------------------------------------------------------------*/
38 /* Nested includes */
39 /*---------------------------------------------------------------------------*/
40
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <string.h>
44 #include <assert.h>
45
46 #include "misc/st/st.h"
47
48 ABC_NAMESPACE_HEADER_START
49
50
51 /*---------------------------------------------------------------------------*/
52 /* Constant declarations */
53 /*---------------------------------------------------------------------------*/
54
55 /*---------------------------------------------------------------------------*/
56 /* Stucture declarations */
57 /*---------------------------------------------------------------------------*/
58
59 /*---------------------------------------------------------------------------*/
60 /* Type declarations */
61 /*---------------------------------------------------------------------------*/
62
63 /*---------------------------------------------------------------------------*/
64 /* Variable declarations */
65 /*---------------------------------------------------------------------------*/
66
67 /*---------------------------------------------------------------------------*/
68 /* Macro declarations */
69 /*---------------------------------------------------------------------------*/
70
71 typedef unsigned char uint8;
72 typedef unsigned short uint16;
73 typedef unsigned int uint32;
74
75 /*===========================================================================*/
76 /* Various Utilities */
77 /*===========================================================================*/
78
79 /*=== extraUtilBitMatrix.c ================================================================*/
80
81 typedef struct Extra_BitMat_t_ Extra_BitMat_t;
82 extern Extra_BitMat_t * Extra_BitMatrixStart( int nSize );
83 extern void Extra_BitMatrixClean( Extra_BitMat_t * p );
84 extern void Extra_BitMatrixStop( Extra_BitMat_t * p );
85 extern void Extra_BitMatrixPrint( Extra_BitMat_t * p );
86 extern int Extra_BitMatrixReadSize( Extra_BitMat_t * p );
87 extern void Extra_BitMatrixInsert1( Extra_BitMat_t * p, int i, int k );
88 extern int Extra_BitMatrixLookup1( Extra_BitMat_t * p, int i, int k );
89 extern void Extra_BitMatrixDelete1( Extra_BitMat_t * p, int i, int k );
90 extern void Extra_BitMatrixInsert2( Extra_BitMat_t * p, int i, int k );
91 extern int Extra_BitMatrixLookup2( Extra_BitMat_t * p, int i, int k );
92 extern void Extra_BitMatrixDelete2( Extra_BitMat_t * p, int i, int k );
93 extern void Extra_BitMatrixOr( Extra_BitMat_t * p, int i, unsigned * pInfo );
94 extern void Extra_BitMatrixOrTwo( Extra_BitMat_t * p, int i, int j );
95 extern int Extra_BitMatrixCountOnesUpper( Extra_BitMat_t * p );
96 extern int Extra_BitMatrixIsDisjoint( Extra_BitMat_t * p1, Extra_BitMat_t * p2 );
97 extern int Extra_BitMatrixIsClique( Extra_BitMat_t * p );
98
99 /*=== extraUtilFile.c ========================================================*/
100
101 extern char * Extra_FileGetSimilarName( char * pFileNameWrong, char * pS1, char * pS2, char * pS3, char * pS4, char * pS5 );
102 extern char * Extra_FileNameExtension( char * FileName );
103 extern char * Extra_FileNameAppend( char * pBase, char * pSuffix );
104 extern char * Extra_FileNameGeneric( char * FileName );
105 extern char * Extra_FileNameGenericAppend( char * pBase, char * pSuffix );
106 extern void Extra_FileNameCorrectPath( char * FileName );
107 extern char * Extra_FileNameWithoutPath( char * FileName );
108 extern char * Extra_FilePathWithoutName( char * FileName );
109 extern char * Extra_FileDesignName( char * pFileName );
110 extern int Extra_FileCheck( char * pFileName );
111 extern int Extra_FileSize( char * pFileName );
112 extern char * Extra_FileRead( FILE * pFile );
113 extern char * Extra_FileRead2( FILE * pFile, FILE * pFile2 );
114 extern char * Extra_FileReadContents( char * pFileName );
115 extern char * Extra_FileReadContents2( char * pFileName, char * pFileName2 );
116 extern int Extra_FileIsType( char * pFileName, char * pS1, char * pS2, char * pS3 );
117 extern char * Extra_TimeStamp();
118 extern char * Extra_StringAppend( char * pStrGiven, char * pStrAdd );
119 extern void Extra_StringClean( char * pStrGiven, char * pCharKeep );
120 extern unsigned Extra_ReadBinary( char * Buffer );
121 extern void Extra_PrintBinary( FILE * pFile, unsigned Sign[], int nBits );
122 extern void Extra_PrintBinary2( FILE * pFile, unsigned Sign[], int nBits );
123 extern int Extra_ReadHex( unsigned Sign[], char * pString, int nDigits );
124 extern int Extra_ReadHexadecimal( unsigned Sign[], char * pString, int nVars );
125 extern void Extra_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars );
126 extern void Extra_PrintHexadecimalString( char * pString, unsigned Sign[], int nVars );
127 extern void Extra_PrintHex( FILE * pFile, unsigned * pTruth, int nVars );
128 extern void Extra_PrintHex2( FILE * pFile, unsigned * pTruth, int nVars );
129 extern void Extra_PrintHexReverse( FILE * pFile, unsigned * pTruth, int nVars );
130 extern void Extra_PrintSymbols( FILE * pFile, char Char, int nTimes, int fPrintNewLine );
131
132 /*=== extraUtilReader.c ========================================================*/
133
134 typedef struct Extra_FileReader_t_ Extra_FileReader_t;
135 extern Extra_FileReader_t * Extra_FileReaderAlloc( char * pFileName,
136 char * pCharsComment, char * pCharsStop, char * pCharsClean );
137 extern void Extra_FileReaderFree( Extra_FileReader_t * p );
138 extern char * Extra_FileReaderGetFileName( Extra_FileReader_t * p );
139 extern int Extra_FileReaderGetFileSize( Extra_FileReader_t * p );
140 extern int Extra_FileReaderGetCurPosition( Extra_FileReader_t * p );
141 extern void * Extra_FileReaderGetTokens( Extra_FileReader_t * p );
142 extern int Extra_FileReaderGetLineNumber( Extra_FileReader_t * p, int iToken );
143
144 /*=== extraUtilMemory.c ========================================================*/
145
146 typedef struct Extra_MmFixed_t_ Extra_MmFixed_t;
147 typedef struct Extra_MmFlex_t_ Extra_MmFlex_t;
148 typedef struct Extra_MmStep_t_ Extra_MmStep_t;
149
150 // fixed-size-block memory manager
151 extern Extra_MmFixed_t * Extra_MmFixedStart( int nEntrySize );
152 extern void Extra_MmFixedStop( Extra_MmFixed_t * p );
153 extern char * Extra_MmFixedEntryFetch( Extra_MmFixed_t * p );
154 extern void Extra_MmFixedEntryRecycle( Extra_MmFixed_t * p, char * pEntry );
155 extern void Extra_MmFixedRestart( Extra_MmFixed_t * p );
156 extern int Extra_MmFixedReadMemUsage( Extra_MmFixed_t * p );
157 extern int Extra_MmFixedReadMaxEntriesUsed( Extra_MmFixed_t * p );
158 // flexible-size-block memory manager
159 extern Extra_MmFlex_t * Extra_MmFlexStart();
160 extern void Extra_MmFlexStop( Extra_MmFlex_t * p );
161 extern void Extra_MmFlexPrint( Extra_MmFlex_t * p );
162 extern char * Extra_MmFlexEntryFetch( Extra_MmFlex_t * p, int nBytes );
163 extern int Extra_MmFlexReadMemUsage( Extra_MmFlex_t * p );
164 // hierarchical memory manager
165 extern Extra_MmStep_t * Extra_MmStepStart( int nSteps );
166 extern void Extra_MmStepStop( Extra_MmStep_t * p );
167 extern char * Extra_MmStepEntryFetch( Extra_MmStep_t * p, int nBytes );
168 extern void Extra_MmStepEntryRecycle( Extra_MmStep_t * p, char * pEntry, int nBytes );
169 extern int Extra_MmStepReadMemUsage( Extra_MmStep_t * p );
170
171 /*=== extraUtilMisc.c ========================================================*/
172
173 /* finds the smallest integer larger or equal than the logarithm */
174 extern int Extra_Base2LogDouble( double Num );
175 /* returns the power of two as a double */
176 extern double Extra_Power2( int Num );
177 extern int Extra_Power3( int Num );
178 /* the number of combinations of k elements out of n */
179 extern int Extra_NumCombinations( int k, int n );
180 extern int * Extra_DeriveRadixCode( int Number, int Radix, int nDigits );
181 /* counts the number of 1s in the bitstring */
182 extern int Extra_CountOnes( unsigned char * pBytes, int nBytes );
183 /* the factorial of number */
184 extern int Extra_Factorial( int n );
185 /* the permutation of the given number of elements */
186 extern char ** Extra_Permutations( int n );
187 /* permutation and complementation of a truth table */
188 unsigned Extra_TruthPermute( unsigned Truth, char * pPerms, int nVars, int fReverse );
189 unsigned Extra_TruthPolarize( unsigned uTruth, int Polarity, int nVars );
190 /* canonical forms of a truth table */
191 extern unsigned Extra_TruthCanonN( unsigned uTruth, int nVars );
192 extern unsigned Extra_TruthCanonNN( unsigned uTruth, int nVars );
193 extern unsigned Extra_TruthCanonP( unsigned uTruth, int nVars );
194 extern unsigned Extra_TruthCanonNP( unsigned uTruth, int nVars );
195 extern unsigned Extra_TruthCanonNPN( unsigned uTruth, int nVars );
196 /* canonical forms of 4-variable functions */
197 extern void Extra_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** puPerms, unsigned char ** puMap );
198 extern void Extra_Truth4VarN( unsigned short ** puCanons, char *** puPhases, char ** ppCounters, int nPhasesMax );
199 /* permutation mapping */
200 extern unsigned short Extra_TruthPerm4One( unsigned uTruth, int Phase );
201 extern unsigned Extra_TruthPerm5One( unsigned uTruth, int Phase );
202 extern void Extra_TruthPerm6One( unsigned * uTruth, int Phase, unsigned * uTruthRes );
203 extern void Extra_TruthExpand( int nVars, int nWords, unsigned * puTruth, unsigned uPhase, unsigned * puTruthR );
204 /* precomputing tables for permutation mapping */
205 extern void ** Extra_ArrayAlloc( int nCols, int nRows, int Size );
206 extern unsigned short ** Extra_TruthPerm43();
207 extern unsigned ** Extra_TruthPerm53();
208 extern unsigned ** Extra_TruthPerm54();
209 /* bubble sort for small number of entries */
210 extern void Extra_BubbleSort( int Order[], int Costs[], int nSize, int fIncreasing );
211 /* complementation/permutation generation */
212 extern int * Extra_GreyCodeSchedule( int n );
213 extern int * Extra_PermSchedule( int n );
214 extern word Extra_Truth6MinimumExact( word t, int * pComp, int * pPerm );
215 extern word Extra_Truth6MinimumHeuristic( word t );
216
217 /*=== extraUtilCanon.c ========================================================*/
218
219 /* fast computation of N-canoninical form up to 6 inputs */
220 extern int Extra_TruthCanonFastN( int nVarsMax, int nVarsReal, unsigned * pt, unsigned ** pptRes, char ** ppfRes );
221
222 /*=== extraUtilDsd.c ========================================================*/
223
224 typedef struct Sdm_Man_t_ Sdm_Man_t;
225 extern int Sdm_ManCanRead();
226 extern Sdm_Man_t * Sdm_ManRead();
227 extern void Sdm_ManQuit();
228 extern int Sdm_ManComputeFunc( Sdm_Man_t * p, int iDsdLit0, int iDsdLit1, int * pCut, int uMask, int fXor );
229 extern void Sdm_ManPrintDsdStats( Sdm_Man_t * p, int fVerbose );
230 extern int Sdm_ManReadDsdVarNum( Sdm_Man_t * p, int iDsd );
231 extern int Sdm_ManReadDsdAndNum( Sdm_Man_t * p, int iDsd );
232 extern int Sdm_ManReadDsdClauseNum( Sdm_Man_t * p, int iDsd );
233 extern word Sdm_ManReadDsdTruth( Sdm_Man_t * p, int iDsd );
234 extern char * Sdm_ManReadDsdStr( Sdm_Man_t * p, int iDsd );
235 extern void Sdm_ManReadCnfCosts( Sdm_Man_t * p, int * pCosts, int nCosts );
236
237 /*=== extraUtilProgress.c ================================================================*/
238
239 typedef struct ProgressBarStruct ProgressBar;
240
241 extern ProgressBar * Extra_ProgressBarStart( FILE * pFile, int nItemsTotal );
242 extern void Extra_ProgressBarStop( ProgressBar * p );
243 extern void Extra_ProgressBarUpdate_int( ProgressBar * p, int nItemsCur, char * pString );
244
Extra_ProgressBarUpdate(ProgressBar * p,int nItemsCur,char * pString)245 static inline void Extra_ProgressBarUpdate( ProgressBar * p, int nItemsCur, char * pString )
246 { if ( p && nItemsCur < *((int*)p) ) return; Extra_ProgressBarUpdate_int(p, nItemsCur, pString); }
247
248 /*=== extraUtilTruth.c ================================================================*/
249
Extra_BitWordNum(int nBits)250 static inline int Extra_BitWordNum( int nBits ) { return nBits/(8*sizeof(unsigned)) + ((nBits%(8*sizeof(unsigned))) > 0); }
Extra_TruthWordNum(int nVars)251 static inline int Extra_TruthWordNum( int nVars ) { return nVars <= 5 ? 1 : (1 << (nVars - 5)); }
252
Extra_TruthSetBit(unsigned * p,int Bit)253 static inline void Extra_TruthSetBit( unsigned * p, int Bit ) { p[Bit>>5] |= (unsigned)(1<<(Bit & 31)); }
Extra_TruthXorBit(unsigned * p,int Bit)254 static inline void Extra_TruthXorBit( unsigned * p, int Bit ) { p[Bit>>5] ^= (unsigned)(1<<(Bit & 31)); }
Extra_TruthHasBit(unsigned * p,int Bit)255 static inline int Extra_TruthHasBit( unsigned * p, int Bit ) { return (p[Bit>>5] & (unsigned)(1<<(Bit & 31))) > 0; }
256
Extra_WordCountOnes(unsigned uWord)257 static inline int Extra_WordCountOnes( unsigned uWord )
258 {
259 uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
260 uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
261 uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
262 uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
263 return (uWord & 0x0000FFFF) + (uWord>>16);
264 }
Extra_TruthCountOnes(unsigned * pIn,int nVars)265 static inline int Extra_TruthCountOnes( unsigned * pIn, int nVars )
266 {
267 int w, Counter = 0;
268 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
269 Counter += Extra_WordCountOnes(pIn[w]);
270 return Counter;
271 }
Extra_TruthIsEqual(unsigned * pIn0,unsigned * pIn1,int nVars)272 static inline int Extra_TruthIsEqual( unsigned * pIn0, unsigned * pIn1, int nVars )
273 {
274 int w;
275 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
276 if ( pIn0[w] != pIn1[w] )
277 return 0;
278 return 1;
279 }
Extra_TruthIsConst0(unsigned * pIn,int nVars)280 static inline int Extra_TruthIsConst0( unsigned * pIn, int nVars )
281 {
282 int w;
283 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
284 if ( pIn[w] )
285 return 0;
286 return 1;
287 }
Extra_TruthIsConst1(unsigned * pIn,int nVars)288 static inline int Extra_TruthIsConst1( unsigned * pIn, int nVars )
289 {
290 int w;
291 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
292 if ( pIn[w] != ~(unsigned)0 )
293 return 0;
294 return 1;
295 }
Extra_TruthIsImply(unsigned * pIn1,unsigned * pIn2,int nVars)296 static inline int Extra_TruthIsImply( unsigned * pIn1, unsigned * pIn2, int nVars )
297 {
298 int w;
299 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
300 if ( pIn1[w] & ~pIn2[w] )
301 return 0;
302 return 1;
303 }
Extra_TruthCopy(unsigned * pOut,unsigned * pIn,int nVars)304 static inline void Extra_TruthCopy( unsigned * pOut, unsigned * pIn, int nVars )
305 {
306 int w;
307 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
308 pOut[w] = pIn[w];
309 }
Extra_TruthClear(unsigned * pOut,int nVars)310 static inline void Extra_TruthClear( unsigned * pOut, int nVars )
311 {
312 int w;
313 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
314 pOut[w] = 0;
315 }
Extra_TruthFill(unsigned * pOut,int nVars)316 static inline void Extra_TruthFill( unsigned * pOut, int nVars )
317 {
318 int w;
319 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
320 pOut[w] = ~(unsigned)0;
321 }
Extra_TruthNot(unsigned * pOut,unsigned * pIn,int nVars)322 static inline void Extra_TruthNot( unsigned * pOut, unsigned * pIn, int nVars )
323 {
324 int w;
325 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
326 pOut[w] = ~pIn[w];
327 }
Extra_TruthAnd(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)328 static inline void Extra_TruthAnd( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
329 {
330 int w;
331 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
332 pOut[w] = pIn0[w] & pIn1[w];
333 }
Extra_TruthOr(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)334 static inline void Extra_TruthOr( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
335 {
336 int w;
337 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
338 pOut[w] = pIn0[w] | pIn1[w];
339 }
Extra_TruthSharp(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)340 static inline void Extra_TruthSharp( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
341 {
342 int w;
343 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
344 pOut[w] = pIn0[w] & ~pIn1[w];
345 }
Extra_TruthNand(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars)346 static inline void Extra_TruthNand( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
347 {
348 int w;
349 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
350 pOut[w] = ~(pIn0[w] & pIn1[w]);
351 }
Extra_TruthAndPhase(unsigned * pOut,unsigned * pIn0,unsigned * pIn1,int nVars,int fCompl0,int fCompl1)352 static inline void Extra_TruthAndPhase( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars, int fCompl0, int fCompl1 )
353 {
354 int w;
355 if ( fCompl0 && fCompl1 )
356 {
357 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
358 pOut[w] = ~(pIn0[w] | pIn1[w]);
359 }
360 else if ( fCompl0 && !fCompl1 )
361 {
362 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
363 pOut[w] = ~pIn0[w] & pIn1[w];
364 }
365 else if ( !fCompl0 && fCompl1 )
366 {
367 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
368 pOut[w] = pIn0[w] & ~pIn1[w];
369 }
370 else // if ( !fCompl0 && !fCompl1 )
371 {
372 for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
373 pOut[w] = pIn0[w] & pIn1[w];
374 }
375 }
376
377 extern unsigned ** Extra_TruthElementary( int nVars );
378 extern void Extra_TruthSwapAdjacentVars( unsigned * pOut, unsigned * pIn, int nVars, int Start );
379 extern void Extra_TruthStretch( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase );
380 extern void Extra_TruthShrink( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase );
381 extern int Extra_TruthVarInSupport( unsigned * pTruth, int nVars, int iVar );
382 extern int Extra_TruthSupportSize( unsigned * pTruth, int nVars );
383 extern int Extra_TruthSupport( unsigned * pTruth, int nVars );
384 extern void Extra_TruthCofactor0( unsigned * pTruth, int nVars, int iVar );
385 extern void Extra_TruthCofactor1( unsigned * pTruth, int nVars, int iVar );
386 extern void Extra_TruthExist( unsigned * pTruth, int nVars, int iVar );
387 extern void Extra_TruthForall( unsigned * pTruth, int nVars, int iVar );
388 extern void Extra_TruthMux( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar );
389 extern void Extra_TruthChangePhase( unsigned * pTruth, int nVars, int iVar );
390 extern int Extra_TruthMinCofSuppOverlap( unsigned * pTruth, int nVars, int * pVarMin );
391 extern void Extra_TruthCountOnesInCofs( unsigned * pTruth, int nVars, short * pStore );
392 extern unsigned Extra_TruthHash( unsigned * pIn, int nWords );
393 extern unsigned Extra_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars, char * pCanonPerm, short * pStore );
394
395 /*=== extraUtilUtil.c ================================================================*/
396
397 extern abctime Extra_CpuTime();
398 extern double Extra_CpuTimeDouble();
399 extern int Extra_GetSoftDataLimit();
400 extern ABC_DLL void Extra_UtilGetoptReset();
401 extern int Extra_UtilGetopt( int argc, char *argv[], const char *optstring );
402 extern char * Extra_UtilPrintTime( long t );
403 extern char * Extra_UtilStrsav( const char *s );
404 extern char * Extra_UtilTildeExpand( char *fname );
405 extern char * Extra_UtilFileSearch( char *file, char *path, char *mode );
406 extern void (*Extra_UtilMMoutOfMemory)( long size );
407
408 extern const char * globalUtilOptarg;
409 extern int globalUtilOptind;
410
411 /**AutomaticEnd***************************************************************/
412
413
414
415 ABC_NAMESPACE_HEADER_END
416
417
418
419 #endif /* __EXTRA_H__ */
420