53 if ( Vec_IntSize(vResub) == 1 )
54 return Vec_IntEntryLast(vResub) >= 2;
55 return Vec_IntEntryLast(vResub)/2 - Vec_IntSize(vResub)/2 - 1;
59 assert( iNode >= 0 && nVars <= 6 );
61 return s_Truths6[iNode];
64 int iLit0 = Vec_IntEntry( vResub, Abc_Var2Lit(iNode-nVars, 0) );
65 int iLit1 = Vec_IntEntry( vResub, Abc_Var2Lit(iNode-nVars, 1) );
68 Res0 = Abc_LitIsCompl(iLit0) ? ~Res0 : Res0;
69 Res1 = Abc_LitIsCompl(iLit1) ? ~Res1 : Res1;
70 return iLit0 > iLit1 ? Res0 ^ Res1 : Res0 & Res1;
76 int iRoot = Vec_IntEntryLast(vResub);
78 return iRoot ? ~(
word)0 : 0;
79 assert( iRoot != 2 && iRoot != 3 );
81 return Abc_LitIsCompl(iRoot) ? ~Res : Res;
97 int nTtWords = Abc_Truth6WordNum(Vec_IntSize(vSet));
98 int nFuncs = Vec_WrdSize(vIsfs) / 2 /
nWords;
99 Vec_Wrd_t * vRes = Vec_WrdStart( 2 * nFuncs * nTtWords );
101 int i, f, m, iObj;
word Func;
102 assert( Vec_IntSize(vSet) <= 64 );
104 Abc_TtCopy( Vec_WrdEntryP(vIn, i*
nWords), Vec_WrdEntryP(vSims, Vec_IntEntry(vCands, iObj)*
nWords),
nWords, 0 );
105 vOut = Vec_WrdStart( Vec_WrdSize(vIn) );
107 for ( f = 0; f < nFuncs; f++ )
109 word * pIsf[2] = { Vec_WrdEntryP(vIsfs, (2*f+0)*
nWords),
110 Vec_WrdEntryP(vIsfs, (2*f+1)*
nWords) };
111 word * pTruth[2] = { Vec_WrdEntryP(vRes, (2*f+0)*nTtWords),
112 Vec_WrdEntryP(vRes, (2*f+1)*nTtWords) };
113 for ( m = 0; m < 64*
nWords; m++ )
115 int iMint = (int)Vec_WrdEntry(vOut, m);
116 int Value0 = Abc_TtGetBit( pIsf[0], m );
117 int Value1 = Abc_TtGetBit( pIsf[1], m );
118 if ( !Value0 && !Value1 )
120 if ( Value0 && Value1 )
121 printf(
"Internal error: Onset and Offset overlap.\n" );
122 assert( !Value0 || !Value1 );
123 Abc_TtSetBit( pTruth[Value1], iMint );
125 if ( Abc_TtCountOnesVecMask(pTruth[0], pTruth[1], nTtWords, 0) )
126 printf(
"Verification for function %d failed for %d minterm pairs.\n", f,
127 Abc_TtCountOnesVecMask(pTruth[0], pTruth[1], nTtWords, 0) );
129 if ( Vec_IntSize(vSet) < 6 )
131 Vec_WrdWriteEntry( vRes, i, Abc_Tt6Stretch(Func, Vec_IntSize(vSet)) );
151 int nTtWords = Abc_Truth6WordNum(nVars);
152 int v, nFuncs = Vec_WrdSize(vTruths) / 2 / nTtWords;
153 Vec_Wrd_t * vElems = Vec_WrdStartTruthTables( nVars );
154 Vec_Ptr_t * vDivs = Vec_PtrAlloc( 2 + nVars );
155 assert( Vec_WrdSize(vElems) == nTtWords * nVars );
157 Vec_PtrPush( vDivs, Vec_WrdEntryP(vTruths, (2*0+0)*nTtWords) );
158 Vec_PtrPush( vDivs, Vec_WrdEntryP(vTruths, (2*0+1)*nTtWords) );
159 for ( v = 0; v < nVars; v++ )
160 Vec_PtrPush( vDivs, Vec_WrdEntryP(vElems, v*nTtWords) );
161 vResub =
Gia_ManResubOne( vDivs, nTtWords, 30, 100, 0, 0, 0, fVerbose, NULL, 0 );
162 Vec_PtrFree( vDivs );
163 Vec_WrdFree( vElems );
164 nNodes = Vec_IntSize(vResub) ? Vec_IntSize(vResub)/2 : 999;
165 Vec_IntFree( vResub );
171 int nTtWords = Abc_Truth6WordNum(nVars);
172 int v, nFuncs = Vec_WrdSize(vTruths) / 2 / nTtWords;
173 Vec_Wrd_t * vElems = Vec_WrdStartTruthTables( nVars );
174 Vec_Ptr_t * vDivs = Vec_PtrAlloc( 2 + nVars );
175 assert( Vec_WrdSize(vElems) == nTtWords * nVars );
177 Vec_PtrPush( vDivs, Vec_WrdEntryP(vTruths, (2*0+0)*nTtWords) );
178 Vec_PtrPush( vDivs, Vec_WrdEntryP(vTruths, (2*0+1)*nTtWords) );
179 for ( v = 0; v < nVars; v++ )
180 Vec_PtrPush( vDivs, Vec_WrdEntryP(vElems, v*nTtWords) );
181 vResub =
Gia_ManResubOne( vDivs, nTtWords, 30, 100, 0, 0, 0, 0, NULL, 0 );
182 Vec_PtrFree( vDivs );
183 Vec_WrdFree( vElems );
189 int nNodes, nTtWords = Abc_Truth6WordNum(nVars);
190 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
191 Vec_WrdEntryP(vTruths, 1*nTtWords) };
192 Abc_TtOr( pTruth[0], pTruth[0], pTruth[1], nTtWords );
194 Abc_TtSharp( pTruth[0], pTruth[0], pTruth[1], nTtWords );
200 int nTtWords = Abc_Truth6WordNum(nVars);
201 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
202 Vec_WrdEntryP(vTruths, 1*nTtWords) };
203 Abc_TtOr( pTruth[0], pTruth[0], pTruth[1], nTtWords );
205 Abc_TtSharp( pTruth[0], pTruth[0], pTruth[1], nTtWords );
211 int nTtWords = Abc_Truth6WordNum(nVars);
212 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
213 Vec_WrdEntryP(vTruths, 1*nTtWords) };
214 int nNodes =
Kit_IsopNodeNum( (
unsigned *)pTruth[0], (
unsigned *)pTruth[1], nVars, NULL );
220 int nTtWords = Abc_Truth6WordNum(nVars);
221 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
222 Vec_WrdEntryP(vTruths, 1*nTtWords) };
223 vRes =
Kit_IsopResub( (
unsigned *)pTruth[0], (
unsigned *)pTruth[1], nVars, NULL );
230 int nTtWords = Abc_Truth6WordNum(nVars);
231 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
232 Vec_WrdEntryP(vTruths, 1*nTtWords) };
235 Abc_TtOr( pTruth[1], pTruth[1], pTruth[0], nTtWords );
236 Abc_TtNot( pTruth[0], nTtWords );
238 Abc_TtNot( pTruth[0], nTtWords );
239 Abc_TtSharp( pTruth[1], pTruth[1], pTruth[0], nTtWords );
241 nNodes = Gia_ManAndNum(pGia);
250 int nTtWords = Abc_Truth6WordNum(nVars);
251 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
252 Vec_WrdEntryP(vTruths, 1*nTtWords) };
255 Abc_TtOr( pTruth[1], pTruth[1], pTruth[0], nTtWords );
256 Abc_TtNot( pTruth[0], nTtWords );
258 Abc_TtNot( pTruth[0], nTtWords );
259 Abc_TtSharp( pTruth[1], pTruth[1], pTruth[0], nTtWords );
280 int nTtWords = Vec_WrdSize(vTruths)/2, nVars = Vec_IntSize(vSet);
281 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
282 Vec_WrdEntryP(vTruths, 1*nTtWords) };
286 int nNodesBdd = nVars > 2 ?
Gia_ManCountBdd( vTruths, nVars, 0 ) : 999;
287 int nNodesMin = Abc_MinInt( Abc_MinInt(nNodesResub, nNodesBidec), Abc_MinInt(nNodesIsop, nNodesBdd) );
290 printf(
"Size = %2d ", nVars );
291 printf(
"Resub =%3d ", nNodesResub );
292 printf(
"Bidec =%3d ", nNodesBidec );
293 printf(
"Isop =%3d ", nNodesIsop );
294 printf(
"Bdd =%3d ", nNodesBdd );
295 Abc_TtIsfPrint( pTruth[0], pTruth[1], nTtWords );
305 Vec_WrdFree( vTruths );
306 if ( nNodesMin > 500 )
308 if ( nNodesMin == nNodesResub )
309 return (nNodesMin << 2) | 0;
310 if ( nNodesMin == nNodesBidec )
311 return (nNodesMin << 2) | 1;
312 if ( nNodesMin == nNodesIsop )
313 return (nNodesMin << 2) | 2;
314 if ( nNodesMin == nNodesBdd )
315 return (nNodesMin << 2) | 3;
322 int nTtWords = Vec_WrdSize(vTruths)/2, nVars = Vec_IntSize(vSet);
323 word * pTruth[2] = { Vec_WrdEntryP(vTruths, 0*nTtWords),
324 Vec_WrdEntryP(vTruths, 1*nTtWords) };
327 else if ( Type == 1 )
329 else if ( Type == 2 )
331 else if ( Type == 3 )
336 assert( !(Func & pTruth[0][0]) );
337 assert( !(pTruth[1][0] & ~Func) );
339 Vec_WrdFree( vTruths );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Vec_Int_t * Bdc_ManBidecResub(word *pFunc, word *pCare, int nVars)
int Bdc_ManBidecNodeNum(word *pFunc, word *pCare, int nVars, int fVerbose)
int Gia_ManCountBidec(Vec_Wrd_t *vTruths, int nVars, int fVerbose)
Vec_Int_t * Gia_ManDeriveBidec(Vec_Wrd_t *vTruths, int nVars)
word Gia_ResubToTruth6(Vec_Int_t *vResub)
Vec_Int_t * Gia_ManDeriveSolutionOne(Gia_Man_t *p, Vec_Wrd_t *vSims, Vec_Wrd_t *vIsfs, Vec_Int_t *vCands, Vec_Int_t *vSet, int nWords, int Type)
word Gia_ResubToTruth6_rec(Vec_Int_t *vResub, int iNode, int nVars)
int Gia_ResubVarNum(Vec_Int_t *vResub)
FUNCTION DEFINITIONS ///.
int Gia_ManCountIsop(Vec_Wrd_t *vTruths, int nVars, int fVerbose)
Vec_Int_t * Gia_ManResubOne(Vec_Ptr_t *vDivs, int nWords, int nLimit, int nDivsMax, int iChoice, int fUseXor, int fDebug, int fVerbose, word *pFunc, int Depth)
Vec_Wrd_t * Gia_ManDeriveTruths(Gia_Man_t *p, Vec_Wrd_t *vSims, Vec_Wrd_t *vIsfs, Vec_Int_t *vCands, Vec_Int_t *vSet, int nWords)
Vec_Int_t * Gia_ManDeriveBdd(Vec_Wrd_t *vTruths, int nVars)
int Gia_ManEvalSolutionOne(Gia_Man_t *p, Vec_Wrd_t *vSims, Vec_Wrd_t *vIsfs, Vec_Int_t *vCands, Vec_Int_t *vSet, int nWords, int fVerbose)
Vec_Int_t * Gia_ManDeriveResub(Vec_Wrd_t *vTruths, int nVars)
int Gia_ManCountResub(Vec_Wrd_t *vTruths, int nVars, int fVerbose)
Vec_Int_t * Gia_ManDeriveIsop(Vec_Wrd_t *vTruths, int nVars)
int Gia_ManCountBdd(Vec_Wrd_t *vTruths, int nVars, int fVerbose)
ABC_NAMESPACE_IMPL_START void Extra_BitMatrixTransposeP(Vec_Wrd_t *vSimsIn, int nWordsIn, Vec_Wrd_t *vSimsOut, int nWordsOut)
DECLARATIONS ///.
Gia_Man_t * Gia_TryPermOptNew(word *pTruths, int nIns, int nOuts, int nWords, int nRounds, int fVerbose)
Vec_Int_t * Gia_ManToGates(Gia_Man_t *p)
void Extra_PrintHex(FILE *pFile, unsigned *pTruth, int nVars)
void Gia_ManStop(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
unsigned __int64 word
DECLARATIONS ///.
Vec_Int_t * Kit_IsopResub(unsigned *pTruth0, unsigned *pTruth1, int nVars, Vec_Int_t *vMemory)
int Kit_IsopNodeNum(unsigned *pTruth0, unsigned *pTruth1, int nVars, Vec_Int_t *vMemory)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.