mirror of https://github.com/YosysHQ/abc.git
397 lines
18 KiB
C
397 lines
18 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [extra.h]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [extra]
|
|
|
|
Synopsis [Various reusable software utilities.]
|
|
|
|
Description [This library contains a number of operators and
|
|
traversal routines developed to extend the functionality of
|
|
CUDD v.2.3.x, by Fabio Somenzi (http://vlsi.colorado.edu/~fabio/)
|
|
To compile your code with the library, #include "extra.h"
|
|
in your source files and link your project to CUDD and this
|
|
library. Use the library at your own risk and with caution.
|
|
Note that debugging of some operators still continues.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: extra.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#ifndef ABC__misc__extra__extra_h
|
|
#define ABC__misc__extra__extra_h
|
|
|
|
|
|
#ifdef _WIN32
|
|
#define inline __inline // compatible with MS VS 6.0
|
|
#endif
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Nested includes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
|
|
#include "misc/st/st.h"
|
|
|
|
ABC_NAMESPACE_HEADER_START
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Constant declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Stucture declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Type declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Variable declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Macro declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
typedef unsigned char uint8;
|
|
typedef unsigned short uint16;
|
|
typedef unsigned int uint32;
|
|
|
|
/*===========================================================================*/
|
|
/* Various Utilities */
|
|
/*===========================================================================*/
|
|
|
|
/*=== extraUtilBitMatrix.c ================================================================*/
|
|
|
|
typedef struct Extra_BitMat_t_ Extra_BitMat_t;
|
|
extern Extra_BitMat_t * Extra_BitMatrixStart( int nSize );
|
|
extern void Extra_BitMatrixClean( Extra_BitMat_t * p );
|
|
extern void Extra_BitMatrixStop( Extra_BitMat_t * p );
|
|
extern void Extra_BitMatrixPrint( Extra_BitMat_t * p );
|
|
extern int Extra_BitMatrixReadSize( Extra_BitMat_t * p );
|
|
extern void Extra_BitMatrixInsert1( Extra_BitMat_t * p, int i, int k );
|
|
extern int Extra_BitMatrixLookup1( Extra_BitMat_t * p, int i, int k );
|
|
extern void Extra_BitMatrixDelete1( Extra_BitMat_t * p, int i, int k );
|
|
extern void Extra_BitMatrixInsert2( Extra_BitMat_t * p, int i, int k );
|
|
extern int Extra_BitMatrixLookup2( Extra_BitMat_t * p, int i, int k );
|
|
extern void Extra_BitMatrixDelete2( Extra_BitMat_t * p, int i, int k );
|
|
extern void Extra_BitMatrixOr( Extra_BitMat_t * p, int i, unsigned * pInfo );
|
|
extern void Extra_BitMatrixOrTwo( Extra_BitMat_t * p, int i, int j );
|
|
extern int Extra_BitMatrixCountOnesUpper( Extra_BitMat_t * p );
|
|
extern int Extra_BitMatrixIsDisjoint( Extra_BitMat_t * p1, Extra_BitMat_t * p2 );
|
|
extern int Extra_BitMatrixIsClique( Extra_BitMat_t * p );
|
|
|
|
/*=== extraUtilFile.c ========================================================*/
|
|
|
|
extern char * Extra_FileGetSimilarName( char * pFileNameWrong, char * pS1, char * pS2, char * pS3, char * pS4, char * pS5 );
|
|
extern char * Extra_FileNameExtension( char * FileName );
|
|
extern char * Extra_FileNameAppend( char * pBase, char * pSuffix );
|
|
extern char * Extra_FileNameGeneric( char * FileName );
|
|
extern char * Extra_FileNameGenericAppend( char * pBase, char * pSuffix );
|
|
extern int Extra_FileCheck( char * pFileName );
|
|
extern int Extra_FileSize( char * pFileName );
|
|
extern char * Extra_FileRead( FILE * pFile );
|
|
extern char * Extra_FileRead2( FILE * pFile, FILE * pFile2 );
|
|
extern char * Extra_FileReadContents( char * pFileName );
|
|
extern char * Extra_FileReadContents2( char * pFileName, char * pFileName2 );
|
|
extern int Extra_FileIsType( char * pFileName, char * pS1, char * pS2, char * pS3 );
|
|
extern char * Extra_TimeStamp();
|
|
extern char * Extra_StringAppend( char * pStrGiven, char * pStrAdd );
|
|
extern unsigned Extra_ReadBinary( char * Buffer );
|
|
extern void Extra_PrintBinary( FILE * pFile, unsigned Sign[], int nBits );
|
|
extern int Extra_ReadHex( unsigned Sign[], char * pString, int nDigits );
|
|
extern int Extra_ReadHexadecimal( unsigned Sign[], char * pString, int nVars );
|
|
extern void Extra_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars );
|
|
extern void Extra_PrintHexadecimalString( char * pString, unsigned Sign[], int nVars );
|
|
extern void Extra_PrintHex( FILE * pFile, unsigned * pTruth, int nVars );
|
|
extern void Extra_PrintSymbols( FILE * pFile, char Char, int nTimes, int fPrintNewLine );
|
|
|
|
/*=== extraUtilReader.c ========================================================*/
|
|
|
|
typedef struct Extra_FileReader_t_ Extra_FileReader_t;
|
|
extern Extra_FileReader_t * Extra_FileReaderAlloc( char * pFileName,
|
|
char * pCharsComment, char * pCharsStop, char * pCharsClean );
|
|
extern void Extra_FileReaderFree( Extra_FileReader_t * p );
|
|
extern char * Extra_FileReaderGetFileName( Extra_FileReader_t * p );
|
|
extern int Extra_FileReaderGetFileSize( Extra_FileReader_t * p );
|
|
extern int Extra_FileReaderGetCurPosition( Extra_FileReader_t * p );
|
|
extern void * Extra_FileReaderGetTokens( Extra_FileReader_t * p );
|
|
extern int Extra_FileReaderGetLineNumber( Extra_FileReader_t * p, int iToken );
|
|
|
|
/*=== extraUtilMemory.c ========================================================*/
|
|
|
|
typedef struct Extra_MmFixed_t_ Extra_MmFixed_t;
|
|
typedef struct Extra_MmFlex_t_ Extra_MmFlex_t;
|
|
typedef struct Extra_MmStep_t_ Extra_MmStep_t;
|
|
|
|
// fixed-size-block memory manager
|
|
extern Extra_MmFixed_t * Extra_MmFixedStart( int nEntrySize );
|
|
extern void Extra_MmFixedStop( Extra_MmFixed_t * p );
|
|
extern char * Extra_MmFixedEntryFetch( Extra_MmFixed_t * p );
|
|
extern void Extra_MmFixedEntryRecycle( Extra_MmFixed_t * p, char * pEntry );
|
|
extern void Extra_MmFixedRestart( Extra_MmFixed_t * p );
|
|
extern int Extra_MmFixedReadMemUsage( Extra_MmFixed_t * p );
|
|
extern int Extra_MmFixedReadMaxEntriesUsed( Extra_MmFixed_t * p );
|
|
// flexible-size-block memory manager
|
|
extern Extra_MmFlex_t * Extra_MmFlexStart();
|
|
extern void Extra_MmFlexStop( Extra_MmFlex_t * p );
|
|
extern void Extra_MmFlexPrint( Extra_MmFlex_t * p );
|
|
extern char * Extra_MmFlexEntryFetch( Extra_MmFlex_t * p, int nBytes );
|
|
extern int Extra_MmFlexReadMemUsage( Extra_MmFlex_t * p );
|
|
// hierarchical memory manager
|
|
extern Extra_MmStep_t * Extra_MmStepStart( int nSteps );
|
|
extern void Extra_MmStepStop( Extra_MmStep_t * p );
|
|
extern char * Extra_MmStepEntryFetch( Extra_MmStep_t * p, int nBytes );
|
|
extern void Extra_MmStepEntryRecycle( Extra_MmStep_t * p, char * pEntry, int nBytes );
|
|
extern int Extra_MmStepReadMemUsage( Extra_MmStep_t * p );
|
|
|
|
/*=== extraUtilMisc.c ========================================================*/
|
|
|
|
/* finds the smallest integer larger or equal than the logarithm */
|
|
extern int Extra_Base2LogDouble( double Num );
|
|
/* returns the power of two as a double */
|
|
extern double Extra_Power2( int Num );
|
|
extern int Extra_Power3( int Num );
|
|
/* the number of combinations of k elements out of n */
|
|
extern int Extra_NumCombinations( int k, int n );
|
|
extern int * Extra_DeriveRadixCode( int Number, int Radix, int nDigits );
|
|
/* counts the number of 1s in the bitstring */
|
|
extern int Extra_CountOnes( unsigned char * pBytes, int nBytes );
|
|
/* the factorial of number */
|
|
extern int Extra_Factorial( int n );
|
|
/* the permutation of the given number of elements */
|
|
extern char ** Extra_Permutations( int n );
|
|
/* permutation and complementation of a truth table */
|
|
unsigned Extra_TruthPermute( unsigned Truth, char * pPerms, int nVars, int fReverse );
|
|
unsigned Extra_TruthPolarize( unsigned uTruth, int Polarity, int nVars );
|
|
/* canonical forms of a truth table */
|
|
extern unsigned Extra_TruthCanonN( unsigned uTruth, int nVars );
|
|
extern unsigned Extra_TruthCanonNN( unsigned uTruth, int nVars );
|
|
extern unsigned Extra_TruthCanonP( unsigned uTruth, int nVars );
|
|
extern unsigned Extra_TruthCanonNP( unsigned uTruth, int nVars );
|
|
extern unsigned Extra_TruthCanonNPN( unsigned uTruth, int nVars );
|
|
/* canonical forms of 4-variable functions */
|
|
extern void Extra_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** puPerms, unsigned char ** puMap );
|
|
extern void Extra_Truth4VarN( unsigned short ** puCanons, char *** puPhases, char ** ppCounters, int nPhasesMax );
|
|
/* permutation mapping */
|
|
extern unsigned short Extra_TruthPerm4One( unsigned uTruth, int Phase );
|
|
extern unsigned Extra_TruthPerm5One( unsigned uTruth, int Phase );
|
|
extern void Extra_TruthPerm6One( unsigned * uTruth, int Phase, unsigned * uTruthRes );
|
|
extern void Extra_TruthExpand( int nVars, int nWords, unsigned * puTruth, unsigned uPhase, unsigned * puTruthR );
|
|
/* precomputing tables for permutation mapping */
|
|
extern void ** Extra_ArrayAlloc( int nCols, int nRows, int Size );
|
|
extern unsigned short ** Extra_TruthPerm43();
|
|
extern unsigned ** Extra_TruthPerm53();
|
|
extern unsigned ** Extra_TruthPerm54();
|
|
/* bubble sort for small number of entries */
|
|
extern void Extra_BubbleSort( int Order[], int Costs[], int nSize, int fIncreasing );
|
|
/* complementation/permutation generation */
|
|
extern int * Extra_GreyCodeSchedule( int n );
|
|
extern int * Extra_PermSchedule( int n );
|
|
extern word Extra_Truth6MinimumExact( word t, int * pComp, int * pPerm );
|
|
extern word Extra_Truth6MinimumHeuristic( word t );
|
|
|
|
/*=== extraUtilCanon.c ========================================================*/
|
|
|
|
/* fast computation of N-canoninical form up to 6 inputs */
|
|
extern int Extra_TruthCanonFastN( int nVarsMax, int nVarsReal, unsigned * pt, unsigned ** pptRes, char ** ppfRes );
|
|
|
|
/*=== extraUtilProgress.c ================================================================*/
|
|
|
|
typedef struct ProgressBarStruct ProgressBar;
|
|
|
|
extern ProgressBar * Extra_ProgressBarStart( FILE * pFile, int nItemsTotal );
|
|
extern void Extra_ProgressBarStop( ProgressBar * p );
|
|
extern void Extra_ProgressBarUpdate_int( ProgressBar * p, int nItemsCur, char * pString );
|
|
|
|
static inline void Extra_ProgressBarUpdate( ProgressBar * p, int nItemsCur, char * pString )
|
|
{ if ( p && nItemsCur < *((int*)p) ) return; Extra_ProgressBarUpdate_int(p, nItemsCur, pString); }
|
|
|
|
/*=== extraUtilTruth.c ================================================================*/
|
|
|
|
static inline int Extra_BitWordNum( int nBits ) { return nBits/(8*sizeof(unsigned)) + ((nBits%(8*sizeof(unsigned))) > 0); }
|
|
static inline int Extra_TruthWordNum( int nVars ) { return nVars <= 5 ? 1 : (1 << (nVars - 5)); }
|
|
|
|
static inline void Extra_TruthSetBit( unsigned * p, int Bit ) { p[Bit>>5] |= (1<<(Bit & 31)); }
|
|
static inline void Extra_TruthXorBit( unsigned * p, int Bit ) { p[Bit>>5] ^= (1<<(Bit & 31)); }
|
|
static inline int Extra_TruthHasBit( unsigned * p, int Bit ) { return (p[Bit>>5] & (1<<(Bit & 31))) > 0; }
|
|
|
|
static inline int Extra_WordCountOnes( unsigned uWord )
|
|
{
|
|
uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
|
|
uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
|
|
uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
|
|
uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
|
|
return (uWord & 0x0000FFFF) + (uWord>>16);
|
|
}
|
|
static inline int Extra_TruthCountOnes( unsigned * pIn, int nVars )
|
|
{
|
|
int w, Counter = 0;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
Counter += Extra_WordCountOnes(pIn[w]);
|
|
return Counter;
|
|
}
|
|
static inline int Extra_TruthIsEqual( unsigned * pIn0, unsigned * pIn1, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
if ( pIn0[w] != pIn1[w] )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
static inline int Extra_TruthIsConst0( unsigned * pIn, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
if ( pIn[w] )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
static inline int Extra_TruthIsConst1( unsigned * pIn, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
if ( pIn[w] != ~(unsigned)0 )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
static inline int Extra_TruthIsImply( unsigned * pIn1, unsigned * pIn2, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
if ( pIn1[w] & ~pIn2[w] )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
static inline void Extra_TruthCopy( unsigned * pOut, unsigned * pIn, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = pIn[w];
|
|
}
|
|
static inline void Extra_TruthClear( unsigned * pOut, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = 0;
|
|
}
|
|
static inline void Extra_TruthFill( unsigned * pOut, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = ~(unsigned)0;
|
|
}
|
|
static inline void Extra_TruthNot( unsigned * pOut, unsigned * pIn, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = ~pIn[w];
|
|
}
|
|
static inline void Extra_TruthAnd( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = pIn0[w] & pIn1[w];
|
|
}
|
|
static inline void Extra_TruthOr( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = pIn0[w] | pIn1[w];
|
|
}
|
|
static inline void Extra_TruthSharp( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = pIn0[w] & ~pIn1[w];
|
|
}
|
|
static inline void Extra_TruthNand( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars )
|
|
{
|
|
int w;
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = ~(pIn0[w] & pIn1[w]);
|
|
}
|
|
static inline void Extra_TruthAndPhase( unsigned * pOut, unsigned * pIn0, unsigned * pIn1, int nVars, int fCompl0, int fCompl1 )
|
|
{
|
|
int w;
|
|
if ( fCompl0 && fCompl1 )
|
|
{
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = ~(pIn0[w] | pIn1[w]);
|
|
}
|
|
else if ( fCompl0 && !fCompl1 )
|
|
{
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = ~pIn0[w] & pIn1[w];
|
|
}
|
|
else if ( !fCompl0 && fCompl1 )
|
|
{
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = pIn0[w] & ~pIn1[w];
|
|
}
|
|
else // if ( !fCompl0 && !fCompl1 )
|
|
{
|
|
for ( w = Extra_TruthWordNum(nVars)-1; w >= 0; w-- )
|
|
pOut[w] = pIn0[w] & pIn1[w];
|
|
}
|
|
}
|
|
|
|
extern unsigned ** Extra_TruthElementary( int nVars );
|
|
extern void Extra_TruthSwapAdjacentVars( unsigned * pOut, unsigned * pIn, int nVars, int Start );
|
|
extern void Extra_TruthStretch( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase );
|
|
extern void Extra_TruthShrink( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase );
|
|
extern int Extra_TruthVarInSupport( unsigned * pTruth, int nVars, int iVar );
|
|
extern int Extra_TruthSupportSize( unsigned * pTruth, int nVars );
|
|
extern int Extra_TruthSupport( unsigned * pTruth, int nVars );
|
|
extern void Extra_TruthCofactor0( unsigned * pTruth, int nVars, int iVar );
|
|
extern void Extra_TruthCofactor1( unsigned * pTruth, int nVars, int iVar );
|
|
extern void Extra_TruthExist( unsigned * pTruth, int nVars, int iVar );
|
|
extern void Extra_TruthForall( unsigned * pTruth, int nVars, int iVar );
|
|
extern void Extra_TruthMux( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar );
|
|
extern void Extra_TruthChangePhase( unsigned * pTruth, int nVars, int iVar );
|
|
extern int Extra_TruthMinCofSuppOverlap( unsigned * pTruth, int nVars, int * pVarMin );
|
|
extern void Extra_TruthCountOnesInCofs( unsigned * pTruth, int nVars, short * pStore );
|
|
extern unsigned Extra_TruthHash( unsigned * pIn, int nWords );
|
|
extern unsigned Extra_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars, char * pCanonPerm, short * pStore );
|
|
|
|
/*=== extraUtilUtil.c ================================================================*/
|
|
|
|
extern long Extra_CpuTime();
|
|
extern double Extra_CpuTimeDouble();
|
|
extern int Extra_GetSoftDataLimit();
|
|
extern ABC_DLL void Extra_UtilGetoptReset();
|
|
extern int Extra_UtilGetopt( int argc, char *argv[], const char *optstring );
|
|
extern char * Extra_UtilPrintTime( long t );
|
|
extern char * Extra_UtilStrsav( const char *s );
|
|
extern char * Extra_UtilTildeExpand( char *fname );
|
|
extern char * Extra_UtilFileSearch( char *file, char *path, char *mode );
|
|
extern void (*Extra_UtilMMoutOfMemory)( long size );
|
|
|
|
extern const char * globalUtilOptarg;
|
|
extern int globalUtilOptind;
|
|
|
|
/**AutomaticEnd***************************************************************/
|
|
|
|
|
|
|
|
ABC_NAMESPACE_HEADER_END
|
|
|
|
|
|
|
|
#endif /* __EXTRA_H__ */
|