64 unsigned TruthXor, TruthMaj, Truths[3] = { 0xAA, 0xCC, 0xF0 };
65 int k, iObj, fFadd = Vec_IntEntry(vAdds, 6*iBox+2) > 0;
71 for ( k = 0; k < 3; k++ )
73 iObj = Vec_IntEntry( vAdds, 6*iBox+k );
76 pObj = Gia_ManObj(
p, iObj );
77 pObj->
Value = Vec_BitEntry(vPhase, iObj) ? 0xFF & ~Truths[k] : Truths[k];
78 Gia_ObjSetTravIdCurrent(
p, pObj );
81 iObj = Vec_IntEntry( vAdds, 6*iBox+3 );
83 TruthXor = Vec_BitEntry(vPhase, iObj) ? 0xFF & ~TruthXor : TruthXor;
85 iObj = Vec_IntEntry( vAdds, 6*iBox+4 );
87 TruthMaj = Vec_BitEntry(vPhase, iObj) ? 0xFF & ~TruthMaj : TruthMaj;
91 if ( TruthXor != 0x96 )
92 printf(
"Fadd %d sum is wrong.\n", iBox );
93 if ( TruthMaj != 0xE8 )
94 printf(
"Fadd %d carry is wrong.\n", iBox );
98 if ( TruthXor != 0x66 )
99 printf(
"Hadd %d sum is wrong.\n", iBox );
100 if ( TruthMaj != 0x88 )
101 printf(
"Hadd %d carry is wrong.\n", iBox );
124 int k, iBox, iXor, Sign, fXorPhase;
125 assert( pObj != Gia_ManConst0(
p) );
126 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
128 Gia_ObjSetTravIdCurrent(
p, pObj);
130 Vec_BitWriteEntry( vPhase, Gia_ObjId(
p, pObj), fPhase );
131 if ( !Gia_ObjIsAnd(pObj) )
133 iBox = Vec_IntEntry( vMap, Gia_ObjId(
p, pObj) );
136 iXor = Vec_IntEntry( vAdds, 6*iBox+3 );
137 Sign = Vec_IntEntry( vAdds, 6*iBox+5 );
138 fXorPhase = ((Sign >> 3) & 1);
140 if ( Vec_IntEntry(vAdds, 6*iBox+2) == 0 && fPhase )
141 Vec_BitWriteEntry( vConstPhase, iBox, 1 );
142 for ( k = 0; k < 3; k++ )
144 int iObj = Vec_IntEntry( vAdds, 6*iBox+k );
145 int fPhaseThis = ((Sign >> k) & 1) ^ fPhase;
146 fXorPhase ^= fPhaseThis;
149 Pas_ManPhase_rec(
p, vAdds, vMap, Gia_ManObj(
p, iObj), fPhaseThis, vPhase, vConstPhase );
151 Vec_BitWriteEntry( vPhase, iXor, fXorPhase );
155 Vec_Bit_t * vPhase = Vec_BitStart( Vec_IntSize(vMap) );
156 Vec_Bit_t * vConstPhase = Vec_BitStart( Vec_IntSize(vAdds)/6 );
161 *pvConstPhase = vConstPhase;
178 Vec_Bit_t * vUnique = Vec_BitStart( Gia_ManObjNum(
p) );
179 Vec_Bit_t * vUsed = Vec_BitStart( Gia_ManObjNum(
p) );
180 Vec_Int_t * vMap = Vec_IntStartFull( Gia_ManObjNum(
p) );
181 Vec_Int_t * vRoots = Vec_IntAlloc( 100 );
183 int i, k, Entry, nTrees;
188 int Carry = Vec_IntEntry(vAdds, 6*i+4);
189 if ( Vec_BitEntry(vUnique, Carry) )
190 printf(
"Carry %d participates more than once.\n", Carry );
191 Vec_BitWriteEntry( vUnique, Carry, 1 );
192 Vec_IntWriteEntry( vMap, Carry, i );
194 Vec_BitWriteEntry( vUsed, Vec_IntEntry(vAdds, 6*i+0), 1 );
195 Vec_BitWriteEntry( vUsed, Vec_IntEntry(vAdds, 6*i+1), 1 );
196 Vec_BitWriteEntry( vUsed, Vec_IntEntry(vAdds, 6*i+2), 1 );
199 for ( i = 0; i < Gia_ManObjNum(
p); i++ )
200 if ( Vec_BitEntry(vUnique, i) && !Vec_BitEntry(vUsed, i) )
201 Vec_IntPush( vRoots, i );
202 nTrees = Vec_IntSize( vRoots );
204 Vec_IntPrint( vRoots );
207 if ( Vec_IntSize(vRoots) > 0 )
211 vPhase =
Pas_ManPhase(
p, vAdds, vMap, vRoots, &vConstPhase );
214 printf(
"Outputs: " );
216 printf(
"%d(%d) ", Entry, Vec_BitEntry(vPhase, Entry) );
219 printf(
"Inputs: " );
222 printf(
"%d(%d) ", Entry, Vec_BitEntry(vPhase, Entry) );
223 nCompls += Vec_BitEntry(vPhase, Entry);
225 printf(
" Compl = %d\n", nCompls );
227 Vec_BitFreeP( &vPhase );
228 Vec_BitFreeP( &vConstPhase );
231 Vec_IntFree( vRoots );
233 Vec_BitFree( vUnique );
234 Vec_BitFree( vUsed );
257 printf(
"Detected %d FAs and %d HAs. Collected %d adders. ", nFadds, Vec_IntSize(vAdds)/6-nFadds, Vec_IntSize(vOrder) );
258 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
262 Vec_IntFree( vAdds );
263 Vec_IntFree( vOrder );
265 Vec_IntFree( vOuts );
267 printf(
"Detected %d adder trees. ", nTrees );
268 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
Vec_Int_t * Gia_PolynCoreOrder(Gia_Man_t *pGia, Vec_Int_t *vAdds, Vec_Int_t *vAddCos, Vec_Int_t **pvIns, Vec_Int_t **pvOuts)
ITERATORS ///.
Vec_Bit_t * Pas_ManPhase(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Int_t *vMap, Vec_Int_t *vRoots, Vec_Bit_t **pvConstPhase)
void Pas_ManPhase_rec(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Int_t *vMap, Gia_Obj_t *pObj, int fPhase, Vec_Bit_t *vPhase, Vec_Bit_t *vConstPhase)