52 if ( Vec_IntEntry(vMirrors, Node) >= 0 )
53 Obj = Abc_Lit2Var( Vec_IntEntry(vMirrors, Node) );
54 pObj = Gia_ManObj(
p, Obj );
57 assert( Gia_ObjIsAnd(pObj) );
60 if ( Gia_ObjIsXor(pObj) )
61 pObj->
Value = Gia_ManAppendXorReal( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
63 pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
67 Gia_ManObj(
p, Node)->Value = Abc_LitNotCond( pObj->
Value, Abc_LitIsCompl(Vec_IntEntry(vMirrors, Node)) );
77 pNew->
pName = Abc_UtilStrsav(
p->pName );
78 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
79 Gia_ManConst0(
p)->Value = 0;
82 pObj->
Value = Gia_ManAppendCi(pNew);
86 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
105 Vec_Int_t * vRootXorSet = Vec_IntAlloc( Gia_ManCoNum(
p) );
106 Gia_Obj_t * pObj, * pFan0, * pFan1, * pFan00, * pFan01, * pFan10, * pFan11;
107 int i, fXor0, fXor1, fFirstXor = 0;
114 printf(
"XORs do not form a continuous sequence\n" );
115 Vec_IntFreeP( &vRootXorSet );
123 if ( fXor0 == fXor1 )
125 printf(
"Both inputs of top level XOR have XOR/non-XOR\n" );
126 Vec_IntFreeP( &vRootXorSet );
129 Vec_IntPush( vRootXorSet, Gia_ObjId(
p, pObj) );
130 Vec_IntPush( vRootXorSet, fXor1 ? Gia_ObjId(
p, Gia_Regular(pFan0)) : Gia_ObjId(
p, Gia_Regular(pFan1)) );
131 Vec_IntPush( vRootXorSet, fXor1 ? Gia_ObjId(
p, Gia_Regular(pFan10)) : Gia_ObjId(
p, Gia_Regular(pFan00)) );
132 Vec_IntPush( vRootXorSet, fXor1 ? Gia_ObjId(
p, Gia_Regular(pFan11)) : Gia_ObjId(
p, Gia_Regular(pFan01)) );
134 for ( i = 0; 4*i < Vec_IntSize(vRootXorSet); i++ )
136 printf(
"%2d : ", i );
137 printf(
"%4d <- ", Vec_IntEntry(vRootXorSet, 4*i) );
138 printf(
"%4d ", Vec_IntEntry(vRootXorSet, 4*i+1) );
139 printf(
"%4d ", Vec_IntEntry(vRootXorSet, 4*i+2) );
140 printf(
"%4d ", Vec_IntEntry(vRootXorSet, 4*i+3) );
164 return Abc_Var2Lit(Node, 0);
165 pNode = Gia_ManObj(
p, Node );
168 Lit0 = Lit0 == -1 ? Lit0 : Abc_LitNotCond( Lit0, Gia_ObjFaninC0(pNode) );
169 Lit1 = Lit1 == -1 ? Lit1 : Abc_LitNotCond( Lit1, Gia_ObjFaninC1(pNode) );
170 if ( Lit0 == -1 && Lit1 == -1 )
172 assert( Lit0 != -1 || Lit1 != -1 );
173 if ( Lit0 != -1 && Lit1 != -1 )
176 printf(
"Problem for leaf %d\n", Leaf );
179 return Lit0 != -1 ? Lit0 : Lit1;
195 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
197 Gia_ObjSetTravIdCurrent(
p, pObj);
200 Vec_IntPush( vSupp, Gia_ObjId(
p, pObj) );
203 assert( Gia_ObjIsAnd(pObj) );
206 Vec_IntPush( vNods, Gia_ObjId(
p, pObj) );
212 Vec_Int_t * vSupp = Vec_IntAlloc( 100 );
int i, k, Node, Pol;
213 for ( i = 0; 4*i < Vec_IntSize(vRootXorSet); i++ )
215 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+1) )->fMark0 = 1;
216 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+2) )->fMark0 = 1;
217 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+3) )->fMark0 = 1;
219 for ( i = 1; 4*i < Vec_IntSize(vRootXorSet); i++ )
221 Vec_IntClear( vSupp );
224 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+1) )->fMark0 = 0;
226 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+1) )->fMark0 = 1;
228 Vec_IntSort( vSupp, 0 );
230 printf(
"Out %4d : %4d \n", i, Vec_IntEntry(vRootXorSet, 4*i+1) );
231 Vec_IntPrint( vSupp );
238 Vec_IntClear( vPols );
243 printf(
"%d(%d) ", Node, Abc_LitIsCompl(Pol) );
247 Vec_IntPrint( vSupp );
249 for ( i = 0; 4*i < Vec_IntSize(vRootXorSet); i++ )
251 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+1) )->fMark0 = 0;
252 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+2) )->fMark0 = 0;
253 Gia_ManObj(
p, Vec_IntEntry(vRootXorSet, 4*i+3) )->fMark0 = 0;
255 Vec_IntFree( vSupp );
256 Vec_IntFree( vPols );
257 Vec_IntFree( vNods );
274 int i, k, iOr1, iAnd1, iAnd2, pLits[3];
275 Vec_Int_t * vMirrors = Vec_IntStart( Gia_ManObjNum(
p) );
276 for ( i = 0; 4*i < Vec_IntSize(vRootXorSet); i++ )
280 for ( k = 1; k < 3; k++ )
283 iOr1 = Gia_ManAppendOr(
p, pLits[1], pLits[2] );
284 iAnd1 = Gia_ManAppendAnd(
p, pLits[0], iOr1 );
285 iAnd2 = Gia_ManAppendAnd(
p, pLits[1], pLits[2] );
286 pLits[0] = Gia_ManAppendOr(
p, iAnd1, iAnd2 );
287 Vec_IntWriteEntry( vMirrors, Vec_IntEntry(vRootXorSet, 4*i+1), pLits[0] );
291 Vec_IntFree( vMirrors );
325 Vec_IntFree( vRootXorSet );
330 printf(
"Detected %d top XORs. ", Vec_IntSize(vRootXorSet)/4 );
331 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
351 Vec_Int_t * vRes = Vec_IntAlloc( Gia_ManCoNum(
p) + 1 );
353 int i, k, iStart, iLit, Driver, Count = 0;
355 Driver = Gia_ObjFaninId0p(
p, Gia_ManCo(
p, 0) );
357 if ( Abc_Lit2Var(Vec_IntEntry(vLevel,0)) == Driver )
359 assert( iStart < Gia_ManCoNum(
p) );
363 int In[3] = {0}, Out[2];
364 assert( Vec_IntSize(vLevel) > 0 );
365 assert( Vec_IntSize(vLevel) <= 3 );
366 if ( Vec_IntSize(vLevel) == 1 )
368 Vec_IntPush( vRes, Vec_IntEntry(vLevel, 0) );
374 Vec_IntPush( vRes, Out[0] );
375 if ( i+1 < Vec_WecSize(pBox->vRootLits) )
376 Vec_IntPush( Vec_WecEntry(pBox->vRootLits, i+1), Out[1] );
378 Vec_IntPush( Vec_WecPushLevel(pBox->vRootLits), Out[1] );
381 assert( Vec_IntSize(vRes) >= Gia_ManCoNum(
p) );
382 Vec_IntShrink( vRes, Gia_ManCoNum(
p) );
383 printf(
"Added %d adders for replace CLAs. ", Count );
390 assert( Gia_ManCoNum(
p) == Vec_IntSize(vRes) );
393 pNew->
pName = Abc_UtilStrsav(
p->pName );
394 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
396 Gia_ManConst0(
p)->Value = 0;
398 pObj->
Value = Gia_ManAppendCi(pNew);
400 pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
403 int iLit = Vec_IntEntry( vRes, i );
404 Gia_Obj_t * pRepr = Gia_ManObj(
p, Abc_Lit2Var(iLit) );
405 pObj->
Value = Gia_ManAppendCo( pNew, pRepr->
Value );
411 if ( Gia_ObjPhase(pObj) != Gia_ObjPhase(Gia_ManCo(
p, i)) )
412 Gia_ObjFlipFaninC0( pObj );
425 Vec_BitFreeP( &vIgnore );
428 printf(
"Cannot find arithmetic boxes.\n" );
434 Vec_IntFree( vResult );
435 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Gia_Man_t * Acec_ManDerive(Gia_Man_t *p, Vec_Int_t *vMirrors)
void Acec_DetectComputeSuppOne_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp, Vec_Int_t *vNods)
Gia_Man_t * Acec_DetectAdditional(Gia_Man_t *p, int fVerbose)
int Acec_DetectLitPolarity(Gia_Man_t *p, int Node, int Leaf)
Gia_Man_t * Acec_DetectXorBuildNew(Gia_Man_t *p, Vec_Int_t *vRootXorSet)
ABC_NAMESPACE_IMPL_START void Acec_ManDerive_rec(Gia_Man_t *pNew, Gia_Man_t *p, int Node, Vec_Int_t *vMirrors)
DECLARATIONS ///.
Gia_Man_t * Acec_RewriteReplace(Gia_Man_t *p, Vec_Int_t *vRes)
void Acec_DetectComputeSupports(Gia_Man_t *p, Vec_Int_t *vRootXorSet)
Vec_Int_t * Acec_CollectXorTops(Gia_Man_t *p)
Vec_Int_t * Acec_RewriteTop(Gia_Man_t *p, Acec_Box_t *pBox)
Gia_Man_t * Acec_ManDecla(Gia_Man_t *pGia, int fBooth, int fVerbose)
MACRO DEFINITIONS ///.
void Acec_InsertFadd(Gia_Man_t *pNew, int In[3], int Out[2])
Acec_Box_t * Acec_DeriveBox(Gia_Man_t *p, Vec_Bit_t *vIgnore, int fFilterIn, int fFilterOut, int fVerbose)
Vec_Bit_t * Acec_BoothFindPPG(Gia_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Acec_Box_t_ Acec_Box_t
INCLUDES ///.
void Acec_BoxFreeP(Acec_Box_t **ppBox)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
#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
void Gia_ObjPrint(Gia_Man_t *p, Gia_Obj_t *pObj)
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
int Gia_ObjRecognizeExor(Gia_Obj_t *pObj, Gia_Obj_t **ppFan0, Gia_Obj_t **ppFan1)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
void Gia_ManSetPhase(Gia_Man_t *p)
void Gia_ManHashStop(Gia_Man_t *p)
#define Gia_ManForEachCoDriver(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelStart(vGlob, vVec, i, LevelStart)