/**CFile**************************************************************** FileName [hopCheck.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Minimalistic And-Inverter Graph package.] Synopsis [AIG checking procedures.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - May 11, 2006.] Revision [$Id: hopCheck.c,v 1.00 2006/05/11 00:00:00 alanmi Exp $] ***********************************************************************/ #include "hop.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Checks the consistency of the AIG manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Hop_ManCheck( Hop_Man_t * p ) { Hop_Obj_t * pObj, * pObj2; int i; // check primary inputs Hop_ManForEachPi( p, pObj, i ) { if ( Hop_ObjFanin0(pObj) || Hop_ObjFanin1(pObj) ) { printf( "Hop_ManCheck: The PI node \"%p\" has fanins.\n", pObj ); return 0; } } // check primary outputs Hop_ManForEachPo( p, pObj, i ) { if ( !Hop_ObjFanin0(pObj) ) { printf( "Hop_ManCheck: The PO node \"%p\" has NULL fanin.\n", pObj ); return 0; } if ( Hop_ObjFanin1(pObj) ) { printf( "Hop_ManCheck: The PO node \"%p\" has second fanin.\n", pObj ); return 0; } } // check internal nodes Hop_ManForEachNode( p, pObj, i ) { if ( !Hop_ObjFanin0(pObj) || !Hop_ObjFanin1(pObj) ) { printf( "Hop_ManCheck: The AIG has internal node \"%p\" with a NULL fanin.\n", pObj ); return 0; } if ( Hop_ObjFanin0(pObj)->Id >= Hop_ObjFanin1(pObj)->Id ) { printf( "Hop_ManCheck: The AIG has node \"%p\" with a wrong ordering of fanins.\n", pObj ); return 0; } pObj2 = Hop_TableLookup( p, pObj ); if ( pObj2 != pObj ) { printf( "Hop_ManCheck: Node \"%p\" is not in the structural hashing table.\n", pObj ); return 0; } } // count the total number of nodes if ( Hop_ManObjNum(p) != 1 + Hop_ManPiNum(p) + Hop_ManPoNum(p) + Hop_ManAndNum(p) + Hop_ManExorNum(p) ) { printf( "Hop_ManCheck: The number of created nodes is wrong.\n" ); return 0; } // count the number of nodes in the table if ( Hop_TableCountEntries(p) != Hop_ManAndNum(p) + Hop_ManExorNum(p) ) { printf( "Hop_ManCheck: The number of nodes in the structural hashing table is wrong.\n" ); return 0; } // if ( !Hop_ManIsAcyclic(p) ) // return 0; return 1; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END