mirror of
https://github.com/YosysHQ/abc.git
synced 2026-09-04 08:33:58 +02:00
344 lines
11 KiB
C
344 lines
11 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [kitDec.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Computation kit.]
|
|
|
|
Synopsis [Decomposition manager.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - November 18, 2009.]
|
|
|
|
Revision [$Id: kitDec.c,v 1.00 2006/12/06 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "kit.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
// decomposition manager
|
|
typedef struct Kit_ManDec_t_ Kit_ManDec_t;
|
|
struct Kit_ManDec_t_
|
|
{
|
|
int nVarsMax; // the max number of variables
|
|
int nWordsMax; // the max number of words
|
|
Vec_Ptr_t * vTruthVars; // elementary truth tables
|
|
Vec_Ptr_t * vTruthNodes; // internal truth tables
|
|
// current problem
|
|
int nVarsIn; // the current number of variables
|
|
Vec_Int_t * vLutsIn; // LUT truth tables
|
|
Vec_Int_t * vSuppIn; // LUT supports
|
|
char ATimeIn[64]; // variable arrival times
|
|
// extracted information
|
|
unsigned * pTruthIn; // computed truth table
|
|
unsigned * pTruthOut; // computed truth table
|
|
int nVarsOut; // the current number of variables
|
|
int nWordsOut; // the current number of words
|
|
char Order[32]; // new vars into old vars after supp minimization
|
|
// computed information
|
|
Vec_Int_t * vLutsOut; // problem decomposition
|
|
Vec_Int_t * vSuppOut; // problem decomposition
|
|
char ATimeOut[64]; // variable arrival times
|
|
};
|
|
|
|
static inline int Kit_DecOuputArrival( int nVars, Vec_Int_t * vLuts, char ATimes[] ) { return ATimes[nVars + Vec_IntSize(vLuts) - 1]; }
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Starts Decmetry manager.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Kit_ManDec_t * Kit_ManDecStart( int nVarsMax )
|
|
{
|
|
Kit_ManDec_t * p;
|
|
assert( nVarsMax <= 20 );
|
|
p = ABC_CALLOC( Kit_ManDec_t, 1 );
|
|
p->nVarsMax = nVarsMax;
|
|
p->nWordsMax = Kit_TruthWordNum( p->nVarsMax );
|
|
p->vTruthVars = Vec_PtrAllocTruthTables( p->nVarsMax );
|
|
p->vTruthNodes = Vec_PtrAllocSimInfo( 64, p->nWordsMax );
|
|
p->vLutsIn = Vec_IntAlloc( 50 );
|
|
p->vSuppIn = Vec_IntAlloc( 50 );
|
|
p->vLutsOut = Vec_IntAlloc( 50 );
|
|
p->vSuppOut = Vec_IntAlloc( 50 );
|
|
p->pTruthIn = ABC_ALLOC( unsigned, p->nWordsMax );
|
|
p->pTruthOut = ABC_ALLOC( unsigned, p->nWordsMax );
|
|
return p;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Stops Decmetry manager.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Kit_ManDecStop( Kit_ManDec_t * p )
|
|
{
|
|
ABC_FREE( p->pTruthIn );
|
|
ABC_FREE( p->pTruthOut );
|
|
Vec_IntFreeP( &p->vLutsIn );
|
|
Vec_IntFreeP( &p->vSuppIn );
|
|
Vec_IntFreeP( &p->vLutsOut );
|
|
Vec_IntFreeP( &p->vSuppOut );
|
|
Vec_PtrFreeP( &p->vTruthVars );
|
|
Vec_PtrFreeP( &p->vTruthNodes );
|
|
ABC_FREE( p );
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Deriving timing information for the decomposed structure.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Kit_DecComputeOuputArrival( int nVars, Vec_Int_t * vSupps, int LutSize, char ATimesIn[], char ATimesOut[] )
|
|
{
|
|
int i, v, iVar, nLuts, Delay;
|
|
nLuts = Vec_IntSize(vSupps) / LutSize;
|
|
assert( nLuts > 0 );
|
|
assert( Vec_IntSize(vSupps) % LutSize == 0 );
|
|
for ( v = 0; v < nVars; v++ )
|
|
ATimesOut[v] = ATimesIn[v];
|
|
for ( v = 0; v < nLuts; v++ )
|
|
{
|
|
Delay = 0;
|
|
for ( i = 0; i < LutSize; i++ )
|
|
{
|
|
iVar = Vec_IntEntry( vSupps, v * LutSize + i );
|
|
assert( iVar < nVars + v );
|
|
Delay = Abc_MaxInt( Delay, ATimesOut[iVar] );
|
|
}
|
|
ATimesOut[nVars + v] = Delay + 1;
|
|
}
|
|
return ATimesOut[nVars + nLuts - 1];
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Derives the truth table]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Kit_DecComputeTruthOne( int LutSize, unsigned * pTruthLut, int nVars, unsigned * pTruths[], unsigned * pTemp, unsigned * pRes )
|
|
{
|
|
int i, v;
|
|
Kit_TruthClear( pRes, nVars );
|
|
for ( i = 0; i < (1<<LutSize); i++ )
|
|
{
|
|
if ( !Kit_TruthHasBit( pTruthLut, i ) )
|
|
continue;
|
|
Kit_TruthFill( pTemp, nVars );
|
|
for ( v = 0; v < LutSize; v++ )
|
|
if ( i & (1<<v) )
|
|
Kit_TruthAnd( pTemp, pTemp, pTruths[v], nVars );
|
|
else
|
|
Kit_TruthSharp( pTemp, pTemp, pTruths[v], nVars );
|
|
Kit_TruthOr( pRes, pRes, pTemp, nVars );
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Derives the truth table]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Kit_DecComputeTruth( Kit_ManDec_t * p, int nVars, Vec_Int_t * vSupps, int LutSize, Vec_Int_t * vLuts, unsigned * pRes )
|
|
{
|
|
unsigned * pResult, * pTruthLuts, * pTruths[17];
|
|
int nTruthLutWords, i, v, iVar, nLuts;
|
|
nLuts = Vec_IntSize(vSupps) / LutSize;
|
|
pTruthLuts = (unsigned *)Vec_IntArray( vLuts );
|
|
nTruthLutWords = Kit_TruthWordNum( LutSize );
|
|
assert( nLuts > 0 );
|
|
assert( Vec_IntSize(vSupps) % LutSize == 0 );
|
|
assert( nLuts * nTruthLutWords == Vec_IntSize(vLuts) );
|
|
for ( v = 0; v < nLuts; v++ )
|
|
{
|
|
for ( i = 0; i < LutSize; i++ )
|
|
{
|
|
iVar = Vec_IntEntry( vSupps, v * LutSize + i );
|
|
assert( iVar < nVars + v );
|
|
pTruths[i] = (iVar < nVars)? (unsigned *)Vec_PtrEntry(p->vTruthVars, iVar) : (unsigned *)Vec_PtrEntry(p->vTruthNodes, iVar-nVars);
|
|
}
|
|
pResult = (v == nLuts - 1) ? pRes : (unsigned *)Vec_PtrEntry(p->vTruthNodes, v);
|
|
Kit_DecComputeTruthOne( LutSize, pTruthLuts, nVars, pTruths, (unsigned *)Vec_PtrEntry(p->vTruthNodes, v+1), pResult );
|
|
pTruthLuts += nTruthLutWords;
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Derives the truth table]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Kit_DecComputePattern( int nVars, unsigned * pTruth, int LutSize, int Pattern[] )
|
|
{
|
|
int nCofs = (1 << LutSize);
|
|
int i, k, nMyu = 0;
|
|
assert( LutSize <= 6 );
|
|
assert( LutSize < nVars );
|
|
if ( nVars - LutSize <= 5 )
|
|
{
|
|
unsigned uCofs[64];
|
|
int nBits = (1 << (nVars - LutSize));
|
|
for ( i = 0; i < nCofs; i++ )
|
|
uCofs[i] = (pTruth[(i*nBits)/32] >> ((i*nBits)%32)) & ((1<<nBits)-1);
|
|
for ( i = 0; i < nCofs; i++ )
|
|
{
|
|
for ( k = 0; k < nMyu; k++ )
|
|
if ( uCofs[i] == uCofs[k] )
|
|
{
|
|
Pattern[i] = k;
|
|
break;
|
|
}
|
|
if ( k == i )
|
|
Pattern[nMyu++] = i;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
unsigned * puCofs[64];
|
|
int nWords = (1 << (nVars - LutSize - 5));
|
|
for ( i = 0; i < nCofs; i++ )
|
|
puCofs[i] = pTruth + nWords;
|
|
for ( i = 0; i < nCofs; i++ )
|
|
{
|
|
for ( k = 0; k < nMyu; k++ )
|
|
if ( Kit_TruthIsEqual( puCofs[i], puCofs[k], nVars - LutSize - 5 ) )
|
|
{
|
|
Pattern[i] = k;
|
|
break;
|
|
}
|
|
if ( k == i )
|
|
Pattern[nMyu++] = i;
|
|
}
|
|
}
|
|
return nMyu;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Returns the number of shared variables.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Kit_DecComputeShared_rec( int Pattern[], int Vars[], int nVars, int Shared[], int iVarTry )
|
|
{
|
|
int Pat0[32], Pat1[32], Shared0[5], Shared1[5], VarsNext[5];
|
|
int v, u, iVarsNext, iPat0, iPat1, m, nMints = (1 << nVars);
|
|
int nShared0, nShared1, nShared = 0;
|
|
for ( v = iVarTry; v < nVars; v++ )
|
|
{
|
|
iVarsNext = 0;
|
|
for ( u = 0; u < nVars; u++ )
|
|
if ( u == v )
|
|
VarsNext[iVarsNext++] = Vars[u];
|
|
iPat0 = iPat1 = 0;
|
|
for ( m = 0; m < nMints; m++ )
|
|
if ( m & (1 << v) )
|
|
Pat1[iPat1++] = m;
|
|
else
|
|
Pat0[iPat0++] = m;
|
|
assert( iPat0 == nMints / 2 );
|
|
assert( iPat1 == nMints / 2 );
|
|
nShared0 = Kit_DecComputeShared_rec( Pat0, VarsNext, nVars-1, Shared0, v + 1 );
|
|
if ( nShared0 == 0 )
|
|
continue;
|
|
nShared1 = Kit_DecComputeShared_rec( Pat1, VarsNext, nVars-1, Shared1, v + 1 );
|
|
if ( nShared1 == 0 )
|
|
continue;
|
|
Shared[nShared++] = v;
|
|
for ( u = 0; u < nShared0; u++ )
|
|
for ( m = 0; m < nShared1; m++ )
|
|
if ( Shared0[u] >= 0 && Shared1[m] >= 0 && Shared0[u] == Shared1[m] )
|
|
{
|
|
Shared[nShared++] = Shared0[u];
|
|
Shared0[u] = Shared1[m] = -1;
|
|
}
|
|
return nShared;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Returns the number of shared variables.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Kit_DecComputeShared( int Pattern[], int LutSize, int Shared[] )
|
|
{
|
|
int i, Vars[6];
|
|
assert( LutSize <= 6 );
|
|
for ( i = 0; i < LutSize; i++ )
|
|
Vars[i] = i;
|
|
return Kit_DecComputeShared_rec( Pattern, Vars, LutSize, Shared, 0 );
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|