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

📄 vmmap.c

📁 主要进行大规模的电路综合
💻 C
字号:
/**CFile****************************************************************  FileName    [vmMap.c]  PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]  Synopsis    [Procedures to manipulate variable maps.]  Author      [MVSIS Group]    Affiliation [UC Berkeley]  Date        [Ver. 1.0. Started - February 1, 2003.]  Revision    [$Id: vmMap.c,v 1.8 2003/05/27 23:15:24 alanmi Exp $]***********************************************************************/#include "vmInt.h"///////////////////////////////////////////////////////////////////////////                        DECLARATIONS                              ///////////////////////////////////////////////////////////////////////////#define MAX_PRIMES      304static int s_Primes[MAX_PRIMES+500] ={    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,     41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89,     97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,     157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223,     227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,     283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,     367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433,     439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,     509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593,     599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,     661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,     751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827,     829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,     919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997,     1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069,     1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163,     1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249,     1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321,     1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439,     1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511,     1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601,     1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693,     1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783,     1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877,     1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987,     1993, 1997, 1999, 2003 };///////////////////////////////////////////////////////////////////////////                     FUNCTION DEFITIONS                           ////////////////////////////////////////////////////////////////////////////**Function*************************************************************  Synopsis    [Lookup if the given variable map exists in the manager.]  Description [The resulting map is not referenced.]                 SideEffects []  SeeAlso     []***********************************************************************/Vm_VarMap_t * Vm_VarMapLookup( Vm_Manager_t * p, int nVarsIn, int nVarsOut, int * pValues ){    Vm_VarMap_t * pMap;    unsigned Key;    int nVars;    nVars = nVarsIn + nVarsOut;    Key = Vm_VarMapHash( nVars, pValues ) % p->nTableSize;    for ( pMap = p->pTable[Key]; pMap; pMap = pMap->pNext )    {        if ( Vm_VarMapCompare( pMap, nVarsIn, nVarsOut, pValues ) )        {            p->nMapsUsed++;            return pMap;        }    }    // create the new map    pMap = Vm_VarMapCreate( p, nVarsIn, nVarsOut, pValues );    // insert the new map in the table    pMap->pNext    = p->pTable[Key];    p->pTable[Key] = pMap;    // increment the counter of maps and relations    p->nMaps++;    p->nMapsUsed++;    return pMap;}/**Function*************************************************************  Synopsis    [Create variable map for the give set of MV variables.]  Description [The first argument is the variable map manager, in which  the variable map will be created. The second argument is the number of   all variblest. The array pValues contains nVars entries. In the array,  there are the number of values for each input variable followed by the  numbers of values for each output variable.]                 SideEffects []  SeeAlso     []***********************************************************************/Vm_VarMap_t * Vm_VarMapCreate( Vm_Manager_t * pMan, int nVarsIn, int nVarsOut, int * pValues ){    Vm_VarMap_t * pMap;    int nVars, nValuesTotal;    int i;    // allocate the map structure    nVars = nVarsIn + nVarsOut;    pMap = ALLOC( Vm_VarMap_t, 1 );    memset( pMap, 0, sizeof(Vm_VarMap_t) );    pMap->pValues      = ALLOC( int, nVars  );    pMap->pValuesFirst = ALLOC( int, nVars + 1 );    // assign internal var map data    pMap->pMan            = pMan;    pMap->nRefs           = 0;    pMap->nVarsIn         = nVarsIn;    pMap->nVarsOut        = nVarsOut;    pMap->pValuesFirst[0] = 0;    nValuesTotal          = 0;    for ( i = 0; i < nVars; i++ )    {        // mark-up the variables        pMap->pValues[i]           = pValues[i];        if ( i < nVarsIn )            pMap->nValuesIn  += pValues[i];        else            pMap->nValuesOut += pValues[i];        nValuesTotal              += pValues[i];        pMap->pValuesFirst[i+1]    = nValuesTotal;    }    // check if the internal storage in the manager needs extending    if ( pMan->nValuesMax < nValuesTotal )    {        // set the new size        pMan->nValuesMax = nValuesTotal;        // reallocate the var-num-sized arrays in the manager        pMan->pSupport1 = REALLOC( int, pMan->pSupport1, 2 * pMan->nValuesMax );        pMan->pSupport2 = REALLOC( int, pMan->pSupport2, 2 * pMan->nValuesMax );        pMan->pPermute  = REALLOC( int, pMan->pPermute,  2 * pMan->nValuesMax );        pMan->pArray1   = REALLOC( int, pMan->pArray1,   2 * pMan->nValuesMax );        pMan->pArray2   = REALLOC( int, pMan->pArray2,   2 * pMan->nValuesMax );    }    return pMap;}/**Function*************************************************************  Synopsis    [Delete variable map with all the internal data.]  Description []                 SideEffects []  SeeAlso     []***********************************************************************/void Vm_VarMapFree( Vm_VarMap_t * pMap ){    // make sure that the map is not used//    assert( pMap->nRefs == 0 );    free( pMap->pValuesFirst );    free( pMap->pValues );    free( pMap );}/**Function*************************************************************  Synopsis    [Computes the hash value for the variable map.]  Description []                 SideEffects []  SeeAlso     []***********************************************************************/unsigned Vm_VarMapHash( int nVars, int * pValues ){    unsigned Key;    int i;    Key = s_Primes[99] * nVars;    for ( i = 0; i < nVars; i++ )    {        assert( pValues[i] > 1 );        Key ^= s_Primes[i+100] * pValues[i];    }    return Key;}/**Function*************************************************************  Synopsis    [Compares to variable maps.]  Description [Returns 1, of the maps are identical.]                 SideEffects []  SeeAlso     []***********************************************************************/int Vm_VarMapCompare( Vm_VarMap_t * pMap, int nVarsIn, int nVarsOut, int * pValues ){    int i;    if ( nVarsIn != pMap->nVarsIn )        return 0;    if ( nVarsOut != pMap->nVarsOut )        return 0;    for ( i = 0; i < nVarsIn + nVarsOut; i++ )        if ( pMap->pValues[i] != pValues[i] )            return 0;    return 1;}/**Function*************************************************************  Synopsis    [Increments the ref counter of the variable map.]  Description []                 SideEffects []  SeeAlso     []***********************************************************************/Vm_VarMap_t * Vm_VarMapRef( Vm_VarMap_t * pMap ){    pMap->nRefs++;    return pMap;}/**Function*************************************************************  Synopsis    [Decrements the ref counter of the variable map.]  Description []                 SideEffects []  SeeAlso     []***********************************************************************/Vm_VarMap_t * Vm_VarMapDeref( Vm_VarMap_t * pMap ){    pMap->nRefs--;//    assert( pMap->nRefs >= 0 );    return pMap;}///////////////////////////////////////////////////////////////////////////                       END OF FILE                                ///////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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