mirror of https://github.com/YosysHQ/abc.git
364 lines
14 KiB
C
364 lines
14 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [bacPrs.h]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Hierarchical word-level netlist.]
|
|
|
|
Synopsis [Parser declarations.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - November 29, 2014.]
|
|
|
|
Revision [$Id: bacPrs.h,v 1.00 2014/11/29 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#ifndef ABC__base__prs__prs_h
|
|
#define ABC__base__prs__prs_h
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// INCLUDES ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "aig/gia/gia.h"
|
|
#include "misc/util/utilNam.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// PARAMETERS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
ABC_NAMESPACE_HEADER_START
|
|
|
|
// parser name types
|
|
typedef enum {
|
|
BAC_PRS_NAME = 0, // 0: name/variable
|
|
BAC_PRS_SLICE, // 1: slice
|
|
BAC_PRS_CONST, // 2: constant
|
|
BAC_PRS_CONCAT, // 3: concatentation
|
|
} Psr_ManType_t;
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// BASIC TYPES ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
// network
|
|
typedef struct Psr_Ntk_t_ Psr_Ntk_t;
|
|
struct Psr_Ntk_t_
|
|
{
|
|
// general info
|
|
int iModuleName;
|
|
unsigned fMapped : 1;
|
|
unsigned fSlices : 1;
|
|
unsigned fHasC0s : 1;
|
|
unsigned fHasC1s : 1;
|
|
unsigned fHasCXs : 1;
|
|
unsigned fHasCZs : 1;
|
|
Abc_Nam_t * pStrs;
|
|
// interface
|
|
Vec_Int_t vOrder; // order of signals
|
|
// signal names
|
|
Vec_Int_t vInouts; // inouts
|
|
Vec_Int_t vInputs; // inputs
|
|
Vec_Int_t vOutputs; // outputs
|
|
Vec_Int_t vWires; // wires
|
|
// signal ranges
|
|
Vec_Int_t vInoutsR; // inouts
|
|
Vec_Int_t vInputsR; // inputs
|
|
Vec_Int_t vOutputsR; // outputs
|
|
Vec_Int_t vWiresR; // wires
|
|
// slices/concatenations/objects
|
|
Vec_Int_t vSlices; // NameId + RangeId
|
|
Vec_Int_t vConcats; // array of NameId/SliceId/ConstId
|
|
Vec_Int_t vBoxes; // ModuleId + InstId + array of pairs {FormNameId, ActSignalId(NameId/SliceId/ConstId/ConcatId)}
|
|
Vec_Int_t vObjs; // box handles
|
|
};
|
|
|
|
// parser
|
|
typedef struct Psr_Man_t_ Psr_Man_t;
|
|
struct Psr_Man_t_
|
|
{
|
|
// input data
|
|
char * pName; // file name
|
|
char * pBuffer; // file contents
|
|
char * pLimit; // end of file
|
|
char * pCur; // current position
|
|
Abc_Nam_t * pStrs; // string manager
|
|
Psr_Ntk_t * pNtk; // current network
|
|
Vec_Ptr_t * vNtks; // input networks
|
|
// temporary data
|
|
Vec_Str_t vCover; // one SOP cover
|
|
Vec_Int_t vTemp; // array of tokens
|
|
Vec_Int_t vTemp2; // array of tokens
|
|
// statistics
|
|
Vec_Int_t vKnown;
|
|
Vec_Int_t vFailed;
|
|
Vec_Int_t vSucceeded;
|
|
// error handling
|
|
int fUsingTemp2; // vTemp2 is in use
|
|
char ErrorStr[1000]; // error
|
|
};
|
|
|
|
static inline Psr_Ntk_t * Psr_ManNtk( Vec_Ptr_t * vPrs, int i ) { return i >= 0 && i < Vec_PtrSize(vPrs) ? (Psr_Ntk_t *)Vec_PtrEntry(vPrs, i) : NULL; }
|
|
static inline Psr_Ntk_t * Psr_ManRoot( Vec_Ptr_t * vPrs ) { return Psr_ManNtk(vPrs, 0); }
|
|
static inline Abc_Nam_t * Psr_ManNameMan( Vec_Ptr_t * vPrs ) { return Psr_ManRoot(vPrs)->pStrs; }
|
|
|
|
static inline int Psr_NtkId( Psr_Ntk_t * p ) { return p->iModuleName; }
|
|
static inline int Psr_NtkPioNum( Psr_Ntk_t * p ) { return Vec_IntSize(&p->vInouts); }
|
|
static inline int Psr_NtkPiNum( Psr_Ntk_t * p ) { return Vec_IntSize(&p->vInputs); }
|
|
static inline int Psr_NtkPoNum( Psr_Ntk_t * p ) { return Vec_IntSize(&p->vOutputs); }
|
|
static inline int Psr_NtkBoxNum( Psr_Ntk_t * p ) { return Vec_IntSize(&p->vObjs); }
|
|
static inline int Psr_NtkObjNum( Psr_Ntk_t * p ) { return Psr_NtkPioNum(p) + Psr_NtkPiNum(p) + Psr_NtkPoNum(p) + Psr_NtkBoxNum(p); }
|
|
static inline char * Psr_NtkStr( Psr_Ntk_t * p, int h ) { return Abc_NamStr(p->pStrs, h); }
|
|
static inline char * Psr_NtkName( Psr_Ntk_t * p ) { return Psr_NtkStr(p, Psr_NtkId(p)); }
|
|
static inline int Psr_NtkSigName( Psr_Ntk_t * p, int i ) { if (!p->fSlices) return i; assert(Abc_Lit2Att2(i) == BAC_PRS_NAME); return Abc_Lit2Var2(i); }
|
|
|
|
static inline int Psr_SliceName( Psr_Ntk_t * p, int h ) { return Vec_IntEntry(&p->vSlices, h); }
|
|
static inline int Psr_SliceRange( Psr_Ntk_t * p, int h ) { return Vec_IntEntry(&p->vSlices, h+1); }
|
|
|
|
static inline int Psr_CatSize( Psr_Ntk_t * p, int h ) { return Vec_IntEntry(&p->vConcats, h); }
|
|
static inline int * Psr_CatArray( Psr_Ntk_t * p, int h ) { return Vec_IntEntryP(&p->vConcats, h+1); }
|
|
static inline Vec_Int_t * Psr_CatSignals( Psr_Ntk_t * p, int h ) { static Vec_Int_t V; V.nSize = V.nCap = Psr_CatSize(p, h); V.pArray = Psr_CatArray(p, h); return &V; }
|
|
|
|
static inline int Psr_BoxHand( Psr_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vObjs, i); }
|
|
static inline int Psr_BoxSize( Psr_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vBoxes, Psr_BoxHand(p, i))-2; }
|
|
static inline int Psr_BoxIONum( Psr_Ntk_t * p, int i ) { return Psr_BoxSize(p, i) / 2; }
|
|
static inline int Psr_BoxNtk( Psr_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vBoxes, Psr_BoxHand(p, i)+1); }
|
|
static inline void Psr_BoxSetNtk( Psr_Ntk_t * p, int i, int m ) { Vec_IntWriteEntry(&p->vBoxes, Psr_BoxHand(p, i)+1, m); }
|
|
static inline int Psr_BoxName( Psr_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vBoxes, Psr_BoxHand(p, i)+2); }
|
|
static inline int Psr_BoxIsNode( Psr_Ntk_t * p, int i ) { return!Vec_IntEntry(&p->vBoxes, Psr_BoxHand(p, i)+3); } // no formal names
|
|
static inline int * Psr_BoxArray( Psr_Ntk_t * p, int i ) { return Vec_IntEntryP(&p->vBoxes, Psr_BoxHand(p, i)+3); }
|
|
static inline Vec_Int_t * Psr_BoxSignals( Psr_Ntk_t * p, int i ) { static Vec_Int_t V; V.nSize = V.nCap = Psr_BoxSize(p, i); V.pArray = Psr_BoxArray(p, i); return &V; }
|
|
|
|
#define Psr_ManForEachNameVec( vVec, p, pName, i ) \
|
|
for ( i = 0; (i < Vec_IntSize(vVec)) && ((pName) = Abc_NamStr(p->pStrs, Vec_IntEntry(vVec,i))); i++ )
|
|
|
|
#define Psr_NtkForEachPio( p, NameId, i ) \
|
|
for ( i = 0; i < Psr_NtkPioNum(p) && ((NameId) = Vec_IntEntry(&p->vInouts, i)); i++ )
|
|
#define Psr_NtkForEachPi( p, NameId, i ) \
|
|
for ( i = 0; i < Psr_NtkPiNum(p) && ((NameId) = Vec_IntEntry(&p->vInputs, i)); i++ )
|
|
#define Psr_NtkForEachPo( p, NameId, i ) \
|
|
for ( i = 0; i < Psr_NtkPoNum(p) && ((NameId) = Vec_IntEntry(&p->vOutputs, i)); i++ )
|
|
#define Psr_NtkForEachBox( p, vVec, i ) \
|
|
for ( i = 0; i < Psr_NtkBoxNum(p) && ((vVec) = Psr_BoxSignals(p, i)); i++ )
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// MACRO DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
// create error message
|
|
static inline int Psr_ManErrorSet( Psr_Man_t * p, char * pError, int Value )
|
|
{
|
|
assert( !p->ErrorStr[0] );
|
|
sprintf( p->ErrorStr, "%s", pError );
|
|
return Value;
|
|
}
|
|
// clear error message
|
|
static inline void Psr_ManErrorClear( Psr_Man_t * p )
|
|
{
|
|
p->ErrorStr[0] = '\0';
|
|
}
|
|
// print error message
|
|
static inline int Psr_ManErrorPrint( Psr_Man_t * p )
|
|
{
|
|
char * pThis; int iLine = 0;
|
|
if ( !p->ErrorStr[0] ) return 1;
|
|
for ( pThis = p->pBuffer; pThis < p->pCur; pThis++ )
|
|
iLine += (int)(*pThis == '\n');
|
|
printf( "Line %d: %s\n", iLine, p->ErrorStr );
|
|
return 0;
|
|
}
|
|
|
|
// parsing network
|
|
static inline void Psr_ManInitializeNtk( Psr_Man_t * p, int iName, int fSlices )
|
|
{
|
|
assert( p->pNtk == NULL );
|
|
p->pNtk = ABC_CALLOC( Psr_Ntk_t, 1 );
|
|
p->pNtk->iModuleName = iName;
|
|
p->pNtk->fSlices = fSlices;
|
|
p->pNtk->pStrs = Abc_NamRef( p->pStrs );
|
|
Vec_PtrPush( p->vNtks, p->pNtk );
|
|
}
|
|
static inline void Psr_ManFinalizeNtk( Psr_Man_t * p )
|
|
{
|
|
assert( p->pNtk != NULL );
|
|
p->pNtk = NULL;
|
|
}
|
|
|
|
// parsing slice/concatentation/box
|
|
static inline int Psr_NtkAddSlice( Psr_Ntk_t * p, int Name, int Range )
|
|
{
|
|
int Value = Vec_IntSize(&p->vSlices);
|
|
Vec_IntPushTwo( &p->vSlices, Name, Range );
|
|
return Value;
|
|
}
|
|
static inline int Psr_NtkAddConcat( Psr_Ntk_t * p, Vec_Int_t * vTemp )
|
|
{
|
|
int Value;
|
|
if ( !(Vec_IntSize(&p->vConcats) & 1) )
|
|
Vec_IntPush(&p->vConcats, -1);
|
|
Value = Vec_IntSize(&p->vConcats);
|
|
assert( Value & 1 );
|
|
Vec_IntPush( &p->vConcats, Vec_IntSize(vTemp) );
|
|
Vec_IntAppend( &p->vConcats, vTemp );
|
|
return Value;
|
|
}
|
|
static inline void Psr_NtkAddBox( Psr_Ntk_t * p, int ModName, int InstName, Vec_Int_t * vTemp )
|
|
{
|
|
int Value;
|
|
assert( Vec_IntSize(vTemp) % 2 == 0 );
|
|
if ( !(Vec_IntSize(&p->vBoxes) & 1) )
|
|
Vec_IntPush(&p->vBoxes, -1);
|
|
Value = Vec_IntSize(&p->vBoxes);
|
|
assert( Value & 1 );
|
|
Vec_IntPush( &p->vObjs, Value );
|
|
// create entry
|
|
Vec_IntPush( &p->vBoxes, Vec_IntSize(vTemp)+2 );
|
|
Vec_IntPush( &p->vBoxes, ModName );
|
|
Vec_IntPush( &p->vBoxes, InstName );
|
|
Vec_IntAppend( &p->vBoxes, vTemp );
|
|
}
|
|
|
|
|
|
static inline char * Psr_ManLoadFile( char * pFileName, char ** ppLimit )
|
|
{
|
|
char * pBuffer;
|
|
int nFileSize, RetValue;
|
|
FILE * pFile = fopen( pFileName, "rb" );
|
|
if ( pFile == NULL )
|
|
{
|
|
printf( "Cannot open input file.\n" );
|
|
return NULL;
|
|
}
|
|
// get the file size, in bytes
|
|
fseek( pFile, 0, SEEK_END );
|
|
nFileSize = ftell( pFile );
|
|
// move the file current reading position to the beginning
|
|
rewind( pFile );
|
|
// load the contents of the file into memory
|
|
pBuffer = ABC_ALLOC( char, nFileSize + 16 );
|
|
pBuffer[0] = '\n';
|
|
RetValue = fread( pBuffer+1, nFileSize, 1, pFile );
|
|
fclose( pFile );
|
|
// terminate the string with '\0'
|
|
pBuffer[nFileSize + 1] = '\n';
|
|
pBuffer[nFileSize + 2] = '\0';
|
|
*ppLimit = pBuffer + nFileSize + 3;
|
|
return pBuffer;
|
|
}
|
|
static inline Psr_Man_t * Psr_ManAlloc( char * pFileName )
|
|
{
|
|
Psr_Man_t * p;
|
|
char * pBuffer, * pLimit;
|
|
pBuffer = Psr_ManLoadFile( pFileName, &pLimit );
|
|
if ( pBuffer == NULL )
|
|
return NULL;
|
|
p = ABC_CALLOC( Psr_Man_t, 1 );
|
|
p->pName = pFileName;
|
|
p->pBuffer = pBuffer;
|
|
p->pLimit = pLimit;
|
|
p->pCur = pBuffer;
|
|
p->pStrs = Abc_NamStart( 1000, 24 );
|
|
p->vNtks = Vec_PtrAlloc( 100 );
|
|
return p;
|
|
}
|
|
|
|
static inline void Psr_NtkFree( Psr_Ntk_t * p )
|
|
{
|
|
if ( p->pStrs )
|
|
Abc_NamDeref( p->pStrs );
|
|
Vec_IntErase( &p->vOrder );
|
|
Vec_IntErase( &p->vInouts );
|
|
Vec_IntErase( &p->vInputs );
|
|
Vec_IntErase( &p->vOutputs );
|
|
Vec_IntErase( &p->vWires );
|
|
Vec_IntErase( &p->vInoutsR );
|
|
Vec_IntErase( &p->vInputsR );
|
|
Vec_IntErase( &p->vOutputsR );
|
|
Vec_IntErase( &p->vWiresR );
|
|
Vec_IntErase( &p->vSlices );
|
|
Vec_IntErase( &p->vConcats );
|
|
Vec_IntErase( &p->vBoxes );
|
|
Vec_IntErase( &p->vObjs );
|
|
ABC_FREE( p );
|
|
}
|
|
|
|
static inline void Psr_ManVecFree( Vec_Ptr_t * vPrs )
|
|
{
|
|
Psr_Ntk_t * pNtk; int i;
|
|
Vec_PtrForEachEntry( Psr_Ntk_t *, vPrs, pNtk, i )
|
|
Psr_NtkFree( pNtk );
|
|
Vec_PtrFree( vPrs );
|
|
}
|
|
|
|
static inline void Psr_ManFree( Psr_Man_t * p )
|
|
{
|
|
if ( p->pStrs )
|
|
Abc_NamDeref( p->pStrs );
|
|
if ( p->vNtks )
|
|
Psr_ManVecFree( p->vNtks );
|
|
// temporary
|
|
Vec_StrErase( &p->vCover );
|
|
Vec_IntErase( &p->vTemp );
|
|
Vec_IntErase( &p->vTemp2 );
|
|
Vec_IntErase( &p->vKnown );
|
|
Vec_IntErase( &p->vFailed );
|
|
Vec_IntErase( &p->vSucceeded );
|
|
ABC_FREE( p->pBuffer );
|
|
ABC_FREE( p );
|
|
}
|
|
|
|
static inline int Psr_NtkMemory( Psr_Ntk_t * p )
|
|
{
|
|
int nMem = sizeof(Psr_Ntk_t);
|
|
nMem += Vec_IntMemory( &p->vOrder );
|
|
nMem += Vec_IntMemory( &p->vInouts );
|
|
nMem += Vec_IntMemory( &p->vInputs );
|
|
nMem += Vec_IntMemory( &p->vOutputs );
|
|
nMem += Vec_IntMemory( &p->vWires );
|
|
nMem += Vec_IntMemory( &p->vInoutsR );
|
|
nMem += Vec_IntMemory( &p->vInputsR );
|
|
nMem += Vec_IntMemory( &p->vOutputsR );
|
|
nMem += Vec_IntMemory( &p->vWiresR );
|
|
nMem += Vec_IntMemory( &p->vSlices );
|
|
nMem += Vec_IntMemory( &p->vBoxes );
|
|
nMem += Vec_IntMemory( &p->vConcats );
|
|
return nMem;
|
|
}
|
|
static inline int Psr_ManMemory( Vec_Ptr_t * vPrs )
|
|
{
|
|
Psr_Ntk_t * pNtk; int i;
|
|
int nMem = Vec_PtrMemory(vPrs);
|
|
Vec_PtrForEachEntry( Psr_Ntk_t *, vPrs, pNtk, i )
|
|
nMem += Psr_NtkMemory( pNtk );
|
|
nMem += Abc_NamMemUsed(Psr_ManNameMan(vPrs));
|
|
return nMem;
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// ITERATORS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/*=== bac.c ========================================================*/
|
|
|
|
|
|
ABC_NAMESPACE_HEADER_END
|
|
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|