48 unsigned * pTruth, * pTruth0, * pTruth1;
50 assert( !Gia_IsComplement(pObj) );
51 if ( Vec_IntGetEntry(
p->vTruths, Gia_ObjId(
p, pObj)) != -1 )
52 return (
unsigned *)Vec_IntEntryP( vTruth,
nWords * Vec_IntGetEntry(
p->vTruths, Gia_ObjId(
p, pObj)) );
57 pTruth = Vec_IntFetch( vTruth,
nWords );
59 if ( !Gia_ObjFaninC0(pObj) && !Gia_ObjFaninC1(pObj) )
60 for ( i = 0; i <
nWords; i++ )
61 pTruth[i] = pTruth0[i] & pTruth1[i];
62 else if ( !Gia_ObjFaninC0(pObj) && Gia_ObjFaninC1(pObj) )
63 for ( i = 0; i <
nWords; i++ )
64 pTruth[i] = pTruth0[i] & ~pTruth1[i];
65 else if ( Gia_ObjFaninC0(pObj) && !Gia_ObjFaninC1(pObj) )
66 for ( i = 0; i <
nWords; i++ )
67 pTruth[i] = ~pTruth0[i] & pTruth1[i];
69 for ( i = 0; i <
nWords; i++ )
70 pTruth[i] = ~pTruth0[i] & ~pTruth1[i];
72 Vec_IntSetEntry(
p->vTruths, Gia_ObjId(
p, pObj), Vec_IntSize(vVisited) );
73 Vec_IntPush( vVisited, Gia_ObjId(
p, pObj) );
92 static unsigned uTruths[8][8] = {
93 { 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA },
94 { 0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC },
95 { 0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0 },
96 { 0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00 },
97 { 0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000 },
98 { 0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF },
99 { 0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF },
100 { 0x00000000,0x00000000,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF }
107 nVars = Vec_IntSize( vLeaves );
108 nWords = Abc_TruthWordNum( nVars );
110 if ( Gia_ObjIsConst0( Gia_Regular(pRoot) ) )
112 Vec_IntClear( vTruth );
114 pTruth = Vec_IntFetch( vTruth,
nWords );
115 if ( !Gia_IsComplement(pRoot) )
116 Gia_ManTruthClear( pTruth, nVars );
118 Gia_ManTruthFill( pTruth, nVars );
123 vTtElems = Vec_PtrAllocTruthTables( nVars );
125 Vec_IntClear( vTruth );
126 Vec_IntClear( vVisited );
130 pTruth = Vec_IntFetch( vTruth,
nWords );
133 Gia_ManTruthCopy( pTruth, (
unsigned *)Vec_PtrEntry(vTtElems, i), nVars );
135 Gia_ManTruthCopy( pTruth, uTruths[i], nVars );
137 Vec_IntSetEntry(
p->vTruths, Gia_ObjId(
p, pObj), Vec_IntSize(vVisited) );
138 Vec_IntPush( vVisited, Gia_ObjId(
p, pObj) );
141 Vec_PtrFree( vTtElems );
147 if ( Gia_IsComplement(pRoot) )
148 Gia_ManTruthNot( pTruth, pTruth, nVars );
151 Vec_IntSetEntry(
p->vTruths, Gia_ObjId(
p, pObj), -1 );
173 int i, iFan, nVars, nNodes;
175 Vec_IntClear( vLeaves );
177 Vec_IntPush( vLeaves, iFan );
178 nVars = Vec_IntSize( vLeaves );
183 if ( Gia_ManTruthIsConst0(pTruth, nVars) )
188 if ( Gia_ManTruthIsConst1(pTruth, nVars) )
214 for ( i = nVars + 1; i < nNodes; i++ )
237 Vec_Int_t * vLeaves, * vTruth, * vVisited;
242 pPars->fVerbose = fVerbose;
243 if ( pPars->nVarsMax < 2 )
245 printf(
"Resynthesis is not performed when nodes have less than 2 inputs.\n" );
248 if ( pPars->nVarsMax > 15 )
250 printf(
"Resynthesis is not performed when nodes have more than 15 inputs.\n" );
253 vLeaves = Vec_IntAlloc( 0 );
254 vTruth = Vec_IntAlloc( (1<<16) );
255 vVisited = Vec_IntAlloc( 0 );
259 Gia_ManConst0(
p)->Value = 0;
262 pNew->
pName = Abc_UtilStrsav(
p->pName );
263 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
269 if ( Gia_ObjIsCi(pObj) )
270 pObj->
Value = Gia_ManAppendCi( pNew );
271 else if ( Gia_ObjIsCo(pObj) )
272 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
273 else if ( Gia_ObjIsLut(
p, i) )
283 if ( Gia_ManAndNum(pNew) != Gia_ManAndNum(pTemp) )
284 printf(
"Gia_ManPerformBidec() node count before and after: %6d and %6d.\n", Gia_ManAndNum(pNew), Gia_ManAndNum(pTemp) );
288 Vec_IntFree( vLeaves );
289 Vec_IntFree( vTruth );
290 Vec_IntFree( vVisited );