| /**CFile**************************************************************** |
| |
| FileName [decPrint.c] |
| |
| PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] |
| |
| Synopsis [Procedures to print the decomposition graphs (factored forms).] |
| |
| Author [MVSIS Group] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - February 1, 2003.] |
| |
| Revision [$Id: decPrint.c,v 1.1 2003/05/22 19:20:05 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "base/abc/abc.h" |
| #include "dec.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| static void Dec_GraphPrint_rec( FILE * pFile, Dec_Graph_t * pGraph, Dec_Node_t * pNode, int fCompl, char * pNamesIn[], int * pPos, int LitSizeMax ); |
| static int Dec_GraphPrintGetLeafName( FILE * pFile, int iLeaf, int fCompl, char * pNamesIn[] ); |
| static void Dec_GraphPrintUpdatePos( FILE * pFile, int * pPos, int LitSizeMax ); |
| static int Dec_GraphPrintOutputName( FILE * pFile, char * pNameOut ); |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**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 ); |
| fprintf( pFile, "Constant %d", !Dec_GraphIsComplement(pGraph) ); |
| } |
| else if ( Dec_GraphIsVar(pGraph) ) // literal |
| { |
| Pos = Dec_GraphPrintOutputName( pFile, pNameOut ); |
| Dec_GraphPrintGetLeafName( pFile, Dec_GraphVarInt(pGraph), Dec_GraphIsComplement(pGraph), pNamesIn ); |
| } |
| else |
| { |
| Pos = Dec_GraphPrintOutputName( pFile, pNameOut ); |
| Dec_GraphPrint_rec( pFile, pGraph, Dec_GraphNodeLast(pGraph), Dec_GraphIsComplement(pGraph), pNamesIn, &Pos, LitSizeMax ); |
| } |
| fprintf( pFile, "\n" ); |
| |
| if ( vNamesIn ) |
| Abc_NodeFreeNames( vNamesIn ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dec_GraphPrint2_rec( FILE * pFile, Dec_Graph_t * pGraph, Dec_Node_t * pNode, int fCompl, char * pNamesIn[], int * pPos, int LitSizeMax ) |
| { |
| Dec_Node_t * pNode0, * pNode1; |
| pNode0 = Dec_GraphNode(pGraph, pNode->eEdge0.Node); |
| pNode1 = Dec_GraphNode(pGraph, pNode->eEdge1.Node); |
| if ( Dec_GraphNodeIsVar(pGraph, pNode) ) // FT_NODE_LEAF ) |
| { |
| (*pPos) += Dec_GraphPrintGetLeafName( pFile, Dec_GraphNodeInt(pGraph,pNode), fCompl, pNamesIn ); |
| return; |
| } |
| if ( !pNode->fNodeOr ) // FT_NODE_AND ) |
| { |
| if ( !pNode0->fNodeOr ) // != FT_NODE_OR ) |
| Dec_GraphPrint_rec( pFile, pGraph, pNode0, pNode->fCompl0, pNamesIn, pPos, LitSizeMax ); |
| else |
| { |
| fprintf( pFile, "(" ); |
| (*pPos)++; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode0, pNode->fCompl0, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, ")" ); |
| (*pPos)++; |
| } |
| fprintf( pFile, " " ); |
| (*pPos)++; |
| |
| Dec_GraphPrintUpdatePos( pFile, pPos, LitSizeMax ); |
| |
| if ( !pNode1->fNodeOr ) // != FT_NODE_OR ) |
| Dec_GraphPrint_rec( pFile, pGraph, pNode1, pNode->fCompl1, pNamesIn, pPos, LitSizeMax ); |
| else |
| { |
| fprintf( pFile, "(" ); |
| (*pPos)++; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode1, pNode->fCompl1, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, ")" ); |
| (*pPos)++; |
| } |
| return; |
| } |
| if ( pNode->fNodeOr ) // FT_NODE_OR ) |
| { |
| Dec_GraphPrint_rec( pFile, pGraph, pNode0, pNode->fCompl0, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, " + " ); |
| (*pPos) += 3; |
| |
| Dec_GraphPrintUpdatePos( pFile, pPos, LitSizeMax ); |
| |
| Dec_GraphPrint_rec( pFile, pGraph, pNode1, pNode->fCompl1, pNamesIn, pPos, LitSizeMax ); |
| return; |
| } |
| assert( 0 ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dec_GraphPrint_rec( FILE * pFile, Dec_Graph_t * pGraph, Dec_Node_t * pNode, int fCompl, char * pNamesIn[], int * pPos, int LitSizeMax ) |
| { |
| Dec_Node_t * pNode0, * pNode1; |
| Dec_Node_t * pNode00, * pNode01, * pNode10, * pNode11; |
| pNode0 = Dec_GraphNode(pGraph, pNode->eEdge0.Node); |
| pNode1 = Dec_GraphNode(pGraph, pNode->eEdge1.Node); |
| if ( Dec_GraphNodeIsVar(pGraph, pNode) ) // FT_NODE_LEAF ) |
| { |
| (*pPos) += Dec_GraphPrintGetLeafName( pFile, Dec_GraphNodeInt(pGraph,pNode), fCompl, pNamesIn ); |
| return; |
| } |
| if ( !Dec_GraphNodeIsVar(pGraph, pNode0) && !Dec_GraphNodeIsVar(pGraph, pNode1) ) |
| { |
| pNode00 = Dec_GraphNode(pGraph, pNode0->eEdge0.Node); |
| pNode01 = Dec_GraphNode(pGraph, pNode0->eEdge1.Node); |
| pNode10 = Dec_GraphNode(pGraph, pNode1->eEdge0.Node); |
| pNode11 = Dec_GraphNode(pGraph, pNode1->eEdge1.Node); |
| if ( (pNode00 == pNode10 || pNode00 == pNode11) && (pNode01 == pNode10 || pNode01 == pNode11) ) |
| { |
| fprintf( pFile, "(" ); |
| (*pPos)++; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode00, pNode00->fCompl0, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, " # " ); |
| (*pPos) += 3; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode01, pNode01->fCompl1, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, ")" ); |
| (*pPos)++; |
| return; |
| } |
| } |
| if ( fCompl ) |
| { |
| fprintf( pFile, "(" ); |
| (*pPos)++; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode0, !pNode->eEdge0.fCompl, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, " + " ); |
| (*pPos) += 3; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode1, !pNode->eEdge1.fCompl, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, ")" ); |
| (*pPos)++; |
| } |
| else |
| { |
| fprintf( pFile, "(" ); |
| (*pPos)++; |
| Dec_GraphPrint_rec( pFile, pGraph, pNode0, pNode->eEdge0.fCompl, pNamesIn, pPos, LitSizeMax ); |
| Dec_GraphPrint_rec( pFile, pGraph, pNode1, pNode->eEdge1.fCompl, pNamesIn, pPos, LitSizeMax ); |
| fprintf( pFile, ")" ); |
| (*pPos)++; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Dec_GraphPrintGetLeafName( FILE * pFile, int iLeaf, int fCompl, char * pNamesIn[] ) |
| { |
| static char Buffer[100]; |
| sprintf( Buffer, "%s%s", fCompl? "!" : "", pNamesIn[iLeaf] ); |
| fprintf( pFile, "%s", Buffer ); |
| return strlen( Buffer ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Dec_GraphPrintUpdatePos( FILE * pFile, int * pPos, int LitSizeMax ) |
| { |
| int i; |
| if ( *pPos + LitSizeMax < 77 ) |
| return; |
| fprintf( pFile, "\n" ); |
| for ( i = 0; i < 10; i++ ) |
| fprintf( pFile, " " ); |
| *pPos = 10; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Starts the printout for a decomposition graph.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Dec_GraphPrintOutputName( FILE * pFile, char * pNameOut ) |
| { |
| if ( pNameOut == NULL ) |
| return 0; |
| fprintf( pFile, "%6s = ", pNameOut ); |
| return 10; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |