/**CFile**************************************************************** FileName [dchAig.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Choice computation for tech-mapping.] Synopsis [AIG manipulation.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 29, 2008.] Revision [$Id: dchAig.c,v 1.00 2008/07/29 00:00:00 alanmi Exp $] ***********************************************************************/ #include "dchInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Derives the cumulative AIG.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Dch_DeriveTotalAig_rec( Aig_Man_t * p, Aig_Obj_t * pObj ) { if ( pObj->pData ) return; Dch_DeriveTotalAig_rec( p, Aig_ObjFanin0(pObj) ); Dch_DeriveTotalAig_rec( p, Aig_ObjFanin1(pObj) ); pObj->pData = Aig_And( p, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); } /**Function************************************************************* Synopsis [Derives the cumulative AIG.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Aig_Man_t * Dch_DeriveTotalAig( Vec_Ptr_t * vAigs ) { Aig_Man_t * pAig, * pAig2, * pAigTotal; Aig_Obj_t * pObj, * pObjPi, * pObjPo; int i, k, nNodes; assert( Vec_PtrSize(vAigs) > 0 ); // make sure they have the same number of PIs/POs nNodes = 0; pAig = (Aig_Man_t *)Vec_PtrEntry( vAigs, 0 ); Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pAig2, i ) { assert( Aig_ManCiNum(pAig) == Aig_ManCiNum(pAig2) ); assert( Aig_ManCoNum(pAig) == Aig_ManCoNum(pAig2) ); nNodes += Aig_ManNodeNum(pAig2); Aig_ManCleanData( pAig2 ); } // map constant nodes pAigTotal = Aig_ManStart( nNodes ); Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pAig2, k ) Aig_ManConst1(pAig2)->pData = Aig_ManConst1(pAigTotal); // map primary inputs Aig_ManForEachCi( pAig, pObj, i ) { pObjPi = Aig_ObjCreateCi( pAigTotal ); Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pAig2, k ) Aig_ManCi( pAig2, i )->pData = pObjPi; } // construct the AIG in the order of POs Aig_ManForEachCo( pAig, pObj, i ) { Vec_PtrForEachEntry( Aig_Man_t *, vAigs, pAig2, k ) { pObjPo = Aig_ManCo( pAig2, i ); Dch_DeriveTotalAig_rec( pAigTotal, Aig_ObjFanin0(pObjPo) ); } Aig_ObjCreateCo( pAigTotal, Aig_ObjChild0Copy(pObj) ); } /* // mark the cone of the first AIG Aig_ManIncrementTravId( pAigTotal ); Aig_ManForEachObj( pAig, pObj, i ) if ( pObj->pData ) Aig_ObjSetTravIdCurrent( pAigTotal, pObj->pData ); */ // cleanup should not be done return pAigTotal; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END