| /**CFile**************************************************************** |
| |
| FileName [sbd.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [SAT-based optimization using internal don't-cares.] |
| |
| Synopsis [] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: sbd.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "sbdInt.h" |
| #include "misc/vec/vecHsh.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Sbd_CountConfigVars( Vec_Int_t * vSet, int nVars, int Degree ) |
| { |
| int i, k, Entry = 0, Entry2, Count = 0, Below; |
| int Prev = Vec_IntEntry( vSet, 0 ); |
| Vec_IntForEachEntryStart( vSet, Entry, i, 1 ) |
| { |
| assert( Degree*Prev >= Entry ); |
| if ( Degree*Prev == Entry ) |
| { |
| Prev = Entry; |
| continue; |
| } |
| Below = nVars; |
| Vec_IntForEachEntryStart( vSet, Entry2, k, i ) |
| Below += Entry2; |
| Count += Below * (Degree*Prev - 1); |
| Prev = Entry; |
| } |
| Count += nVars * Degree*Prev; |
| return Vec_IntSum(vSet) < nVars - 1 ? 0 : Count; |
| } |
| void Sbd_CountTopos() |
| { |
| int nInputs = 9; |
| int nNodes = 10; |
| int Degree = 3; |
| int fVerbose = 1; |
| Hsh_VecMan_t * p = Hsh_VecManStart( 10000 ); // hash table for arrays |
| Vec_Int_t * vSet = Vec_IntAlloc( 100 ); |
| int i, k, e, Start, Stop; |
| printf( "Counting topologies for %d inputs and %d degree-%d nodes.\n", nInputs, nNodes, Degree ); |
| Start = Hsh_VecManAdd( p, vSet ); |
| for ( i = 1; i <= nNodes; i++ ) |
| { |
| Stop = Hsh_VecSize( p ); |
| for ( e = Start; e < Stop; e++ ) |
| { |
| Vec_Int_t * vTemp = Hsh_VecReadEntry( p, e ); |
| Vec_IntClear( vSet ); |
| Vec_IntAppend( vSet, vTemp ); |
| for ( k = 0; k < Vec_IntSize(vSet); k++ ) |
| { |
| // skip if the number of entries on this level is equal to the number of fanins on the previous level |
| if ( k ? (Vec_IntEntry(vSet, k) == Degree*Vec_IntEntry(vSet, k-1)) : (Vec_IntEntry(vSet, 0) > 0) ) |
| continue; |
| Vec_IntAddToEntry( vSet, k, 1 ); |
| Hsh_VecManAdd( p, vSet ); |
| Vec_IntAddToEntry( vSet, k, -1 ); |
| } |
| Vec_IntPush( vSet, 1 ); |
| Hsh_VecManAdd( p, vSet ); |
| } |
| printf( "Nodes = %2d : This = %8d All = %8d\n", i, Hsh_VecSize(p) - Stop, Hsh_VecSize(p) ); |
| if ( fVerbose ) |
| { |
| for ( e = Stop; e < Hsh_VecSize(p); e++ ) |
| { |
| Vec_Int_t * vTemp = Hsh_VecReadEntry( p, e ); |
| printf( "Params = %3d. ", Sbd_CountConfigVars(vTemp, nInputs, Degree) ); |
| Vec_IntPrint( vTemp ); |
| } |
| printf( "\n" ); |
| } |
| Start = Stop; |
| } |
| Vec_IntFree( vSet ); |
| Hsh_VecManStop( p ); |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |