49 int nInputs = Vec_IntSize(vAlpha);
50 int nFrames =
strlen(pSim);
52 assert( Gia_ManPiNum(
p) == nInputs );
53 printf(
"Simulating string \"%s\":\n", pSim );
57 for ( i = 0; i < nFrames; i++ )
60 pObj->
fMark0 = (int)(Vec_IntFind(vAlpha, pSim[i]) == k);
62 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) &
63 (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
65 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
69 printf(
"Frame %d : %c %d\n", i, pSim[i], Gia_ManPo(
p, 0)->fMark0 );
87 int Zero0, One0, Zero1, One1;
90 *pZero = Abc_LitNot(pLits[0]);
102 assert( Vec_IntSize(vLits) > 0 );
118static inline int Gia_SymbSpecial(
char c ) {
return c ==
'(' || c ==
')' || c ==
'*' || c ==
'|'; }
122 int i, nStates = 0, Length =
strlen(pStr);
123 Vec_Int_t * vAlphas = Vec_IntAlloc( 100 );
124 Vec_Int_t * vStr2Sta = Vec_IntStartFull( Length + 1 );
125 for ( i = 0; i < Length; i++ )
127 if ( Gia_SymbSpecial(pStr[i]) )
129 if ( Vec_IntFind(vAlphas, pStr[i]) == -1 )
130 Vec_IntPush( vAlphas, pStr[i] );
131 Vec_IntWriteEntry( vStr2Sta, i, nStates++ );
133 Vec_IntWriteEntry( vStr2Sta, i, nStates );
135 *pvStr2Sta = vStr2Sta;
141 int i = 0, nLength =
strlen(pStr);
142 for ( i = 0; i < nLength; i++ )
144 printf(
"%d \'%c\' ", i, pStr[i] );
145 if ( Vec_IntEntry(vStaTrans, i) >= 0 )
146 printf(
"-> %d \'%c\' ", Vec_IntEntry(vStaTrans, i), pStr[Vec_IntEntry(vStaTrans, i)] );
154 printf(
"Reached from state %d \'%c\': ", iState, pStr[iState] );
156 printf(
"%d \'%c\' ", Entry, pStr[Entry] );
162 if ( Vec_IntEntry(vVisited, iState) == TravId )
164 Vec_IntWriteEntry( vVisited, iState, TravId );
165 if ( !Gia_SymbSpecial(pStr[iState]) )
166 Vec_IntPush( vReached, iState );
167 if ( pStr[iState] ==
'\0' )
169 if ( Gia_SymbSpecial(pStr[iState]) && pStr[iState] !=
'|' )
171 if ( Vec_IntEntry(vStaTrans, iState) >= 0 )
176 assert( iState == 0 || !Gia_SymbSpecial(pStr[iState]) );
177 assert( Vec_IntEntry(vVisited, iState) != TravId );
178 Vec_IntClear( vReached );
188 for ( i = 0; pStr[i]; i++ )
190 if ( pStr[i] ==
'(' )
192 else if ( pStr[i] ==
')' )
194 if ( pStr[i] !=
' ' && pStr[i] !=
'\t' && pStr[i] !=
'\n' && pStr[i] !=
'\r' )
195 pCopy[k++] = pStr[i];
206 Vec_Int_t * vAlphas, * vStr2Sta, * vStaLits;
207 Vec_Int_t * vStaTrans, * vStack, * vVisited;
211 int i, k, iLit, Entry, nLength =
strlen(pStr), nTravId = 1;
213 Vec_IntSort( vAlphas, 0 );
216 printf(
"Input variable order: " );
218 printf(
"%c", (
char)Entry );
223 pNew->
pName = Abc_UtilStrsav( pStrInit );
224 for ( i = 0; i < Vec_IntSize(vAlphas) + nStates; i++ )
225 Gia_ManAppendCi( pNew );
227 vStaLits = Vec_IntStart( nStates + 1 );
228 vStaTrans = Vec_IntStartFull( nLength );
229 vStack = Vec_IntAlloc( nLength );
230 vVisited = Vec_IntStartFull( nLength + 1 );
231 for ( i = 0; i < nLength; i++ )
234 if ( pStr[i] ==
'(' || pStr[i] ==
'|' )
235 Vec_IntPush( vStack, i );
236 else if ( pStr[i] ==
')' )
238 int Or = Vec_IntPop( vStack );
239 if ( pStr[Or] ==
'|' )
241 Lp = Vec_IntPop( vStack );
242 Vec_IntWriteEntry( vStaTrans, Lp, Or + 1 );
243 Vec_IntWriteEntry( vStaTrans, Or, i );
248 if ( i < nLength - 1 && pStr[i+1] ==
'*' )
250 Vec_IntWriteEntry( vStaTrans, Lp, i+1 );
251 Vec_IntWriteEntry( vStaTrans, i+1, Lp );
254 assert( Vec_IntSize(vStack) == 0 );
260 for ( i = 1; i < nLength; i++ )
262 int iThis, iThat, iThisLit, iInputLit;
263 if ( Gia_SymbSpecial(pStr[i]) )
269 iThis = Vec_IntEntry(vStr2Sta, i);
270 iThisLit = Gia_Obj2Lit(pNew, Gia_ManPi(pNew, Vec_IntSize(vAlphas) + iThis));
271 iInputLit = Gia_Obj2Lit(pNew, Gia_ManPi(pNew, Vec_IntFind(vAlphas, pStr[i])));
275 iThat = Vec_IntEntry(vStr2Sta, Entry);
276 iLit =
Gia_ManHashOr( pNew, iLit, Vec_IntEntry(vStaLits, iThat) );
277 Vec_IntWriteEntry( vStaLits, iThat, iLit );
281 Vec_IntClear( vStack );
282 for ( i = 0; i < Vec_IntSize(vAlphas); i++ )
283 Vec_IntPush( vStack, Gia_Obj2Lit(pNew, Gia_ManPi(pNew, i)) );
287 Vec_IntWriteEntry( vStaLits, k,
Gia_ManHashAnd(pNew, iLit, Entry) );
294 vInit = Vec_StrStart( nStates + 1 );
295 Vec_StrFill( vInit, nStates,
'0' );
297 if ( pStr[Entry] !=
'\0' )
298 Vec_StrWriteEntry( vInit, Vec_IntEntry(vStr2Sta, Entry),
'1' );
300 printf(
"Init state = %s\n", Vec_StrArray(vInit) );
303 Vec_IntPushFirst( vStaLits, Vec_IntPop(vStaLits) );
304 assert( Vec_IntSize(vStaLits) == nStates + 1 );
306 Gia_ManAppendCo( pNew, iLit );
314 Vec_StrFree( vInit );
332 Vec_IntFree( vAlphas );
333 Vec_IntFree( vStr2Sta );
334 Vec_IntFree( vStaLits );
335 Vec_IntFree( vStaTrans );
336 Vec_IntFree( vStack );
337 Vec_IntFree( vVisited );
357 word t, m = 0x00000000FFFFFFFF;
358 for ( j = 32; j != 0; j = j >> 1, m = m ^ (m << j) )
360 for ( k = 0; k < 64; k = (k + j + 1) & ~j )
362 t = (A[k] ^ (A[k+j] >> j)) & m;
364 A[k+j] = A[k+j] ^ (t << j);
382 return Gia_ObjFaninC0(pObj) ? ~Vec_WrdEntry(vTemp, Gia_ObjFaninId0p(
p, pObj)) : Vec_WrdEntry(vTemp, Gia_ObjFaninId0p(
p, pObj));
386 return Gia_ObjFaninC1(pObj) ? ~Vec_WrdEntry(vTemp, Gia_ObjFaninId1p(
p, pObj)) : Vec_WrdEntry(vTemp, Gia_ObjFaninId1p(
p, pObj));
391 assert( Gia_ManPoNum(
p) == 1 );
392 assert( Vec_WrdSize(vTemp) >= Gia_ManObjNum(
p) );
393 Vec_WrdWriteEntry( vTemp, 0, 0 );
395 Vec_WrdWriteEntry( vTemp, Gia_ObjId(
p, pObj), ((
word)1) << (63-i) );
397 Vec_WrdWriteEntry( vTemp, Gia_ObjId(
p, pObj), ((Cur >> (63-i)) & 1) ? ~((
word)0) : 0 );
399 Vec_WrdWriteEntry( vTemp, i, Gia_ManAutomSim0(
p, pObj, vTemp) & Gia_ManAutomSim1(
p, pObj, vTemp) );
401 pNext[i] = Gia_ManAutomSim0(
p, pObj, vTemp);
402 for ( ; i < 64; i++ )
413 return Gia_ManAutomSim0(
p, Gia_ManPo(
p, 0), vTemp);
417 word iState = 0, Output, pNext[64];
418 int i, k, kMin, Index, IndexMin;
420 for ( i = 0; i < nSteps; i++ )
427 for ( k = 0; k < Gia_ManPiNum(
p); k++ )
429 if ( pNext[k] == Init )
431 Index = Vec_WrdFind( vStates, pNext[k] );
432 Count = Index == -1 ? 0 : Vec_IntEntry( vCounts, Index );
433 if ( CountMin > Count || (CountMin !=
ABC_INFINITY && Count && ((
float)CountMin / Count) > (
float)rand()/RAND_MAX ) )
445 for ( k = 0; k < Gia_ManPiNum(
p); k++ )
446 if ( (Output >> (63-k)) & 1 )
448 printf(
"%c",
'a' + k );
454 if ( IndexMin == -1 )
457 IndexMin = Vec_IntSize(vCounts);
458 Vec_IntPush( vCounts, 0 );
459 Vec_WrdPush( vStates, pNext[kMin] );
461 Vec_IntAddToEntry( vCounts, IndexMin, 1 );
462 iState = pNext[kMin];
465 printf(
"%c",
'a' + kMin );
466 if ( (Output >> (63-kMin)) & 1 )
479 if ( Gia_ObjFaninC0(pObj) && Gia_ObjIsCi(Gia_ObjFanin0(pObj)) )
481 Index = Gia_ObjCioId(Gia_ObjFanin0(pObj)) - Gia_ManPiNum(
p);
483 Init |= ((
word)1 << (63-Index));
485 if ( Gia_ObjFaninC1(pObj) && Gia_ObjIsCi(Gia_ObjFanin1(pObj)) )
487 Index = Gia_ObjCioId(Gia_ObjFanin1(pObj)) - Gia_ManPiNum(
p);
489 Init |= ((
word)1 << (63-Index));
498 if ( Gia_ManPoNum(
p) != 1 )
500 printf(
"AIG should have one primary output.\n" );
503 if ( Gia_ManPiNum(
p) > 64 )
505 printf(
"Cannot simulate an automaton with more than 64 inputs.\n" );
508 if ( Gia_ManRegNum(
p) > 64 )
510 printf(
"Cannot simulate an automaton with more than 63 states.\n" );
513 vTemp = Vec_WrdStart( Gia_ManObjNum(
p) );
514 vStates = Vec_WrdAlloc( 1000 );
515 vCounts = Vec_IntAlloc( 1000 );
516 Vec_WrdPush( vStates, 0 );
517 Vec_IntPush( vCounts, 1 );
519 for ( i = 0; i < nWalks; i++ )
527 printf(
"%3d : ", i );
529 printf(
" %d ", Vec_IntEntry(vCounts, i) );
534 Vec_WrdFree( vTemp );
535 Vec_WrdFree( vStates );
536 Vec_IntFree( vCounts );
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#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 ///.
struct Vec_Str_t_ Vec_Str_t
void Gia_ManAutomWalkOne(Gia_Man_t *p, int nSteps, Vec_Wrd_t *vStates, Vec_Int_t *vCounts, Vec_Wrd_t *vTemp, word Init)
void Gia_ManPrintAutom(char *pStr, Vec_Int_t *vStaTrans)
Gia_Man_t * Gia_ManRex2Gia(char *pStrInit, int fOrder, int fVerbose)
int Gia_ManRexNumInputs(char *pStr, Vec_Int_t **pvAlphas, Vec_Int_t **pvStr2Sta)
word Gia_ManAutomInit(Gia_Man_t *p)
word Gia_ManAutomStep(Gia_Man_t *p, word Cur, word *pNext, Vec_Wrd_t *vTemp)
void Gia_ManPrintReached(char *pStr, int iState, Vec_Int_t *vReached)
void Gia_ManPrintReached_rec(char *pStr, Vec_Int_t *vStaTrans, int iState, Vec_Int_t *vReached, Vec_Int_t *vVisited, int TravId)
void Gia_ManAutomWalk(Gia_Man_t *p, int nSteps, int nWalks, int fVerbose)
void Gia_ManBuild1Hot_rec(Gia_Man_t *p, int *pLits, int nLits, int *pZero, int *pOne)
char * Gia_ManRexPreprocess(char *pStr)
void Gia_ManCollectReached(char *pStr, Vec_Int_t *vStaTrans, int iState, Vec_Int_t *vReached, Vec_Int_t *vVisited, int TravId)
void Gia_ManAutomTranspose64(word A[64])
ABC_NAMESPACE_IMPL_START void Gia_ManAutomSimulate(Gia_Man_t *p, Vec_Int_t *vAlpha, char *pSim)
DECLARATIONS ///.
int Gia_ManBuild1Hot(Gia_Man_t *p, Vec_Int_t *vLits)
void Gia_ManStop(Gia_Man_t *p)
#define Gia_ManForEachRo(p, pObj, i)
#define Gia_ManForEachAnd(p, pObj, i)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
void Gia_ManHashAlloc(Gia_Man_t *p)
#define Gia_ManForEachPi(p, pObj, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_ManCleanMark0(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
Gia_Man_t * Gia_ManDupZeroUndc(Gia_Man_t *p, char *pInit, int nNewPis, int fGiaSimple, int fVerbose)
void Gia_ManHashStop(Gia_Man_t *p)
#define Gia_ManForEachRi(p, pObj, i)
void Extra_PrintBinary(FILE *pFile, unsigned Sign[], int nBits)
unsigned __int64 word
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.