/**Function************************************************************* Synopsis [Converts graph to BDD.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ DdNode * Dec_GraphDeriveBdd( DdManager * dd, Dec_Graph_t * pGraph ) { DdNode * bFunc, * bFunc0, * bFunc1; Dec_Node_t * pNode; int i; // sanity checks assert( Dec_GraphLeaveNum(pGraph) >= 0 ); assert( Dec_GraphLeaveNum(pGraph) <= pGraph->nSize ); // check for constant function if ( Dec_GraphIsConst(pGraph) ) return Cudd_NotCond( b1, Dec_GraphIsComplement(pGraph) ); // check for a literal if ( Dec_GraphIsVar(pGraph) ) return Cudd_NotCond( Cudd_bddIthVar(dd, Dec_GraphVarInt(pGraph)), Dec_GraphIsComplement(pGraph) ); // assign the elementary variables Dec_GraphForEachLeaf( pGraph, pNode, i ) pNode->pFunc = Cudd_bddIthVar( dd, i ); // compute the function for each internal node Dec_GraphForEachNode( pGraph, pNode, i ) { bFunc0 = Cudd_NotCond( Dec_GraphNode(pGraph, pNode->eEdge0.Node)->pFunc, pNode->eEdge0.fCompl ); bFunc1 = Cudd_NotCond( Dec_GraphNode(pGraph, pNode->eEdge1.Node)->pFunc, pNode->eEdge1.fCompl ); pNode->pFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( pNode->pFunc ); }
ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Converts graph to BDD.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ DdNode * Dec_GraphDeriveBdd( DdManager * dd, Dec_Graph_t * pGraph ) { DdNode * bFunc, * bFunc0, * bFunc1; Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i; // sanity checks assert( Dec_GraphLeaveNum(pGraph) >= 0 ); assert( Dec_GraphLeaveNum(pGraph) <= pGraph->nSize ); // check for constant function if ( Dec_GraphIsConst(pGraph) ) return Cudd_NotCond( b1, Dec_GraphIsComplement(pGraph) ); // check for a literal if ( Dec_GraphIsVar(pGraph) ) return Cudd_NotCond( Cudd_bddIthVar(dd, Dec_GraphVarInt(pGraph)), Dec_GraphIsComplement(pGraph) ); // assign the elementary variables Dec_GraphForEachLeaf( pGraph, pNode, i ) pNode->pFunc = Cudd_bddIthVar( dd, i ); // compute the function for each internal node Dec_GraphForEachNode( pGraph, pNode, i ) { bFunc0 = Cudd_NotCond( Dec_GraphNode(pGraph, pNode->eEdge0.Node)->pFunc, pNode->eEdge0.fCompl ); bFunc1 = Cudd_NotCond( Dec_GraphNode(pGraph, pNode->eEdge1.Node)->pFunc, pNode->eEdge1.fCompl ); pNode->pFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( (DdNode *)pNode->pFunc ); }
/**Function************************************************************* Synopsis [Prints the decomposition graph.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Dec_GraphPrint( FILE * pFile, Dec_Graph_t * pGraph, char * pNamesIn[], char * pNameOut ) { Vec_Ptr_t * vNamesIn = NULL; int LitSizeMax, LitSizeCur, Pos, i; // create the names if not given by the user if ( pNamesIn == NULL ) { vNamesIn = Abc_NodeGetFakeNames( Dec_GraphLeaveNum(pGraph) ); pNamesIn = (char **)vNamesIn->pArray; } if ( pNameOut == NULL ) pNameOut = "F"; // get the size of the longest literal LitSizeMax = 0; for ( i = 0; i < Dec_GraphLeaveNum(pGraph); i++ ) { LitSizeCur = strlen(pNamesIn[i]); if ( LitSizeMax < LitSizeCur ) LitSizeMax = LitSizeCur; } if ( LitSizeMax > 50 ) LitSizeMax = 20; // write the decomposition graph (factored form) if ( Dec_GraphIsConst(pGraph) ) // constant { Pos = Dec_GraphPrintOutputName( pFile, pNameOut, 0 ); fprintf( pFile, "Constant %d", !Dec_GraphIsComplement(pGraph) ); } else if ( Dec_GraphIsVar(pGraph) ) // literal { Pos = Dec_GraphPrintOutputName( pFile, pNameOut, 0 ); Dec_GraphPrintGetLeafName( pFile, Dec_GraphVarInt(pGraph), Dec_GraphIsComplement(pGraph), pNamesIn ); } else { Pos = Dec_GraphPrintOutputName( pFile, pNameOut, Dec_GraphIsComplement(pGraph) ); Dec_GraphPrint_rec( pFile, pGraph, Dec_GraphNodeLast(pGraph), 0, pNamesIn, &Pos, LitSizeMax ); } fprintf( pFile, "\n" ); if ( vNamesIn ) Abc_NodeFreeNames( vNamesIn ); }
ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Create GIA for SOP.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Gia_ManGraphToAig( Gia_Man_t * p, Dec_Graph_t * pGraph ) { Dec_Node_t * pNode = NULL; // Suppress "might be used uninitialized" int i, iAnd0, iAnd1; // check for constant function if ( Dec_GraphIsConst(pGraph) ) return Abc_LitNotCond( 1, Dec_GraphIsComplement(pGraph) ); // check for a literal if ( Dec_GraphIsVar(pGraph) ) return Abc_LitNotCond( Dec_GraphVar(pGraph)->iFunc, Dec_GraphIsComplement(pGraph) ); // build the AIG nodes corresponding to the AND gates of the graph Dec_GraphForEachNode( pGraph, pNode, i ) { iAnd0 = Abc_LitNotCond( Dec_GraphNode(pGraph, pNode->eEdge0.Node)->iFunc, pNode->eEdge0.fCompl ); iAnd1 = Abc_LitNotCond( Dec_GraphNode(pGraph, pNode->eEdge1.Node)->iFunc, pNode->eEdge1.fCompl ); pNode->iFunc = Gia_ManHashAnd( p, iAnd0, iAnd1 ); }