| /**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 | |