30#ifdef ABC_USE_PTHREADS
33#include "../lib/pthread.h"
47#define CMD_AUTO_LINE_MAX 1000
48#define CMD_AUTO_ARG_MAX 100
70 printf(
"-V %.3f ", (
float)pOpts->
var_decay );
110#ifndef ABC_USE_PTHREADS
120#define CMD_THR_MAX 100
121typedef struct Cmd_AutoData_t_
131void * Cmd_RunAutoTunerEvalWorkerThread(
void * pArg )
133 Cmd_AutoData_t * pThData = (Cmd_AutoData_t *)pArg;
134 volatile int * pPlace = &pThData->fWorking;
137 while ( *pPlace == 0 );
138 assert( pThData->fWorking );
139 if ( pThData->pGia == NULL )
141 pthread_exit( NULL );
146 pThData->fWorking = 0;
153 Cmd_AutoData_t ThData[CMD_THR_MAX];
154 pthread_t WorkerThread[CMD_THR_MAX];
155 int i, status, fWorkToDo = 1, TotalCost = 0;
161 assert( nProcs >= 1 && nProcs <= CMD_THR_MAX );
163 for ( i = 0; i < nProcs; i++ )
165 ThData[i].pGia = NULL;
166 ThData[i].pOpts = pOpts;
167 ThData[i].iThread = i;
168 ThData[i].nTimeOut = -1;
169 ThData[i].fWorking = 0;
170 ThData[i].Result = -1;
171 status = pthread_create( WorkerThread + i, NULL,Cmd_RunAutoTunerEvalWorkerThread, (
void *)(ThData + i) );
assert( status == 0 );
174 vStack = Vec_PtrDup(vAigs);
177 fWorkToDo = (int)(Vec_PtrSize(vStack) > 0);
178 for ( i = 0; i < nProcs; i++ )
181 if ( ThData[i].fWorking )
187 if ( ThData[i].pGia != NULL )
189 assert( ThData[i].Result >= 0 );
190 TotalCost += ThData[i].Result;
191 ThData[i].pGia = NULL;
193 if ( Vec_PtrSize(vStack) == 0 )
196 assert( ThData[i].pGia == NULL );
197 ThData[i].pGia = (
Gia_Man_t *)Vec_PtrPop( vStack );
198 ThData[i].fWorking = 1;
201 Vec_PtrFree( vStack );
203 for ( i = 0; i < nProcs; i++ )
205 assert( !ThData[i].fWorking );
207 ThData[i].pGia = NULL;
208 ThData[i].fWorking = 1;
231 for ( i = 0; i < argc; i++ )
233 strcat( pBuffer, argv[i] );
236 return Abc_UtilStrsav(pBuffer);
244#ifdef SATOKO_ACT_VAR_FIXED
245 while ( ( c =
Extra_UtilGetopt( argc, argv,
"CPDEFGHIJKLMNOQRSTUhv" ) ) != EOF )
247 while ( ( c =
Extra_UtilGetopt( argc, argv,
"CPDEFGHIJKLMNOQRShv" ) ) != EOF )
255 Abc_Print( -1,
"Command line switch \"-C\" should be followed by an integer.\n" );
266 Abc_Print( -1,
"Command line switch \"-P\" should be followed by an integer.\n" );
277 Abc_Print( -1,
"Command line switch \"-D\" should be followed by an float.\n" );
282 if ( opts.
f_rst < 0 )
288 Abc_Print( -1,
"Command line switch \"-E\" should be followed by an float.\n" );
293 if ( opts.
b_rst < 0 )
299 Abc_Print( -1,
"Command line switch \"-F\" should be followed by an integer.\n" );
308 Abc_Print( -1,
"Command line switch \"-G\" should be followed by an integer.\n" );
317 Abc_Print( -1,
"Command line switch \"-H\" should be followed by an integer.\n" );
326 Abc_Print( -1,
"Command line switch \"-I\" should be followed by an integer.\n" );
335 Abc_Print( -1,
"Command line switch \"-J\" should be followed by an integer.\n" );
344 Abc_Print( -1,
"Command line switch \"-K\" should be followed by an integer.\n" );
353 Abc_Print( -1,
"Command line switch \"-L\" should be followed by an integer.\n" );
362 Abc_Print( -1,
"Command line switch \"-M\" should be followed by an integer.\n" );
373 Abc_Print( -1,
"Command line switch \"-M\" should be followed by an integer.\n" );
384 Abc_Print( -1,
"Command line switch \"-O\" should be followed by an integer.\n" );
393 Abc_Print( -1,
"Command line switch \"-O\" should be followed by an integer.\n" );
402 Abc_Print( -1,
"Command line switch \"-R\" should be followed by an float.\n" );
413 Abc_Print( -1,
"Command line switch \"-S\" should be followed by an float.\n" );
421#ifdef SATOKO_ACT_VAR_FIXED
425 Abc_Print( -1,
"Command line switch \"-T\" should be followed by an float.\n" );
434 Abc_Print( -1,
"Command line switch \"-U\" should be followed by an float.\n" );
461 if ( Vec_WecSize(vPars) == iPar )
465 for ( i = 0; i < Argc; i++ )
469 printf(
"Cannot parse command line options...\n" );
472 Vec_PtrPush( vOpts, pOpts );
474 printf(
"Adding settings %s\n", (
char *)Vec_PtrEntryLast(vOpts) );
478 vLine = Vec_WecEntry( vPars, iPar );
480 if ( Vec_IntSize(vLine) == 2 )
482 Symb = Vec_IntEntry( vLine, 0 );
483 Num = Vec_IntEntry( vLine, 1 );
484 assert( Abc_Int2Float(Num) == -1.0 );
488 sprintf( Argv[Argc],
"-%c", Symb );
495 float NumF = Abc_Int2Float(Num);
498 sprintf( Argv[Argc],
"-%c", Symb );
499 if ( NumF == (
float)(
int)NumF )
500 sprintf( Argv[Argc+1],
"%d", (
int)NumF );
502 sprintf( Argv[Argc+1],
"%.3f", NumF );
509 int Symb, Num, i, Argc = 0;
511 Vec_Int_t * vLine = Vec_WecEntry( vPars, 0 );
512 printf(
"Creating all possible settings to be used by the autotuner:\n" );
513 sprintf( Argv[Argc++],
"autotuner" );
516 float NumF = Abc_Int2Float(Num);
517 sprintf( Argv[Argc++],
"-%c", Symb );
520 if ( NumF == (
float)(
int)NumF )
521 sprintf( Argv[Argc++],
"%d", (
int)NumF );
523 sprintf( Argv[Argc++],
"%.3f", NumF );
526 printf(
"Finished creating %d settings.\n\n", Vec_PtrSize(vOpts)/2 );
542static inline int Cmf_IsSpace(
char p ) {
return p ==
' ' ||
p ==
'\t' ||
p ==
'\n' ||
p ==
'\r'; }
543static inline int Cmf_IsLowerCaseChar(
char p ) {
return p >=
'a' &&
p <=
'z'; }
544static inline int Cmf_IsUpperCaseChar(
char p ) {
return p >=
'A' &&
p <=
'Z'; }
545static inline int Cmf_IsDigit(
char p ) {
return (
p >=
'0' &&
p <=
'9') ||
p ==
'.'; }
552 FILE * pFile = fopen( pConfig,
"rb" );
554 { printf(
"File containing list of files \"%s\" cannot be opened.\n", pConfig );
return NULL; }
555 vPars = Vec_WecAlloc( 100 );
559 if ( Cmf_IsSpace(pBuffer[0]) || pBuffer[0] ==
'#')
562 while ( Cmf_IsSpace(pBuffer[
strlen(pBuffer)-1]) )
563 pBuffer[
strlen(pBuffer)-1] = 0;
565 vLine = Vec_WecPushLevel( vPars );
566 for ( pThis = pBuffer; *pThis; )
568 if ( Cmf_IsLowerCaseChar(*pThis) )
570 Vec_IntPushTwo( vLine, (
int)*pThis, Abc_Float2Int((
float)-1.0) );
572 while ( Cmf_IsSpace(*pThis) )
576 if ( Cmf_IsUpperCaseChar(*pThis) )
578 char Param = *pThis++;
579 if ( !Cmf_IsDigit(*pThis) )
580 { printf(
"Upper-case character (%c) should be followed by a number without space in line \"%s\".\n", Param, pBuffer );
return NULL; }
581 Vec_IntPushTwo( vLine, (
int)Param, Abc_Float2Int(
atof(pThis)) );
582 while ( Cmf_IsDigit(*pThis) )
584 while ( Cmf_IsSpace(*pThis) )
588 printf(
"Expecting a leading lower-case or upper-case digit in line \"%s\".\n", pBuffer );
600 FILE * pFile = fopen( pFileList,
"rb" );
602 { printf(
"File containing list of files \"%s\" cannot be opened.\n", pFileList );
return NULL; }
603 vAigs = Vec_PtrAlloc( 100 );
607 if ( Cmf_IsSpace(pBuffer[0]) || pBuffer[0] ==
'#')
610 while ( Cmf_IsSpace(pBuffer[
strlen(pBuffer)-1]) )
611 pBuffer[
strlen(pBuffer)-1] = 0;
616 printf(
"Cannot read AIG from file \"%s\".\n", pBuffer );
619 Vec_PtrPush( vAigs, pGia );
642 int i;
char * pString, * pStringBest = NULL;
644 int Result, ResultBest = 0x7FFFFFFF;
647 if ( vAigs && vOpts )
652 printf(
"Evaluating settings: %20s... \n", pString );
654 printf(
"Cost = %6d. ", Result );
655 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
656 if ( ResultBest > Result )
659 pStringBest = pString;
663 printf(
"The best settings are: %20s \n", pStringBest );
664 printf(
"Best cost = %6d. ", ResultBest );
665 Abc_PrintTime( 1,
"Total time", Abc_Clock() - clk );
668 if ( vPars ) Vec_WecFree( vPars );
669 if ( vOpts ) Vec_PtrFreeFree( vOpts );
674 Vec_PtrFree( vAigs );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Cmd_RunAutoTunerPrintOptions(satoko_opts_t *pOpts)
FUNCTION DEFINITIONS ///.
int Cmd_RunAutoTunerEvalSimple(Vec_Ptr_t *vAigs, satoko_opts_t *pOpts)
Vec_Ptr_t * Cmd_ReadFiles(char *pFileList)
satoko_opts_t * Cmd_DeriveOptionFromSettings(int argc, char **argv)
char * Cmd_DeriveConvertIntoString(int argc, char **argv)
#define CMD_AUTO_LINE_MAX
DECLARATIONS ///.
int Cmd_RunAutoTunerEval(Vec_Ptr_t *vAigs, satoko_opts_t *pOpts, int nCores)
int Gia_ManSatokoCallOne(Gia_Man_t *p, satoko_opts_t *opts, int iOutput)
void Cmd_RunAutoTuner(char *pConfig, char *pFileList, int nCores)
Vec_Wec_t * Cmd_ReadParamChoices(char *pConfig)
void Cmf_CreateOptions_rec(Vec_Wec_t *vPars, int iPar, char Argv[CMD_AUTO_ARG_MAX][20], int Argc, Vec_Ptr_t *vOpts)
Vec_Ptr_t * Cmf_CreateOptions(Vec_Wec_t *vPars)
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_AigerRead(char *pFileName, int fGiaSimple, int fSkipStrash, int fCheck)
struct Gia_Man_t_ Gia_Man_t
struct satoko_opts satoko_opts_t
void satoko_default_opts(satoko_opts_t *)
unsigned clause_min_lbd_bin_resol
unsigned clause_max_sz_bin_resol
unsigned lbd_freeze_clause
unsigned inc_special_reduce
unsigned n_conf_fst_reduce
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntryDouble(Type1, Type2, vVec, Entry1, Entry2, i)
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.