/**CFile**************************************************************** FileName [acecBo.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [CEC for arithmetic circuits.] Synopsis [Core procedures.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: acecBo.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "acecInt.h" #include "misc/vec/vecWec.h" #include "misc/extra/extra.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Acec_DetectBoothXorMux( Gia_Man_t * p, Gia_Obj_t * pMux, Gia_Obj_t * pXor, int pIns[3] ) { Gia_Obj_t * pFan0, * pFan1; Gia_Obj_t * pDat0, * pDat1, * pCtrl; if ( !Gia_ObjIsMuxType(pMux) || !Gia_ObjIsMuxType(pXor) ) return 0; if ( !Gia_ObjRecognizeExor( pXor, &pFan0, &pFan1 ) ) return 0; pFan0 = Gia_Regular(pFan0); pFan1 = Gia_Regular(pFan1); if ( Gia_ObjId(p, pFan0) > Gia_ObjId(p, pFan1) ) ABC_SWAP( Gia_Obj_t *, pFan0, pFan1 ); if ( !(pCtrl = Gia_ObjRecognizeMux( pMux, &pDat0, &pDat1 )) ) return 0; pDat0 = Gia_Regular(pDat0); pDat1 = Gia_Regular(pDat1); pCtrl = Gia_Regular(pCtrl); if ( !Gia_ObjIsAnd(pDat0) || !Gia_ObjIsAnd(pDat1) ) return 0; if ( Gia_ObjFaninId0p(p, pDat0) != Gia_ObjFaninId0p(p, pDat1) || Gia_ObjFaninId1p(p, pDat0) != Gia_ObjFaninId1p(p, pDat1) ) return 0; if ( Gia_ObjFaninId0p(p, pDat0) != Gia_ObjId(p, pFan0) || Gia_ObjFaninId1p(p, pDat0) != Gia_ObjId(p, pFan1) ) return 0; pIns[0] = Gia_ObjId(p, pFan0); pIns[1] = Gia_ObjId(p, pFan1); pIns[2] = Gia_ObjId(p, pCtrl); return 1; } int Acec_DetectBoothXorFanin( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] ) { Gia_Obj_t * pFan0, * pFan1; //int Id = Gia_ObjId(p, pObj); if ( !Gia_ObjIsAnd(pObj) ) return 0; if ( !Gia_ObjFaninC0(pObj) || !Gia_ObjFaninC1(pObj) ) return 0; pFan0 = Gia_ObjFanin0(pObj); pFan1 = Gia_ObjFanin1(pObj); if ( !Gia_ObjIsAnd(pFan0) || !Gia_ObjIsAnd(pFan1) ) return 0; if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin0(pFan0), Gia_ObjFanin0(pFan1), pIns) ) { pIns[3] = Gia_ObjId(p, Gia_ObjFanin1(pFan0)); pIns[4] = Gia_ObjId(p, Gia_ObjFanin1(pFan1)); return 1; } if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin0(pFan0), Gia_ObjFanin1(pFan1), pIns) ) { pIns[3] = Gia_ObjId(p, Gia_ObjFanin1(pFan0)); pIns[4] = Gia_ObjId(p, Gia_ObjFanin0(pFan1)); return 1; } if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin1(pFan0), Gia_ObjFanin0(pFan1), pIns) ) { pIns[3] = Gia_ObjId(p, Gia_ObjFanin0(pFan0)); pIns[4] = Gia_ObjId(p, Gia_ObjFanin1(pFan1)); return 1; } if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin1(pFan0), Gia_ObjFanin1(pFan1), pIns) ) { pIns[3] = Gia_ObjId(p, Gia_ObjFanin0(pFan0)); pIns[4] = Gia_ObjId(p, Gia_ObjFanin0(pFan1)); return 1; } return 0; } int Acec_DetectBoothOne( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] ) { Gia_Obj_t * pFan0, * pFan1; if ( !Gia_ObjRecognizeExor( pObj, &pFan0, &pFan1 ) ) return 0; pFan0 = Gia_Regular(pFan0); pFan1 = Gia_Regular(pFan1); if ( Acec_DetectBoothXorFanin( p, pFan0, pIns ) && pIns[2] == Gia_ObjId(p, pFan1) ) return 1; if ( Acec_DetectBoothXorFanin( p, pFan1, pIns ) && pIns[2] == Gia_ObjId(p, pFan0) ) return 1; return 0; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Acec_DetectBoothTwoXor( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] ) { Gia_Obj_t * pFan0, * pFan1; if ( !Gia_ObjIsAnd(pObj) ) return 0; if ( Gia_ObjRecognizeExor( Gia_ObjFanin0(pObj), &pFan0, &pFan1 ) ) { pIns[0] = Gia_ObjId(p, Gia_Regular(pFan0)); pIns[1] = Gia_ObjId(p, Gia_Regular(pFan1)); pIns[2] = -1; pIns[3] = 0; pIns[4] = Gia_ObjId(p, Gia_ObjFanin1(pObj)); return 1; } if ( Gia_ObjRecognizeExor( Gia_ObjFanin1(pObj), &pFan0, &pFan1 ) ) { pIns[0] = Gia_ObjId(p, Gia_Regular(pFan0)); pIns[1] = Gia_ObjId(p, Gia_Regular(pFan1)); pIns[2] = -1; pIns[3] = 0; pIns[4] = Gia_ObjId(p, Gia_ObjFanin0(pObj)); return 1; } return 0; } int Acec_DetectBoothTwo( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] ) { Gia_Obj_t * pFan0, * pFan1; if ( !Gia_ObjRecognizeExor( pObj, &pFan0, &pFan1 ) ) return 0; pFan0 = Gia_Regular(pFan0); pFan1 = Gia_Regular(pFan1); if ( Acec_DetectBoothTwoXor( p, pFan0, pIns ) ) { pIns[2] = Gia_ObjId(p, pFan1); return 1; } if ( Acec_DetectBoothTwoXor( p, pFan1, pIns ) ) { pIns[2] = Gia_ObjId(p, pFan0); return 1; } return 0; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Acec_DetectBoothTest( Gia_Man_t * p ) { Gia_Obj_t * pObj; int i, pIns[5]; Gia_ManForEachAnd( p, pObj, i ) { if ( !Acec_DetectBoothOne(p, pObj, pIns) && !Acec_DetectBoothTwo(p, pObj, pIns) ) continue; printf( "obj = %4d : b0 = %4d b1 = %4d b2 = %4d a0 = %4d a1 = %4d\n", i, pIns[0], pIns[1], pIns[2], pIns[3], pIns[4] ); } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END