35#define IFN_WRD (IFN_INS > 6 ? 1 << (IFN_INS-6) : 1)
50static char * Ifn_Symbs[16] = {
91static inline word * Ifn_ElemTruth(
Ifn_Ntk_t *
p,
int i ) {
return p->pTtElems + i * Abc_TtWordNum(
p->nInps); }
92static inline word * Ifn_ObjTruth(
Ifn_Ntk_t *
p,
int i ) {
return p->pTtObjs + i *
p->nWords; }
118 assert( nVars <= p->nInps );
121 p->nWords = Abc_TtWordNum(nVars);
123 for ( i =
p->nInps; i < p->nObjs; i++ )
127 p->Nodes[i].iFirst =
p->nPars;
128 p->nPars += (1 <<
p->Nodes[i].nFanins);
130 printf(
"Node %d Start %d Vars %d\n", i,
p->Nodes[i].iFirst, (1 <<
p->Nodes[i].nFanins) );
133 printf(
"Groups start %d\n",
p->nPars );
134 p->nParsVIni =
p->nPars;
135 p->nParsVNum = Abc_Base2Log(nVars);
136 p->nPars +=
p->nParsVNum *
p->nInps;
138 memset(
p->Values, 0xFF,
sizeof(
int) *
p->nPars );
145 printf(
"String is empty.\n" );
148 for ( i =
p->nInps; i < p->nObjs; i++ )
150 printf(
"%c=",
'a'+i );
151 printf(
"%c", Ifn_Symbs[
p->Nodes[i].Type][0] );
152 for ( k = 0; k < (int)
p->Nodes[i].nFanins; k++ )
153 printf(
"%c",
'a'+
p->Nodes[i].Fanins[k] );
154 printf(
"%c", Ifn_Symbs[
p->Nodes[i].Type][1] );
162 for ( i =
p->nInps; i < p->nObjs; i++ )
164 LutSize = Abc_MaxInt( LutSize, (
int)
p->Nodes[i].nFanins );
187 va_start( args, format );
190 printf(
"%s", pMessage );
196 if ( pStr[0] ==
'(' )
198 if ( pStr[0] ==
'[' )
200 if ( pStr[0] ==
'<' )
202 if ( pStr[0] ==
'{' )
208 int i, nNodes = 0, Marks[32] = {0}, MaxVar = -1;
209 for ( i = 0; pStr[i]; i++ )
213 if ( pStr[i] ==
';' ||
214 pStr[i] ==
'(' || pStr[i] ==
')' ||
215 pStr[i] ==
'[' || pStr[i] ==
']' ||
216 pStr[i] ==
'<' || pStr[i] ==
'>' ||
217 pStr[i] ==
'{' || pStr[i] ==
'}' )
219 if ( pStr[i] >=
'A' && pStr[i] <=
'Z' )
221 if ( pStr[i] >=
'a' && pStr[i] <=
'z' )
223 MaxVar = Abc_MaxInt( MaxVar, (
int)(pStr[i] -
'a') );
224 Marks[pStr[i] -
'a'] = 1;
227 return Ifn_ErrorMessage(
"String \"%s\" contains unrecognized symbol \'%c\'.\n", pStr, pStr[i] );
229 for ( i = 0; i <= MaxVar; i++ )
231 return Ifn_ErrorMessage(
"String \"%s\" has no symbol \'%c\'.\n", pStr,
'a' + i );
232 *pnInps = MaxVar + 1;
233 *pnObjs = MaxVar + 1 + nNodes;
236static inline char * Ifn_NtkParseFindClosingParenthesis(
char * pStr,
char Open,
char Close )
240 for ( ; *pStr; pStr++ )
244 if ( *pStr == Close )
254 int nFanins = 0, pFanins[
IFN_INS];
256 char * pLim = Ifn_NtkParseFindClosingParenthesis( pStr++, Ifn_Symbs[Type][0], Ifn_Symbs[Type][1] );
259 return Ifn_ErrorMessage(
"For symbol \'%c\' cannot find matching symbol \'%c\'.\n", Ifn_Symbs[Type][0], Ifn_Symbs[Type][1] );
260 while ( pStr < pLim )
263 if ( pStr[0] >=
'a' && pStr[0] <=
'z' )
264 pFanins[nFanins++] = pStr[0] -
'a', pStr++;
269 pFanins[nFanins++] = *piNode - 1;
272 return Ifn_ErrorMessage(
"Substring \"%s\" contains unrecognized symbol \'%c\'.\n", pStr, pStr[0] );
275 pObj =
p->Nodes + (*piNode)++;
287 char * pFinal;
int iNode;
291 return Ifn_ErrorMessage(
"The number of variables (%d) exceeds predefined limit (%d). Recompile with different value of IFN_INS.\n",
p->nInps,
IFN_INS );
294 return Ifn_ErrorMessage(
"The first symbol should be one of the symbols: (, [, <, {.\n" );
298 if ( pFinal[0] && pFinal[0] !=
';' )
300 if ( iNode !=
p->nObjs )
319 for ( i = 0; pStr[i]; i++ )
320 if ( pStr[i] ==
'=' )
326 int i, Marks[32] = {0}, MaxVar = 0, MaxDef = 0;
327 for ( i = 0; pStr[i]; i++ )
329 if ( pStr[i] ==
'=' || pStr[i] ==
';' ||
330 pStr[i] ==
'(' || pStr[i] ==
')' ||
331 pStr[i] ==
'[' || pStr[i] ==
']' ||
332 pStr[i] ==
'<' || pStr[i] ==
'>' ||
333 pStr[i] ==
'{' || pStr[i] ==
'}' )
335 if ( pStr[i] >=
'A' && pStr[i] <=
'Z' )
337 if ( pStr[i] >=
'a' && pStr[i] <=
'z' )
339 if ( pStr[i+1] ==
'=' )
340 Marks[pStr[i] -
'a'] = 2, MaxDef = Abc_MaxInt(MaxDef, pStr[i] -
'a');
343 return Ifn_ErrorMessage(
"String \"%s\" contains unrecognized symbol \'%c\'.\n", pStr, pStr[i] );
345 for ( i = 0; pStr[i]; i++ )
347 if ( pStr[i] ==
'=' || pStr[i] ==
';' ||
348 pStr[i] ==
'(' || pStr[i] ==
')' ||
349 pStr[i] ==
'[' || pStr[i] ==
']' ||
350 pStr[i] ==
'<' || pStr[i] ==
'>' ||
351 pStr[i] ==
'{' || pStr[i] ==
'}' )
353 if ( pStr[i] >=
'A' && pStr[i] <=
'Z' )
355 if ( pStr[i] >=
'a' && pStr[i] <=
'z' )
357 if ( pStr[i+1] !=
'=' && Marks[pStr[i] -
'a'] != 2 )
358 Marks[pStr[i] -
'a'] = 1, MaxVar = Abc_MaxInt(MaxVar, pStr[i] -
'a');
361 return Ifn_ErrorMessage(
"String \"%s\" contains unrecognized symbol \'%c\'.\n", pStr, pStr[i] );
365 for ( i = 0; i < MaxDef; i++ )
367 return Ifn_ErrorMessage(
"String \"%s\" has no symbol \'%c\'.\n", pStr,
'a' + i );
368 for ( i = 0; i < MaxVar; i++ )
370 return Ifn_ErrorMessage(
"String \"%s\" has definition of input variable \'%c\'.\n", pStr,
'a' + i );
371 for ( i = MaxVar; i < MaxDef; i++ )
373 return Ifn_ErrorMessage(
"String \"%s\" has no definition for internal variable \'%c\'.\n", pStr,
'a' + i );
380 int i, k, n, f, nFans, iFan;
384 return Ifn_ErrorMessage(
"The number of variables (%d) exceeds predefined limit (%d). Recompile with different value of IFN_INS.\n",
p->nInps,
IFN_INS );
386 for ( i =
p->nInps; i < p->nObjs; i++ )
389 for ( k = 0; pStr[k]; k++ )
390 if ( pStr[k] ==
'a' + i && pStr[k+1] ==
'=' )
393 return Ifn_ErrorMessage(
"Cannot find definition of signal \'%c\'.\n",
'a' + i );
394 if ( pStr[k+2] ==
'(' )
396 else if ( pStr[k+2] ==
'[' )
398 else if ( pStr[k+2] ==
'<' )
400 else if ( pStr[k+2] ==
'{' )
403 return Ifn_ErrorMessage(
"Cannot find opening operation symbol in the definition of signal \'%c\'.\n",
'a' + i );
404 for ( n = k + 3; pStr[n]; n++ )
405 if ( pStr[n] == Next )
408 return Ifn_ErrorMessage(
"Cannot find closing operation symbol in the definition of signal \'%c\'.\n",
'a' + i );
411 return Ifn_ErrorMessage(
"Cannot find matching operation symbol in the definition of signal \'%c\'.\n",
'a' + i );
412 for ( f = 0; f < nFans; f++ )
414 iFan = pStr[k + 3 + f] -
'a';
415 if ( iFan < 0 || iFan >= i )
416 return Ifn_ErrorMessage(
"Fanin number %d is signal %d is out of range.\n", f,
'a' + i );
417 p->Nodes[i].Fanins[f] = iFan;
419 p->Nodes[i].nFanins = nFans;
428 for ( i = 0; i <
p->nInps; i++ )
429 for ( k = 0; pStr[k]; k++ )
430 if ( pStr[k] ==
'A' + i && pStr[k-1] ==
';' )
433 p->pConstr[
p->nConstr++] = ((int)(pStr[k] -
'A') << 16) | (
int)(pStr[k+1] -
'A');
460 Abc_TtElemInit2(
p->pTtElems,
p->nInps );
468 for ( i = pNtk->
nInps; i < pNtk->nObjs; i++ )
491 int i, k, iLit, * pVarMap =
ABC_FALLOC(
int,
p->nParsVIni );
493 pNew->
pName = Abc_UtilStrsav(
"model" );
495 for ( i = 0; i <
p->nInps; i++ )
496 pVarMap[i] = Gia_ManAppendCi(pNew);
497 for ( i =
p->nObjs; i < p->nParsVIni; i++ )
498 pVarMap[i] = Gia_ManAppendCi(pNew);
499 for ( i =
p->nInps; i < p->nObjs; i++ )
501 int Type =
p->Nodes[i].Type;
502 int nFans =
p->Nodes[i].nFanins;
503 int * pFans =
p->Nodes[i].Fanins;
504 int iFanin =
p->Nodes[i].iFirst;
508 for ( k = 0; k < nFans; k++ )
515 for ( k = 0; k < nFans; k++ )
522 pVarMap[i] =
Gia_ManHashMux( pNew, pVarMap[pFans[0]], pVarMap[pFans[1]], pVarMap[pFans[2]] );
526 int n, Step, pVarsData[256];
527 int nMints = (1 << nFans);
528 assert( nFans >= 0 && nFans <= 8 );
529 for ( k = 0; k < nMints; k++ )
530 pVarsData[k] = pVarMap[iFanin + k];
531 for ( Step = 1, k = 0; k < nFans; k++, Step <<= 1 )
532 for ( n = 0; n < nMints; n += Step << 1 )
533 pVarsData[n] =
Gia_ManHashMux( pNew, pVarMap[pFans[k]], pVarsData[n+Step], pVarsData[n] );
535 pVarMap[i] = pVarsData[0];
539 Gia_ManAppendCo( pNew, pVarMap[
p->nObjs-1] );
543 assert( Gia_ManPiNum(pNew) ==
p->nParsVIni - (
p->nObjs -
p->nInps) );
544 assert( Gia_ManPoNum(pNew) == 1 );
552 int i, m, nMints = 1 << nIns;
554 pNew->
pName = Abc_UtilStrsav(
p->pName );
556 Gia_ManConst0(
p)->Value = 0;
559 pObj->
Value = Gia_ManAppendCi( pNew );
560 for ( m = 0; m < nMints; m++ )
564 pObj->
Value = ((m >> i) & 1);
568 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
591 pCnf =
Cnf_Derive( pAig, Aig_ManCoNum(pAig) );
601 pCnf = Cnf_DeriveGiaRemapped(
p );
606 for ( i = 0; i < pCnf->
nClauses; i++ )
610 *pvPiVars = Vec_IntAlloc( Gia_ManPiNum(
p) );
612 Vec_IntPush( *pvPiVars, pCnf->
pVarNums[Gia_ObjId(
p, pObj)] );
613 *pvPoVars = Vec_IntAlloc( Gia_ManPoNum(
p) );
615 Vec_IntPush( *pvPoVars, pCnf->
pVarNums[Gia_ObjId(
p, pObj)] );
623 *pvPiVars = *pvPoVars = NULL;
658 for ( i = 0; i < nVars; i++ )
659 printf(
"%c",
'a' + pPerms[i] );
664 int v, Value, m, mNew, nMints = (1 << nVars);
665 assert( (1 << nInps) == Vec_IntSize(vPoVars) );
668 Vec_IntFill( vLits, Vec_IntSize(vPoVars), -1 );
669 for ( m = 0; m < nMints; m++ )
672 for ( v = 0; v < nInps; v++ )
674 assert( pPerm[v] < nVars );
675 if ( ((m >> pPerm[v]) & 1) )
678 assert( Vec_IntEntry(vLits, mNew) == -1 );
679 Vec_IntWriteEntry( vLits, mNew, Abc_TtGetBit(pTruth, m) );
685 Vec_IntWriteEntry( vLits, v++, Abc_Var2Lit(Vec_IntEntry(vPoVars, m), !Value) );
686 Vec_IntShrink( vLits, v );
688 Value =
sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), 0, 0, 0, 0 );
689 return (
int)(Value ==
l_True);
694 Vec_IntClear( vValues );
696 Vec_IntPush( vValues, sat_solver_var_value(pSat, iVar) );
703 for ( i = 0; i < nInps; i++ )
705 pPerm[i] = Abc_TtGetHex( &Perm, i );
706 assert( pPerm[i] < nVars );
710 Vec_IntClear( vValues );
718 Vec_Int_t * vValues = Vec_IntAlloc( 100 );
722 Vec_IntPrint( vValues );
725 Vec_IntFreeP( &vPiVars );
726 Vec_IntFreeP( &vPoVars );
727 Vec_IntFreeP( &vValues );
745 int i, k, iLit, iVar = 0, nVarsNew, pVarMap[1000];
746 int nTtBits =
p->nParsVIni -
p->nObjs;
747 int nPermBits = Abc_Base2Log(
p->nInps + 1) + 1;
748 int fCompl = Abc_TtGetBit( pConfigData, nTtBits + nPermBits *
p->nInps );
749 assert( Vec_IntSize(vLeaves) <=
p->nInps &&
p->nParsVIni < 1000 );
750 for ( i = 0; i <
p->nInps; i++ )
752 for ( iLit = k = 0; k < nPermBits; k++ )
753 if ( Abc_TtGetBit(pConfigData, nTtBits + i * nPermBits + k) )
755 assert( Abc_Lit2Var(iLit) < Vec_IntSize(vLeaves) );
756 pVarMap[i] = Abc_Lit2LitL( Vec_IntArray(vLeaves), iLit );
758 for ( i =
p->nInps; i < p->nObjs; i++ )
760 int Type =
p->Nodes[i].Type;
761 int nFans =
p->Nodes[i].nFanins;
762 int * pFans =
p->Nodes[i].Fanins;
768 for ( k = 0; k < nFans; k++ )
775 for ( k = 0; k < nFans; k++ )
782 pVarMap[i] =
Gia_ManHashMux( pNew, pVarMap[pFans[0]], pVarMap[pFans[1]], pVarMap[pFans[2]] );
789 int nMints = (1 << nFans);
790 for ( k = 0; k < nMints; k++ )
791 if ( Abc_TtGetBit(pConfigData, iVar++) )
792 uTruth |= ((
word)1 << k);
793 uTruth = Abc_Tt6Stretch( uTruth, nFans );
795 for ( k = 0; k < nFans; k++ )
796 pFaninLits[k] = pVarMap[pFans[k]];
798 nVarsNew = Abc_TtMinBase( &uTruth, pFaninLits, nFans, 6 );
800 pVarMap[i] = (int)(uTruth & 1);
804 Vec_Int_t Leaves = { nVarsNew, nVarsNew, pFaninLits };
805 pVarMap[i] =
Kit_TruthToGia( pNew, (
unsigned *)&uTruth, nVarsNew, vCover, &Leaves, 1 );
810 assert( iVar == nTtBits );
811 return Abc_LitNotCond( pVarMap[
p->nObjs - 1], fCompl );
834 int k, i, iLut, iVar;
835 int nConfigInts, Count = 0;
838 assert( Gia_ManHasMapping(
p) );
842 nConfigInts = Vec_IntEntry(
p->vConfigs, 1 );
845 pNew->
pName = Abc_UtilStrsav(
p->pName );
846 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
849 Gia_ManConst0(
p)->Value = 0;
851 pObj->
Value = Gia_ManAppendCi(pNew);
853 vLeaves = Vec_IntAlloc( 16 );
854 vCover = Vec_IntAlloc( 1 << 16 );
859 if ( Gia_ObjIsBuf(pObj) )
861 pObj->
Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
864 if ( !Gia_ObjIsLut(
p, iLut) )
872 Vec_IntClear( vLeaves );
874 Vec_IntPush( vLeaves, Gia_ManObj(
p, iVar)->Value );
875 pConfigData = (
word *)Vec_IntEntryP(
p->vConfigs, 2 + nConfigInts * Count++ );
878 assert( Vec_IntEntry(
p->vConfigs, 0) == Count );
879 assert( Vec_IntSize(
p->vConfigs) == 2 + nConfigInts * Count );
882 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
885 Vec_IntFree( vLeaves );
886 Vec_IntFree( vCover );
908 int i, v, f, iVar, iStart;
910 for ( i = 0; i <
p->nInps; i++ )
913 iStart =
p->nParsVIni + i *
p->nParsVNum;
914 for ( v = iVar = 0; v <
p->nParsVNum; v++ )
915 if (
p->Values[iStart+v] )
918 Abc_TtCopy( Ifn_ObjTruth(
p, i), Ifn_ElemTruth(
p, iVar),
p->nWords, 0 );
921 for ( i =
p->nInps; i < p->nObjs; i++ )
923 int nFans =
p->Nodes[i].nFanins;
924 int * pFans =
p->Nodes[i].Fanins;
925 word * pTruth = Ifn_ObjTruth(
p, i );
928 Abc_TtFill( pTruth,
p->nWords );
929 for ( f = 0; f < nFans; f++ )
930 Abc_TtAnd( pTruth, pTruth, Ifn_ObjTruth(
p, pFans[f]),
p->nWords, 0 );
934 Abc_TtClear( pTruth,
p->nWords );
935 for ( f = 0; f < nFans; f++ )
936 Abc_TtXor( pTruth, pTruth, Ifn_ObjTruth(
p, pFans[f]),
p->nWords, 0 );
941 Abc_TtMux( pTruth, Ifn_ObjTruth(
p, pFans[0]), Ifn_ObjTruth(
p, pFans[1]), Ifn_ObjTruth(
p, pFans[2]),
p->nWords );
945 int nValues = (1 << nFans);
946 word * pTemp = Ifn_ObjTruth(
p,
p->nObjs);
947 Abc_TtClear( pTruth,
p->nWords );
948 for ( v = 0; v < nValues; v++ )
950 if ( pValues[
p->Nodes[i].iFirst + v] == 0 )
952 Abc_TtFill( pTemp,
p->nWords );
953 for ( f = 0; f < nFans; f++ )
955 Abc_TtAnd( pTemp, pTemp, Ifn_ObjTruth(
p, pFans[f]),
p->nWords, 0 );
957 Abc_TtSharp( pTemp, pTemp, Ifn_ObjTruth(
p, pFans[f]),
p->nWords );
958 Abc_TtOr( pTruth, pTruth, pTemp,
p->nWords );
964 return Ifn_ObjTruth(
p,
p->nObjs-1);
980 word Cond[4], Equa[4], Temp[4];
981 word s_TtElems[8][4] = {
991 int i,
nWords = Abc_TtWordNum(2*nVars);
992 assert( nVars > 0 && nVars <= 4 );
993 Abc_TtClear( pTruth,
nWords );
994 Abc_TtFill( Equa,
nWords );
995 for ( i = nVars - 1; i >= 0; i-- )
998 Abc_TtSharp( Cond, s_TtElems[2*i+1], s_TtElems[2*i+0],
nWords );
1000 Abc_TtSharp( Cond, s_TtElems[2*i+0], s_TtElems[2*i+1],
nWords );
1001 Abc_TtAnd( Temp, Equa, Cond,
nWords, 0 );
1002 Abc_TtOr( pTruth, pTruth, Temp,
nWords );
1003 Abc_TtXor( Temp, s_TtElems[2*i+0], s_TtElems[2*i+1],
nWords, 1 );
1004 Abc_TtAnd( Equa, Equa, Temp,
nWords, 0 );
1007 Abc_TtNot( pTruth,
nWords );
1027 for ( ; pBeg < pEnd; pBeg++ )
1028 printf(
"%c%d ", Abc_LitIsCompl(*pBeg) ?
'-':
'+', Abc_Lit2Var(*pBeg) );
1035 int RetValue, k, c,
Cube, Literal, nLits, pLits[
IFN_INS];
1039 for ( k = 0; k < nVars; k++ )
1041 Literal = 3 & (
Cube >> (k << 1));
1043 pLits[nLits++] = Abc_Var2Lit(pVars[k], 0);
1044 else if ( Literal == 2 )
1045 pLits[nLits++] = Abc_Var2Lit(pVars[k], 1);
1046 else if ( Literal != 0 )
1057 word uTruth = Abc_Tt6Stretch( ~Abc_Tt6Mask(
p->nVars),
p->nParsVNum );
1062 int RetValue =
Kit_TruthIsop( (
unsigned *)&uTruth,
p->nParsVNum, vCover, 0 );
1066 for ( i = 0; i <
p->nInps; i++ )
1068 for ( k = 0; k <
p->nParsVNum; k++ )
1069 pVars[k] =
p->nParsVIni + i *
p->nParsVNum + k;
1074 if ( fAddConstr &&
p->nConstr )
1077 int i, k, RetValue, pVars[2*
IFN_INS];
1078 int fForceDiff = (
p->nVars ==
p->nInps);
1080 RetValue =
Kit_TruthIsop( (
unsigned *)pTruth, 2*
p->nParsVNum, vCover, 0 );
1083 for ( i = 0; i <
p->nConstr; i++ )
1085 int iVar1 =
p->pConstr[i] >> 16;
1086 int iVar2 =
p->pConstr[i] & 0xFFFF;
1087 for ( k = 0; k <
p->nParsVNum; k++ )
1089 pVars[2*k+0] =
p->nParsVIni + iVar1 *
p->nParsVNum + k;
1090 pVars[2*k+1] =
p->nParsVIni + iVar2 *
p->nParsVNum + k;
1096 Vec_IntFree( vCover );
1116 for ( i = 0; i <
p->nObjs; i++ )
1117 p->Nodes[i].Var = nSatVars++;
1121 for ( i = 0; i <
p->nVars; i++ )
1122 assert( pValues[i] != -1 );
1123 for ( i =
p->nVars; i < p->nObjs-1; i++ )
1124 assert( pValues[i] == -1 );
1125 assert( pValues[
p->nObjs-1] != -1 );
1128 for ( i = 0; i <
p->nInps; i++ )
1130 int iParStart =
p->nParsVIni + i *
p->nParsVNum;
1131 for ( v = 0; v <
p->nVars; v++ )
1134 pLits[0] = Abc_Var2Lit(
p->Nodes[i].Var, pValues[v]==0 );
1136 for ( f = 0; f <
p->nParsVNum; f++ )
1137 pLits[f+1] = Abc_Var2Lit( iParStart + f, (v >> f) & 1 );
1143 for ( i =
p->nInps; i < p->nObjs; i++ )
1145 int nFans =
p->Nodes[i].nFanins;
1146 int * pFans =
p->Nodes[i].Fanins;
1150 pLits[nLits++] = Abc_Var2Lit(
p->Nodes[i].Var, 0 );
1151 for ( f = 0; f < nFans; f++ )
1153 pLits[nLits++] = Abc_Var2Lit(
p->Nodes[pFans[f]].Var, 1 );
1155 pLits2[0] = Abc_Var2Lit(
p->Nodes[i].Var, 1 );
1156 pLits2[1] = Abc_Var2Lit(
p->Nodes[pFans[f]].Var, 0 );
1166 int m, nMints = (1 << (nFans+1));
1167 for ( m = 0; m < nMints; m++ )
1171 for ( v = 0; v <= nFans; v++ )
1172 Count += ((m >> v) & 1);
1173 if ( (Count & 1) == 0 )
1176 pLits[0] = Abc_Var2Lit(
p->Nodes[i].Var, (m >> nFans) & 1 );
1177 for ( v = 0; v < nFans; v++ )
1178 pLits[v+1] = Abc_Var2Lit(
p->Nodes[pFans[v]].Var, (m >> v) & 1 );
1185 pLits[0] = Abc_Var2Lit(
p->Nodes[i].Var, 0 );
1186 pLits[1] = Abc_Var2Lit(
p->Nodes[pFans[0]].Var, 1 );
1187 pLits[2] = Abc_Var2Lit(
p->Nodes[pFans[1]].Var, 1 );
1191 pLits[0] = Abc_Var2Lit(
p->Nodes[i].Var, 1 );
1192 pLits[1] = Abc_Var2Lit(
p->Nodes[pFans[0]].Var, 1 );
1193 pLits[2] = Abc_Var2Lit(
p->Nodes[pFans[1]].Var, 0 );
1197 pLits[0] = Abc_Var2Lit(
p->Nodes[i].Var, 0 );
1198 pLits[1] = Abc_Var2Lit(
p->Nodes[pFans[0]].Var, 0 );
1199 pLits[2] = Abc_Var2Lit(
p->Nodes[pFans[2]].Var, 1 );
1203 pLits[0] = Abc_Var2Lit(
p->Nodes[i].Var, 1 );
1204 pLits[1] = Abc_Var2Lit(
p->Nodes[pFans[0]].Var, 0 );
1205 pLits[2] = Abc_Var2Lit(
p->Nodes[pFans[2]].Var, 0 );
1211 int nValues = (1 << nFans);
1212 int iParStart =
p->Nodes[i].iFirst;
1213 for ( v = 0; v < nValues; v++ )
1216 if ( pValues[i] == -1 )
1218 pLits[nLits] = Abc_Var2Lit(
p->Nodes[i].Var, 0 );
1219 pLits2[nLits] = Abc_Var2Lit(
p->Nodes[i].Var, 1 );
1222 for ( f = 0; f < nFans; f++, nLits++ )
1223 pLits[nLits] = pLits2[nLits] = Abc_Var2Lit(
p->Nodes[pFans[f]].Var, (v >> f) & 1 );
1224 pLits[nLits] = Abc_Var2Lit( iParStart + v, 1 );
1225 pLits2[nLits] = Abc_Var2Lit( iParStart + v, 0 );
1227 if ( pValues[i] != 0 )
1232 if ( pValues[i] != 1 )
1243 pLits[0] = Abc_Var2Lit(
p->Nodes[
p->nObjs-1].Var, pValues[
p->nObjs-1]==0 );
1262 printf(
"Iter = %5d ", Iter );
1263 printf(
"Mint = %5d ", iMint );
1264 printf(
"Value = %2d ", Value );
1269 printf(
"status = unsat" );
1270 else if ( status ==
l_True )
1271 printf(
"status = sat " );
1273 printf(
"status = undec" );
1274 Abc_PrintTime( 1,
"Time", clk );
1279 for ( v =
p->nObjs; v < p->nPars; v++ )
1281 for ( i =
p->nInps; i < p->nObjs; i++ )
1282 if (
p->Nodes[i].Type ==
IFN_DSD_PRIME && (
int)
p->Nodes[i].iFirst == v )
1286 else if ( v >=
p->nParsVIni && (v -
p->nParsVIni) %
p->nParsVNum == 0 )
1287 printf(
" %d=", (v -
p->nParsVIni) /
p->nParsVNum );
1288 printf(
"%d", sat_solver_var_value(pSat, v) );
1296 for ( i = 0; i <
p->nInps; i++ )
1298 for ( Mint = v = 0; v <
p->nParsVNum; v++ )
1299 if ( sat_solver_var_value(pSat,
p->nParsVIni + i *
p->nParsVNum + v) )
1301 Abc_TtSetHex( &Perm, i, Mint );
1309 for ( i = 0; i <
p->nInps; i++ )
1311 for ( Mint = v = 0; v <
p->nParsVNum; v++ )
1312 if ( sat_solver_var_value(pSat,
p->nParsVIni + i *
p->nParsVNum + v) )
1314 Abc_TtSetHex( pConfig, i, Mint );
1316 for ( v =
p->nObjs; v < p->nParsVIni; v++ )
1317 if ( sat_solver_var_value(pSat, v) )
1318 Abc_TtSetBit( pConfig + 1, v -
p->nObjs );
1324 for ( i = 0; i < nInps; i++ )
1325 printf(
"%c",
'a' + Abc_TtGetHex(&Perm, i) );
1332 int nIterMax = (1<<nVars);
1333 int i, v, status, iMint = 0;
1345 if ( pConfig )
assert( *pConfig == 0 );
1346 for ( i = 0; i < nIterMax; i++ )
1349 for ( v = 0; v <
p->nObjs; v++ )
1350 p->Values[v] = v < p->nVars ? (iMint >> v) & 1 : -1;
1351 p->Values[
p->nObjs-1] = Abc_TtGetBit( pTruth, iMint );
1364 for ( v =
p->nObjs; v < p->nPars; v++ )
1365 p->Values[v] = sat_solver_var_value(pSat, v);
1370 Abc_TtXor( pTruth1, pTruth1,
p->pTruth,
p->nWords, 0 );
1372 iMint = Abc_TtFindFirstBit( pTruth1,
p->nVars );
1434 char * pStr =
"{({(ab)cde}f)ghi};AB;CD;DE;GH;HI";
1442 RetValue =
Ifn_NtkMatch(
p, pTruth, nVars, 0, 1, 1, &Perm );
#define ABC_FALLOC(type, num)
char * vnsprintf(const char *format, va_list args)
#define ABC_CALLOC(type, num)
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManStop(Aig_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
word * Dau_DsdToTruth(char *p, int nVars)
void Dau_DsdPrintFromTruth(word *pTruth, int nVarsInit)
Aig_Man_t * Gia_ManToAigSimple(Gia_Man_t *p)
ABC_NAMESPACE_IMPL_START int Kit_TruthToGia(Gia_Man_t *pMan, unsigned *pTruth, int nVars, Vec_Int_t *vMemory, Vec_Int_t *vLeaves, int fHash)
DECLARATIONS ///.
void Gia_ManStop(Gia_Man_t *p)
void Gia_ManHashStart(Gia_Man_t *p)
#define Gia_ManForEachPo(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)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
#define Gia_LutForEachFanin(p, i, iFan, k)
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
void Gia_ManHashStop(Gia_Man_t *p)
int Ifn_NtkParseInt2(char *pStr, Ifn_Ntk_t *p)
int Ifn_NtkInputNum(Ifn_Ntk_t *p)
int Ifn_ManStrType2(char *pStr)
void Ifn_NtkPrint(Ifn_Ntk_t *p)
void Ifn_ManSatPrintPerm(char *pPerms, int nVars)
int Ifn_NtkParseInt_rec(char *pStr, Ifn_Ntk_t *p, char **ppFinal, int *piNode)
void Ifn_NtkAddConstraints(Ifn_Ntk_t *p, sat_solver *pSat)
void * If_ManDeriveGiaFromCells(void *pGia)
int Ifn_AddClause(sat_solver *pSat, int *pBeg, int *pEnd)
void Ifn_NtkMatchPrintPerm(word Perm, int nInps)
sat_solver * Ifn_ManSatBuild(Ifn_Ntk_t *p, Vec_Int_t **pvPiVars, Vec_Int_t **pvPoVars)
Gia_Man_t * Ifn_ManStrFindCofactors(int nIns, Gia_Man_t *p)
Gia_Man_t * Ifn_ManStrFindModel(Ifn_Ntk_t *p)
void Ifn_NtkMatchPrintConfig(Ifn_Ntk_t *p, sat_solver *pSat)
void Ifn_TtComparisonConstr(word *pTruth, int nVars, int fMore, int fEqual)
int Ifn_Prepare(Ifn_Ntk_t *p, word *pTruth, int nVars)
FUNCTION DEFINITIONS ///.
int If_ManSatFindCofigBits(void *pSat, Vec_Int_t *vPiVars, Vec_Int_t *vPoVars, word *pTruth, int nVars, word Perm, int nInps, Vec_Int_t *vValues)
Ifn_Ntk_t * Ifn_NtkParse(char *pStr)
int Ifn_ManStrCheck2(char *pStr, int *pnInps, int *pnObjs)
void Ifn_NtkAddConstrOne(sat_solver *pSat, Vec_Int_t *vCover, int *pVars, int nVars)
int Ifn_NtkMatch(Ifn_Ntk_t *p, word *pTruth, int nVars, int nConfls, int fVerbose, int fVeryVerbose, word *pConfig)
int Ifn_NtkTtBits(char *pStr)
int Ifn_ManSatFindCofigBitsTest(Ifn_Ntk_t *p, word *pTruth, int nVars, word Perm)
int Ifn_NtkParseInt(char *pStr, Ifn_Ntk_t *p)
int Ifn_ManStrCheck(char *pStr, int *pnInps, int *pnObjs)
word Ifn_NtkMatchCollectPerm(Ifn_Ntk_t *p, sat_solver *pSat)
int Ifn_ErrorMessage(const char *format,...)
int If_ManSatDeriveGiaFromBits(void *pGia, Ifn_Ntk_t *p, word *pConfigData, Vec_Int_t *vLeaves, Vec_Int_t *vCover)
int Ifn_NtkLutSizeMax(Ifn_Ntk_t *p)
int Ifn_NtkAddClauses(Ifn_Ntk_t *p, int *pValues, sat_solver *pSat)
sat_solver * Ifn_ManStrFindSolver(Gia_Man_t *p, Vec_Int_t **pvPiVars, Vec_Int_t **pvPoVars)
word * Ifn_NtkDeriveTruth(Ifn_Ntk_t *p, int *pValues)
struct Ifn_Obj_t_ Ifn_Obj_t
void Ifn_NtkParseConstraints(char *pStr, Ifn_Ntk_t *p)
void Ifn_NtkMatchCollectConfig(Ifn_Ntk_t *p, sat_solver *pSat, word *pConfig)
void Ifn_NtkMatchPrintStatus(sat_solver *p, int Iter, int status, int iMint, int Value, abctime clk)
void * If_ManSatBuildFromCell(char *pStr, Vec_Int_t **pvPiVars, Vec_Int_t **pvPoVars, Ifn_Ntk_t **ppNtk)
int Ifn_ManSatCheckOne(sat_solver *pSat, Vec_Int_t *vPoVars, word *pTruth, int nVars, int *pPerm, int nInps, Vec_Int_t *vLits)
int Inf_ManOpenSymb(char *pStr)
void Ifn_ManSatDeriveOne(sat_solver *pSat, Vec_Int_t *vPiVars, Vec_Int_t *vValues)
#define IFN_INS
DECLARATIONS ///.
struct Ifn_Ntk_t_ Ifn_Ntk_t
#define IF_MAX_FUNC_LUTSIZE
unsigned __int64 word
DECLARATIONS ///.
int Kit_TruthIsop(unsigned *puTruth, int nVars, Vec_Int_t *vMemory, int fTryBoth)
sat_solver * sat_solver_new(void)
int sat_solver_nconflicts(sat_solver *s)
int sat_solver_nclauses(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
int sat_solver_nvars(sat_solver *s)
void sat_solver_delete(sat_solver *s)
word pTtElems[IFN_INS *IFN_WRD]
int pConstr[IFN_INS *IFN_INS]
Ifn_Obj_t Nodes[2 *IFN_INS]
word pTtObjs[2 *IFN_INS *IFN_WRD]
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.