⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbdfs.c

📁 主要进行大规模的电路综合
💻 C
字号:
/**CFile****************************************************************  FileName    [cbDfs.c]  PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]  Synopsis    [DFS traversal and levelization]  Author      [MVSIS Group]    Affiliation [UC Berkeley]  Date        [Ver. 1.0. Started - February 1, 2003.]  Revision    [$Id: cbDfs.c,v 1.2 2003/05/27 23:14:44 alanmi Exp $]***********************************************************************/#include "cb.h"///////////////////////////////////////////////////////////////////////////                        DECLARATIONS                              ///////////////////////////////////////////////////////////////////////////static void CbGraphDfsFromRoot_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV,                                    Cb_Vertex_t ***pppTail, bool fPreTrav );static void CbGraphDfsFromLeaf_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV,                                    Cb_Vertex_t ***pppTail, bool fPreTrav );static int CbGraphLevelizeFromRoot_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV, Cb_Vertex_t **ppLevels);static int CbGraphLevelizeFromLeaf_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV, Cb_Vertex_t **ppLevels);static int CbGraphGetLevelNum_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV );///////////////////////////////////////////////////////////////////////////                     FUNCTION DEFITIONS                           ////////////////////////////////////////////////////////////////////////////**Function*************************************************************  Synopsis    []  Description [vertices are linked in the special list according to the  DFS order. If (fPreTrav) is true, a vertex is added to the list before  its children.]  SideEffects []  SeeAlso     []***********************************************************************/voidCb_GraphDfs( Cb_Graph_t *pG, bool fFromRoot, bool fPreTrav ) {    int i;    Cb_Vertex_t *pV, **ppTail;        pG->iTravs++;    ppTail = &pG->pVertexSpec;        if ( fFromRoot ) {                sarrayForEachItem( Cb_Vertex_t *, pG->pRoots, i, pV ) {            CbGraphDfsFromRoot_rec( pG, pV, &ppTail, fPreTrav );        }    }    else {                sarrayForEachItem( Cb_Vertex_t *, pG->pLeaves, i, pV ) {            CbGraphDfsFromLeaf_rec( pG, pV, &ppTail, fPreTrav );        }    }        /* final tail of the special list */    *ppTail = NULL;    return;}/**Function*************************************************************  Synopsis    []  Description []  SideEffects []  SeeAlso     []***********************************************************************/intCb_GraphLevelize( Cb_Graph_t *pG, Cb_Vertex_t **ppLevels, int fFromRoot ){    int i, iLevelMax, iLevel;    Cb_Vertex_t *pV;        pG->iTravs++;    iLevelMax = -1;    if ( fFromRoot ) {                sarrayForEachItem( Cb_Vertex_t *, pG->pRoots, i, pV ) {            iLevel = CbGraphLevelizeFromRoot_rec( pG, pV, ppLevels );            if ( iLevelMax < iLevel )                iLevelMax = iLevel;        }    }    else {                sarrayForEachItem( Cb_Vertex_t *, pG->pLeaves, i, pV ) {            iLevel = CbGraphLevelizeFromLeaf_rec( pG, pV, ppLevels );            if ( iLevelMax < iLevel )                iLevelMax = iLevel;        }    }    pG->nLevels = iLevelMax;    return pG->nLevels;}/**Function*************************************************************  Synopsis    []  Description []  SideEffects []  SeeAlso     []***********************************************************************/intCb_GraphGetLevelNum( Cb_Graph_t *pG ) {    int i, iLevelMax, iLevel;    Cb_Vertex_t *pV;        pG->iTravs++;        iLevelMax = -1;    sarrayForEachItem( Cb_Vertex_t *, pG->pRoots, i, pV ) {        iLevel = CbGraphGetLevelNum_rec( pG, pV );        if ( iLevelMax < iLevel )            iLevelMax = iLevel;    }    return iLevelMax;}/*---------------------------------------------------------------------------*//* Definition of internal functions                                          *//*---------------------------------------------------------------------------*//**Function*************************************************************  Synopsis    []  Description [append the vertex to the tail of the linked list]  SideEffects []  SeeAlso     []***********************************************************************/voidCbGraphDfsFromRoot_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV,                        Cb_Vertex_t ***pppTail, bool fPreTrav ){    int i;        /* node already visited */    if ( pV->iTravs == pG->iTravs ) {        return;    }        /* mark as visited */    pV->iTravs = pG->iTravs;        /* terminal cases */    if ( pV->nIn == 0 ) {        **pppTail = pV;        *pppTail = &pV->pNextSpec;        return;    }        /* add this vertex before its children */    if ( fPreTrav ) {        **pppTail = pV;        *pppTail = &pV->pNextSpec;    }        for ( i=0; i<pV->nIn; ++i ) {        CbGraphDfsFromRoot_rec( pG, pV->pIn[i], pppTail, fPreTrav );    }        if ( !fPreTrav ) {        **pppTail = pV;        *pppTail = &pV->pNextSpec;    }        return;}/**Function*************************************************************  Synopsis    []  Description [append the vertex to the tail of the linked list]  SideEffects []  SeeAlso     []***********************************************************************/voidCbGraphDfsFromLeaf_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV,                        Cb_Vertex_t ***pppTail, bool fPreTrav ){    int i;        /* node already visited */    if ( pV->iTravs == pG->iTravs ) {        return;    }        /* mark as visited */    pV->iTravs = pG->iTravs;        /* terminal cases */    if ( pV->nOut == 0 ) {        **pppTail = pV;        *pppTail = &pV->pNextSpec;        return;    }        /* add this vertex before its children */    if ( fPreTrav ) {        **pppTail = pV;        *pppTail = &pV->pNextSpec;    }        for ( i=0; i<pV->nOut; ++i ) {        CbGraphDfsFromRoot_rec( pG, pV->pOut[i], pppTail, fPreTrav );    }        if ( !fPreTrav ) {        **pppTail = pV;        *pppTail = &pV->pNextSpec;    }        return;}/**Function*************************************************************  Synopsis    []  Description []  SideEffects []  SeeAlso     []***********************************************************************/intCbGraphLevelizeFromRoot_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV, Cb_Vertex_t **ppLevels ){    int i, iLevel, iLevelMax;        /* node already visited */    if ( pV->iTravs == pG->iTravs ) {        return pV->iLevel;    }        /* mark as visited */    pV->iTravs = pG->iTravs;        if ( pV->nIn == 0 ) {        pV->iLevel = 0;    }    else {        iLevelMax  = -1;        for ( i=0; i<pV->nIn; ++i ) {            iLevel = CbGraphLevelizeFromRoot_rec( pG, pV->pIn[i], ppLevels );            if ( iLevel > iLevelMax )                iLevelMax = iLevel;        }        pV->iLevel = iLevelMax + 1;    }        /* insert into the array of this level */    pV->pNextSpec = ppLevels[pV->iLevel];    ppLevels[pV->iLevel] = pV;        return pV->iLevel;}/**Function*************************************************************  Synopsis    []  Description []  SideEffects []  SeeAlso     []***********************************************************************/intCbGraphLevelizeFromLeaf_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV, Cb_Vertex_t **ppLevels ){    int i, iLevel, iLevelMax;        /* node already visited */    if ( pV->iTravs == pG->iTravs ) {        return pV->iLevel;    }        /* mark as visited */    pV->iTravs = pG->iTravs;        if ( pV->nOut == 0 ) {        pV->iLevel = 0;    }    else {        iLevelMax  = -1;        for ( i=0; i<pV->nOut; ++i ) {            iLevel = CbGraphLevelizeFromLeaf_rec( pG, pV->pOut[i], ppLevels );            if ( iLevel > iLevelMax )                iLevelMax = iLevel;        }        pV->iLevel = iLevelMax + 1;    }        /* insert into the array of this level */    pV->pNextSpec = ppLevels[pV->iLevel];    ppLevels[pV->iLevel] = pV;        return pV->iLevel;}/**Function*************************************************************  Synopsis    []  Description []  SideEffects []  SeeAlso     []***********************************************************************/int CbGraphGetLevelNum_rec( Cb_Graph_t *pG, Cb_Vertex_t *pV ) {    int i, iLevel, iLevelMax;        /* node already visited */    if ( pV->iTravs == pG->iTravs ) {        return pV->iLevel;    }        /* mark as visited */    pV->iTravs = pG->iTravs;        if ( pV->nIn == 0 ) {        pV->iLevel = 0;    }    else {        iLevelMax  = -1;        for ( i=0; i<pV->nIn; ++i ) {            iLevel = CbGraphGetLevelNum_rec( pG, pV->pIn[i] );            if ( iLevel > iLevelMax )                iLevelMax = iLevel;        }        pV->iLevel = iLevelMax + 1;    }        return pV->iLevel;}///////////////////////////////////////////////////////////////////////////                       END OF FILE                                ///////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -