Commit 705006a6 by Alan Mishchenko

Changes to the parser.

parent e970aa85
...@@ -10834,6 +10834,10 @@ int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -10834,6 +10834,10 @@ int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_IsopTestNew(); Abc_IsopTestNew();
} }
*/ */
{
extern void Cba_PrsReadBlifTest();
Cba_PrsReadBlifTest();
}
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: test [-CKDNM] [-aovwh] <file_name>\n" ); Abc_Print( -2, "usage: test [-CKDNM] [-aovwh] <file_name>\n" );
...@@ -150,7 +150,7 @@ static inline Cba_Ntk_t * Cba_NtkAlloc( Cba_Man_t * p, char * pName ) ...@@ -150,7 +150,7 @@ static inline Cba_Ntk_t * Cba_NtkAlloc( Cba_Man_t * p, char * pName )
{ {
Cba_Ntk_t * pNtk = ABC_CALLOC( Cba_Ntk_t, 1 ); Cba_Ntk_t * pNtk = ABC_CALLOC( Cba_Ntk_t, 1 );
pNtk->pDesign = p; pNtk->pDesign = p;
pNtk->pName = pName; pNtk->pName = Abc_UtilStrsav(pName);
Vec_PtrPush( &p->vNtks, pNtk ); Vec_PtrPush( &p->vNtks, pNtk );
return pNtk; return pNtk;
} }
...@@ -169,9 +169,13 @@ static inline void Cba_NtkFree( Cba_Ntk_t * p ) ...@@ -169,9 +169,13 @@ static inline void Cba_NtkFree( Cba_Ntk_t * p )
Vec_IntErase( &p->vNameIds ); Vec_IntErase( &p->vNameIds );
Vec_IntErase( &p->vRanges ); Vec_IntErase( &p->vRanges );
Vec_IntErase( &p->vCopies ); Vec_IntErase( &p->vCopies );
ABC_FREE( p->pName );
ABC_FREE( p ); ABC_FREE( p );
} }
static inline int Cba_NtkMemory( Cba_Ntk_t * p )
{
return Vec_WecMemory(&p->vFanins);
}
static inline Cba_Man_t * Cba_ManAlloc( char * pFileName ) static inline Cba_Man_t * Cba_ManAlloc( char * pFileName )
{ {
...@@ -193,6 +197,7 @@ static inline void Cba_ManFree( Cba_Man_t * p ) ...@@ -193,6 +197,7 @@ static inline void Cba_ManFree( Cba_Man_t * p )
Cba_Ntk_t * pNtk; int i; Cba_Ntk_t * pNtk; int i;
Cba_ManForEachNtk( p, pNtk, i ) Cba_ManForEachNtk( p, pNtk, i )
Cba_NtkFree( pNtk ); Cba_NtkFree( pNtk );
ABC_FREE( p->vNtks.pArray );
Mem_FlexStop( p->pMem, 0 ); Mem_FlexStop( p->pMem, 0 );
// design names // design names
Abc_NamStop( p->pNames ); Abc_NamStop( p->pNames );
...@@ -202,6 +207,19 @@ static inline void Cba_ManFree( Cba_Man_t * p ) ...@@ -202,6 +207,19 @@ static inline void Cba_ManFree( Cba_Man_t * p )
ABC_FREE( p->pSpec ); ABC_FREE( p->pSpec );
ABC_FREE( p ); ABC_FREE( p );
} }
static inline int Cba_ManMemory( Cba_Man_t * p )
{
Cba_Ntk_t * pNtk; int i;
int nMem = sizeof(Cba_Man_t);
nMem += Abc_NamMemUsed(p->pNames);
nMem += Abc_NamMemUsed(p->pModels);
nMem += Abc_NamMemUsed(p->pFuncs);
nMem += Mem_FlexReadMemUsage(p->pMem);
nMem += (int)Vec_PtrMemory(&p->vNtks);
Cba_ManForEachNtk( p, pNtk, i )
nMem += Cba_NtkMemory( pNtk );
return nMem;
}
/*=== cbaReadBlif.c =========================================================*/ /*=== cbaReadBlif.c =========================================================*/
......
...@@ -78,19 +78,19 @@ struct Cba_Prs_t_ ...@@ -78,19 +78,19 @@ struct Cba_Prs_t_
Cba_Man_t * pDesign; Cba_Man_t * pDesign;
// interface collected by the parser // interface collected by the parser
int iModuleName; // name Id int iModuleName; // name Id
Vec_Int_t * vInoutsCur; // inouts Vec_Int_t vInoutsCur; // inouts
Vec_Int_t * vInputsCur; // inputs Vec_Int_t vInputsCur; // inputs
Vec_Int_t * vOutputsCur; // outputs Vec_Int_t vOutputsCur; // outputs
Vec_Int_t * vWiresCur; // wires Vec_Int_t vWiresCur; // wires
// objects collected by the parser // objects collected by the parser
Vec_Int_t * vTypesCur; // Cba_PrsType_t Vec_Int_t vTypesCur; // Cba_PrsType_t
Vec_Int_t * vFuncsCur; // functions (node->func; box->module; gate->cell; latch->init; concat->unused) Vec_Int_t vFuncsCur; // functions (node->func; box->module; gate->cell; latch->init; concat->unused)
Vec_Int_t * vInstIdsCur; // instance names Vec_Int_t vInstIdsCur; // instance names
Vec_Wec_t * vFaninsCur; // instances Vec_Wec_t vFaninsCur; // instances
// temporary data // temporary data
Vec_Str_t * vCover; // one SOP cover Vec_Str_t vCover; // one SOP cover
Vec_Int_t * vTemp; // array of tokens Vec_Int_t vTemp; // array of tokens
Vec_Int_t * vTemp2; // array of tokens Vec_Int_t vTemp2; // array of tokens
// error handling // error handling
char ErrorStr[1000]; // error char ErrorStr[1000]; // error
}; };
...@@ -132,16 +132,16 @@ static inline void Cba_PrsSetupVecInt( Cba_Prs_t * p, Vec_Int_t * vTo, Vec_Int_t ...@@ -132,16 +132,16 @@ static inline void Cba_PrsSetupVecInt( Cba_Prs_t * p, Vec_Int_t * vTo, Vec_Int_t
static inline Cba_Ntk_t * Cba_PrsAddCurrentModel( Cba_Prs_t * p, int iNameId ) static inline Cba_Ntk_t * Cba_PrsAddCurrentModel( Cba_Prs_t * p, int iNameId )
{ {
Cba_Ntk_t * pNtk = Cba_NtkAlloc( p->pDesign, Abc_NamStr(p->pDesign->pNames, iNameId) ); Cba_Ntk_t * pNtk = Cba_NtkAlloc( p->pDesign, Abc_NamStr(p->pDesign->pNames, iNameId) );
assert( Vec_IntSize(p->vInputsCur) != 0 && Vec_IntSize(p->vOutputsCur) != 0 ); assert( Vec_IntSize(&p->vInputsCur) != 0 || Vec_IntSize(&p->vOutputsCur) != 0 );
Cba_PrsSetupVecInt( p, &pNtk->vInouts, p->vInoutsCur ); Cba_PrsSetupVecInt( p, &pNtk->vInouts, &p->vInoutsCur );
Cba_PrsSetupVecInt( p, &pNtk->vInputs, p->vInputsCur ); Cba_PrsSetupVecInt( p, &pNtk->vInputs, &p->vInputsCur );
Cba_PrsSetupVecInt( p, &pNtk->vOutputs, p->vOutputsCur ); Cba_PrsSetupVecInt( p, &pNtk->vOutputs, &p->vOutputsCur );
Cba_PrsSetupVecInt( p, &pNtk->vWires, p->vWiresCur ); Cba_PrsSetupVecInt( p, &pNtk->vWires, &p->vWiresCur );
Cba_PrsSetupVecInt( p, &pNtk->vTypes, p->vTypesCur ); Cba_PrsSetupVecInt( p, &pNtk->vTypes, &p->vTypesCur );
Cba_PrsSetupVecInt( p, &pNtk->vFuncs, p->vFuncsCur ); Cba_PrsSetupVecInt( p, &pNtk->vFuncs, &p->vFuncsCur );
Cba_PrsSetupVecInt( p, &pNtk->vInstIds, p->vInstIdsCur ); Cba_PrsSetupVecInt( p, &pNtk->vInstIds, &p->vInstIdsCur );
pNtk->vFanins = *p->vFaninsCur; pNtk->vFanins = p->vFaninsCur;
Vec_WecZero( &pNtk->vFanins ); Vec_WecZero( &p->vFaninsCur );
return pNtk; return pNtk;
} }
...@@ -185,29 +185,25 @@ static inline Cba_Prs_t * Cba_PrsAlloc( char * pFileName ) ...@@ -185,29 +185,25 @@ static inline Cba_Prs_t * Cba_PrsAlloc( char * pFileName )
p->pLimit = pLimit; p->pLimit = pLimit;
p->pCur = pBuffer; p->pCur = pBuffer;
p->pDesign = Cba_ManAlloc( pFileName ); p->pDesign = Cba_ManAlloc( pFileName );
// temporaries
p->vCover = Vec_StrAlloc( 1000 );
p->vTemp = Vec_IntAlloc( 1000 );
p->vTemp2 = Vec_IntAlloc( 1000 );
return p; return p;
} }
static inline void Cba_PrsFree( Cba_Prs_t * p ) static inline void Cba_PrsFree( Cba_Prs_t * p )
{ {
if ( p->pDesign ) if ( p->pDesign )
Cba_ManFree( p->pDesign ); Cba_ManFree( p->pDesign );
Vec_IntFreeP( &p->vInoutsCur ); Vec_IntErase( &p->vInoutsCur );
Vec_IntFreeP( &p->vInputsCur ); Vec_IntErase( &p->vInputsCur );
Vec_IntFreeP( &p->vOutputsCur ); Vec_IntErase( &p->vOutputsCur );
Vec_IntFreeP( &p->vWiresCur ); Vec_IntErase( &p->vWiresCur );
Vec_IntFreeP( &p->vTypesCur ); Vec_IntErase( &p->vTypesCur );
Vec_IntFreeP( &p->vFuncsCur ); Vec_IntErase( &p->vFuncsCur );
Vec_IntFreeP( &p->vInstIdsCur ); Vec_IntErase( &p->vInstIdsCur );
Vec_WecFreeP( &p->vFaninsCur ); ABC_FREE( p->vFaninsCur.pArray );
// temporary // temporary
Vec_StrFreeP( &p->vCover ); Vec_StrErase( &p->vCover );
Vec_IntFreeP( &p->vTemp ); Vec_IntErase( &p->vTemp );
Vec_IntFreeP( &p->vTemp2 ); Vec_IntErase( &p->vTemp2 );
ABC_FREE( p->pBuffer ); ABC_FREE( p->pBuffer );
ABC_FREE( p ); ABC_FREE( p );
} }
......
...@@ -29,29 +29,33 @@ ABC_NAMESPACE_IMPL_START ...@@ -29,29 +29,33 @@ ABC_NAMESPACE_IMPL_START
// BLIF keywords // BLIF keywords
typedef enum { typedef enum {
CBA_BLIF_NONE = 0, // 0: unused CBA_BLIF_NONE = 0, // 0: unused
CBA_BLIF_MODEL, // 1: .model CBA_BLIF_MODEL, // 1: .model
CBA_BLIF_INPUTS, // 2: .inputs CBA_BLIF_INOUTS, // 2: .inouts
CBA_BLIF_OUTPUTS, // 3: .outputs CBA_BLIF_INPUTS, // 3: .inputs
CBA_BLIF_NAMES, // 4: .names CBA_BLIF_OUTPUTS, // 4: .outputs
CBA_BLIF_SUBCKT, // 5: .subckt CBA_BLIF_NAMES, // 5: .names
CBA_BLIF_GATE, // 6: .gate CBA_BLIF_SUBCKT, // 6: .subckt
CBA_BLIF_LATCH, // 7: .latch CBA_BLIF_GATE, // 7: .gate
CBA_BLIF_END, // 8: .end CBA_BLIF_LATCH, // 8: .latch
CBA_BLIF_UNKNOWN // 9: unknown CBA_BLIF_SHORT, // 9: .short
CBA_BLIF_END, // 10: .end
CBA_BLIF_UNKNOWN // 11: unknown
} Cba_BlifType_t; } Cba_BlifType_t;
const char * s_BlifTypes[CBA_BLIF_UNKNOWN+1] = { const char * s_BlifTypes[CBA_BLIF_UNKNOWN+1] = {
NULL, // 0: unused NULL, // 0: unused
".model", // 1: .model ".model", // 1: .model
".inputs", // 2: .inputs ".inouts", // 2: .inputs
".outputs", // 3: .outputs ".inputs", // 3: .inputs
".names", // 4: .names ".outputs", // 4: .outputs
".subckt", // 5: .subckt ".names", // 5: .names
".gate", // 6: .gate ".subckt", // 6: .subckt
".latch", // 7: .latch ".gate", // 7: .gate
".end", // 8: .end ".latch", // 8: .latch
NULL // 9: unknown ".short", // 9: .short
".end", // 10: .end
NULL // 11: unknown
}; };
static inline void Cba_PrsAddBlifDirectives( Cba_Prs_t * p ) static inline void Cba_PrsAddBlifDirectives( Cba_Prs_t * p )
...@@ -60,15 +64,11 @@ static inline void Cba_PrsAddBlifDirectives( Cba_Prs_t * p ) ...@@ -60,15 +64,11 @@ static inline void Cba_PrsAddBlifDirectives( Cba_Prs_t * p )
for ( i = 1; s_BlifTypes[i]; i++ ) for ( i = 1; s_BlifTypes[i]; i++ )
Abc_NamStrFindOrAdd( p->pDesign->pNames, (char *)s_BlifTypes[i], NULL ); Abc_NamStrFindOrAdd( p->pDesign->pNames, (char *)s_BlifTypes[i], NULL );
assert( Abc_NamObjNumMax(p->pDesign->pNames) == i ); assert( Abc_NamObjNumMax(p->pDesign->pNames) == i );
Abc_NamStrFindOrAdd( p->pDesign->pFuncs, (char *)" 0\n", NULL ); // default const 0 function
Abc_NamStrFindOrAdd( p->pDesign->pFuncs, (char *)"1 1\n", NULL ); // default buffer function
assert( Abc_NamObjNumMax(p->pDesign->pFuncs) == 3 );
} }
static inline int Cba_PrsIsSpace( char c ) { return c == ' ' || c == '\t' || c == '\r'; }
static inline int Cba_PrsIsOk( Cba_Prs_t * p ) { return (int)(p->pCur < p->pLimit); }
static inline int Cba_PrsIsChar( Cba_Prs_t * p, char c ) { return *p->pCur == 'c'; }
static inline int Cba_PrsIsLit( Cba_Prs_t * p ) { return *p->pCur == '0' || *p->pCur == '1' || *p->pCur == '-'; }
static inline void Cba_PrsSkipToChar( Cba_Prs_t * p, char c ) { while ( *p->pCur != c ) p->pCur++; }
static inline char Cba_PrsSkip( Cba_Prs_t * p ) { return *p->pCur++; }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS /// /// FUNCTION DEFINITIONS ///
...@@ -76,6 +76,32 @@ static inline char Cba_PrsSkip( Cba_Prs_t * p ) { return *p->pCur ...@@ -76,6 +76,32 @@ static inline char Cba_PrsSkip( Cba_Prs_t * p ) { return *p->pCur
/**Function************************************************************* /**Function*************************************************************
Synopsis [Reading characters.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline int Cba_CharIsSpace( char c ) { return c == ' ' || c == '\t' || c == '\r'; }
static inline int Cba_CharIsStop( char c ) { return c == '#' || c == '\\' || c == '\n' || c == '='; }
static inline int Cba_CharIsLit( char c ) { return c == '0' || c == '1' || c == '-'; }
static inline int Cba_PrsIsSpace( Cba_Prs_t * p ) { return Cba_CharIsSpace(*p->pCur); }
static inline int Cba_PrsIsStop( Cba_Prs_t * p ) { return Cba_CharIsStop(*p->pCur); }
static inline int Cba_PrsIsLit( Cba_Prs_t * p ) { return Cba_CharIsLit(*p->pCur); }
static inline int Cba_PrsIsChar( Cba_Prs_t * p, char c ) { return *p->pCur == c; }
static inline int Cba_PrsIsChar2( Cba_Prs_t * p, char c ) { return *p->pCur++ == c; }
static inline void Cba_PrsSkip( Cba_Prs_t * p ) { p->pCur++; }
static inline char Cba_PrsSkip2( Cba_Prs_t * p ) { return *p->pCur++; }
/**Function*************************************************************
Synopsis [Reading names.] Synopsis [Reading names.]
Description [] Description []
...@@ -85,36 +111,81 @@ static inline char Cba_PrsSkip( Cba_Prs_t * p ) { return *p->pCur ...@@ -85,36 +111,81 @@ static inline char Cba_PrsSkip( Cba_Prs_t * p ) { return *p->pCur
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline void Cba_PrsSkipToChar( Cba_Prs_t * p, char c )
{
while ( !Cba_PrsIsChar(p, c) )
Cba_PrsSkip(p);
}
static inline void Cba_PrsSkipSpaces( Cba_Prs_t * p ) static inline void Cba_PrsSkipSpaces( Cba_Prs_t * p )
{ {
while ( Cba_PrsIsSpace(*p->pCur) ) while ( 1 )
Cba_PrsSkip(p);
if ( Cba_PrsIsChar(p, '#') )
Cba_PrsSkipToChar( p, '\n' );
else if ( Cba_PrsIsChar(p, '\\') )
{ {
Cba_PrsSkipToChar( p, '\n' ); while ( Cba_PrsIsSpace(p) )
Cba_PrsSkip(p); Cba_PrsSkip(p);
Cba_PrsSkipSpaces( p ); if ( Cba_PrsIsChar(p, '\\') )
} {
Cba_PrsSkipToChar( p, '\n' );
Cba_PrsSkip(p);
continue;
}
if ( Cba_PrsIsChar(p, '#') )
Cba_PrsSkipToChar( p, '\n' );
break;
}
assert( !Cba_PrsIsSpace(p) );
} }
static inline int Cba_PrsReadName( Cba_Prs_t * p ) static inline int Cba_PrsReadName( Cba_Prs_t * p )
{ {
char * pStart = p->pCur; char * pStart;
while ( !Cba_PrsIsSpace(*p->pCur) && !Cba_PrsIsChar(p, '\\') ) Cba_PrsSkipSpaces( p );
if ( Cba_PrsIsChar(p, '\n') )
return 0;
pStart = p->pCur;
while ( !Cba_PrsIsSpace(p) && !Cba_PrsIsStop(p) )
Cba_PrsSkip(p); Cba_PrsSkip(p);
if ( pStart == p->pCur ) if ( pStart == p->pCur )
return 0; return 0;
assert( pStart < p->pCur );
return Abc_NamStrFindOrAddLim( p->pDesign->pNames, pStart, p->pCur, NULL ); return Abc_NamStrFindOrAddLim( p->pDesign->pNames, pStart, p->pCur, NULL );
} }
static inline int Cba_PrsReadName2( Cba_Prs_t * p ) static inline int Cba_PrsReadList( Cba_Prs_t * p )
{ {
char * pStart = p->pCur; int iToken;
while ( !Cba_PrsIsSpace(*p->pCur) && !Cba_PrsIsChar(p, '\\') && !Cba_PrsIsChar(p, '=') ) Vec_IntClear( &p->vTemp );
Cba_PrsSkip(p); while ( (iToken = Cba_PrsReadName(p)) )
if ( pStart == p->pCur ) Vec_IntPush( &p->vTemp, iToken );
return 0; if ( Vec_IntSize(&p->vTemp) == 0 ) return Cba_PrsErrorSet(p, "Signal list is empty.", 1);
return Abc_NamStrFindOrAddLim( p->pDesign->pNames, pStart, p->pCur, NULL ); return 0;
}
static inline int Cba_PrsReadList2( Cba_Prs_t * p )
{
int iToken;
Vec_IntFill( &p->vTemp, 1, -1 );
while ( (iToken = Cba_PrsReadName(p)) )
Vec_IntPush( &p->vTemp, iToken );
iToken = Vec_IntPop(&p->vTemp);
if ( Vec_IntSize(&p->vTemp) == 0 ) return Cba_PrsErrorSet(p, "Signal list is empty.", 1);
Vec_IntWriteEntry( &p->vTemp, 0, iToken );
return 0;
}
static inline int Cba_PrsReadList3( Cba_Prs_t * p )
{
Vec_IntClear( &p->vTemp );
while ( !Cba_PrsIsChar(p, '\n') )
{
int iToken = Cba_PrsReadName(p);
if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read formal name.", 1);
Vec_IntPush( &p->vTemp, iToken );
Cba_PrsSkipSpaces( p );
if ( !Cba_PrsIsChar2(p, '=') ) return Cba_PrsErrorSet(p, "Cannot find symbol \"=\".", 1);
iToken = Cba_PrsReadName(p);
if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read actual name.", 1);
Vec_IntPush( &p->vTemp, iToken );
Cba_PrsSkipSpaces( p );
}
if ( Vec_IntSize(&p->vTemp) == 0 ) return Cba_PrsErrorSet(p, "Cannot read a list of formal/actual names.", 1);
if ( Vec_IntSize(&p->vTemp) % 2 ) return Cba_PrsErrorSet(p, "The number of formal/actual names is not even.", 1);
return 0;
} }
/**Function************************************************************* /**Function*************************************************************
...@@ -130,23 +201,36 @@ static inline int Cba_PrsReadName2( Cba_Prs_t * p ) ...@@ -130,23 +201,36 @@ static inline int Cba_PrsReadName2( Cba_Prs_t * p )
***********************************************************************/ ***********************************************************************/
static inline int Cba_PrsReadCube( Cba_Prs_t * p ) static inline int Cba_PrsReadCube( Cba_Prs_t * p )
{ {
assert( Cba_PrsIsLit(p) );
while ( Cba_PrsIsLit(p) ) while ( Cba_PrsIsLit(p) )
Vec_StrPush( p->vCover, Cba_PrsSkip(p) ); Vec_StrPush( &p->vCover, Cba_PrsSkip2(p) );
Cba_PrsSkipSpaces( p ); Cba_PrsSkipSpaces( p );
Vec_StrPush( p->vCover, ' ' ); if ( Cba_PrsIsChar(p, '\n') )
if ( !Cba_PrsIsLit(p) ) return Cba_PrsErrorSet(p, "Cannot detect output literal.", 1); {
Vec_StrPush( p->vCover, Cba_PrsSkip(p) ); if ( Vec_StrSize(&p->vCover) != 1 ) return Cba_PrsErrorSet(p, "Cannot read cube.", 1);
return 1; // fix single literal cube by adding space
Vec_StrPush( &p->vCover, Vec_StrEntry(&p->vCover,0) );
Vec_StrWriteEntry( &p->vCover, 0, ' ' );
Vec_StrPush( &p->vCover, '\n' );
return 0;
}
if ( !Cba_PrsIsLit(p) ) return Cba_PrsErrorSet(p, "Cannot read output literal.", 1);
Vec_StrPush( &p->vCover, ' ' );
Vec_StrPush( &p->vCover, Cba_PrsSkip2(p) );
Vec_StrPush( &p->vCover, '\n' );
Cba_PrsSkipSpaces( p );
if ( !Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Cannot read end of cube.", 1);
return 0;
} }
static inline void Cba_PrsSaveCover( Cba_Prs_t * p ) static inline void Cba_PrsSaveCover( Cba_Prs_t * p )
{ {
int iToken; int iToken;
assert( Vec_StrSize(p->vCover) > 0 ); assert( Vec_StrSize(&p->vCover) > 0 );
Vec_StrPush( p->vCover, '\0' ); Vec_StrPush( &p->vCover, '\0' );
iToken = Abc_NamStrFindOrAdd( p->pDesign->pFuncs, Vec_StrArray(p->vCover), NULL ); iToken = Abc_NamStrFindOrAdd( p->pDesign->pFuncs, Vec_StrArray(&p->vCover), NULL );
Vec_StrClear( p->vCover ); assert( Vec_IntEntryLast(&p->vFuncsCur) == 1 );
assert( Vec_IntEntryLast(p->vFuncsCur) == 1 ); Vec_IntWriteEntry( &p->vFuncsCur, Vec_IntSize(&p->vFuncsCur)-1, iToken );
Vec_IntWriteEntry( p->vFuncsCur, Vec_IntSize(p->vFuncsCur)-1, iToken ); Vec_StrClear( &p->vCover );
} }
/**Function************************************************************* /**Function*************************************************************
...@@ -160,98 +244,100 @@ static inline void Cba_PrsSaveCover( Cba_Prs_t * p ) ...@@ -160,98 +244,100 @@ static inline void Cba_PrsSaveCover( Cba_Prs_t * p )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline int Cba_PrsReadSignals( Cba_Prs_t * p, int fSkipFirst ) static inline int Cba_PrsReadInouts( Cba_Prs_t * p )
{ {
Cba_PrsSkipSpaces( p ); if ( Cba_PrsReadList(p) ) return 1;
Vec_IntFill( p->vTemp, fSkipFirst, -1 ); Vec_IntAppend( &p->vInoutsCur, &p->vTemp );
while ( !Cba_PrsIsChar(p, '\n') )
{
Vec_IntPush( p->vTemp, Cba_PrsReadName(p) );
Cba_PrsSkipSpaces( p );
}
if ( Vec_IntSize(p->vTemp) == 0 ) return Cba_PrsErrorSet(p, "List of signals is empty.", 1);
if ( Vec_IntCountZero(p->vTemp) ) return Cba_PrsErrorSet(p, "Cannot read names in the list.", 1);
return 0; return 0;
} }
static inline int Cba_PrsReadInputs( Cba_Prs_t * p ) static inline int Cba_PrsReadInputs( Cba_Prs_t * p )
{ {
if ( Cba_PrsReadSignals(p, 0) ) return 1; if ( Cba_PrsReadList(p) ) return 1;
Vec_IntAppend( p->vInputsCur, p->vTemp ); Vec_IntAppend( &p->vInputsCur, &p->vTemp );
return 0; return 0;
} }
static inline int Cba_PrsReadOutputs( Cba_Prs_t * p ) static inline int Cba_PrsReadOutputs( Cba_Prs_t * p )
{ {
if ( Cba_PrsReadSignals(p, 0) ) return 1; if ( Cba_PrsReadList(p) ) return 1;
Vec_IntAppend( p->vOutputsCur, p->vTemp ); Vec_IntAppend( &p->vOutputsCur, &p->vTemp );
return 0; return 0;
} }
static inline int Cba_PrsReadNode( Cba_Prs_t * p ) static inline int Cba_PrsReadNode( Cba_Prs_t * p )
{ {
if ( Cba_PrsReadSignals(p, 1) ) return 1; if ( Cba_PrsReadList2(p) ) return 1;
Vec_IntWriteEntry( p->vTemp, 0, Vec_IntPop(p->vTemp) );
// save results // save results
Vec_IntPush( p->vFuncsCur, 1 ); Vec_IntPush( &p->vTypesCur, CBA_PRS_NODE );
Vec_IntPush( p->vTypesCur, CBA_PRS_NODE ); Vec_IntPush( &p->vFuncsCur, 1 ); // default const 0 function
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(p->vFaninsCur), p->vTemp ); Cba_PrsSetupVecInt( p, Vec_WecPushLevel(&p->vFaninsCur), &p->vTemp );
return 0; return 0;
} }
static inline int Cba_PrsReadBox( Cba_Prs_t * p, int fGate ) static inline int Cba_PrsReadBox( Cba_Prs_t * p, int fGate )
{ {
Cba_PrsSkipSpaces( p ); int iToken = Cba_PrsReadName(p);
if ( Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Cannot read model name.", 1); if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read model name.", 1);
Vec_IntPush( p->vFuncsCur, Cba_PrsReadName(p) ); if ( Cba_PrsReadList3(p) ) return 1;
Cba_PrsSkipSpaces( p );
if ( Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Cannot read formal/actual inputs.", 1);
while ( !Cba_PrsIsChar(p, '\n') )
{
Vec_IntPush( p->vTemp, Cba_PrsReadName(p) );
Cba_PrsSkipSpaces( p );
if ( !Cba_PrsIsChar(p, '=') ) return Cba_PrsErrorSet(p, "Cannot find symbol \'=\'.", 1);
p->pCur++;
Cba_PrsSkipSpaces( p );
Vec_IntPush( p->vTemp, Cba_PrsReadName(p) );
Cba_PrsSkipSpaces( p );
}
// save results // save results
Vec_IntPush( p->vTypesCur, CBA_PRS_BOX ); Vec_IntPush( &p->vTypesCur, CBA_PRS_BOX );
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(p->vFaninsCur), p->vTemp ); Vec_IntPush( &p->vFuncsCur, iToken );
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(&p->vFaninsCur), &p->vTemp );
return 0; return 0;
} }
static inline int Cba_PrsReadLatch( Cba_Prs_t * p ) static inline int Cba_PrsReadLatch( Cba_Prs_t * p )
{ {
Vec_IntFill( p->vTemp, 2, -1 ); int iToken = Cba_PrsReadName(p);
Cba_PrsSkipSpaces( p ); Vec_IntFill( &p->vTemp, 2, -1 );
if ( Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Cannot read latch input.", 1); if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read latch input.", 1);
Vec_IntWriteEntry( p->vTemp, 1, Cba_PrsReadName(p) ); Vec_IntWriteEntry( &p->vTemp, 1, iToken );
iToken = Cba_PrsReadName(p);
if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read latch output.", 1);
Vec_IntWriteEntry( &p->vTemp, 0, iToken );
Cba_PrsSkipSpaces( p ); Cba_PrsSkipSpaces( p );
if ( Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Cannot read latch output.", 1);
Vec_IntWriteEntry( p->vTemp, 0, Cba_PrsReadName(p) );
if ( Cba_PrsIsChar(p, '0') ) if ( Cba_PrsIsChar(p, '0') )
Vec_IntPush( p->vFuncsCur, 0 ); iToken = 0;
else if ( Cba_PrsIsChar(p, '1') ) else if ( Cba_PrsIsChar(p, '1') )
Vec_IntPush( p->vFuncsCur, 1 ); iToken = 1;
else if ( Cba_PrsIsChar(p, '2') || Cba_PrsIsChar(p, '\n') ) else
Vec_IntPush( p->vFuncsCur, 2 ); iToken = 2;
else return Cba_PrsErrorSet(p, "Cannot read latch init value.", 1); Cba_PrsSkipToChar( p, '\n' );
// save results // save results
Vec_IntPush( p->vTypesCur, CBA_PRS_LATCH ); Vec_IntPush( &p->vTypesCur, CBA_PRS_LATCH );
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(p->vFaninsCur), p->vTemp ); Vec_IntPush( &p->vFuncsCur, iToken );
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(&p->vFaninsCur), &p->vTemp );
return 0; return 0;
} }
static inline int Cba_PrsReadModel( Cba_Prs_t * p ) static inline int Cba_PrsReadShort( Cba_Prs_t * p )
{ {
int iToken = Cba_PrsReadName(p);
Vec_IntFill( &p->vTemp, 2, -1 );
if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read .short input.", 1);
Vec_IntWriteEntry( &p->vTemp, 1, iToken );
iToken = Cba_PrsReadName(p);
if ( iToken == 0 ) return Cba_PrsErrorSet(p, "Cannot read .short output.", 1);
Vec_IntWriteEntry( &p->vTemp, 0, iToken );
Cba_PrsSkipSpaces( p ); Cba_PrsSkipSpaces( p );
if ( Vec_IntSize(p->vInputsCur) > 0 ) return Cba_PrsErrorSet(p, "Parsing previous model is unfinished.", 1); if ( !Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Trailing symbols on .short line.", 1);
p->iModuleName = Cba_PrsReadName( p ); // save results
if ( p->iModuleName == 0 ) return Cba_PrsErrorSet(p, "Cannot read model name.", 1); Vec_IntPush( &p->vTypesCur, CBA_PRS_NODE );
Vec_IntPush( &p->vFuncsCur, 2 ); // default buffer function
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(&p->vFaninsCur), &p->vTemp );
return 0;
}
static inline int Cba_PrsReadModel( Cba_Prs_t * p )
{
if ( p->iModuleName > 0 ) return Cba_PrsErrorSet(p, "Parsing previous model is unfinished.", 1);
p->iModuleName = Cba_PrsReadName(p);
Cba_PrsSkipSpaces( p ); Cba_PrsSkipSpaces( p );
if ( !Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Trailing symbols on .model line.", 1); if ( !Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Trailing symbols on .model line.", 1);
return 0; return 0;
} }
static inline int Cba_PrsReadEnd( Cba_Prs_t * p ) static inline int Cba_PrsReadEnd( Cba_Prs_t * p )
{ {
if ( Vec_IntSize(p->vInputsCur) == 0 ) return Cba_PrsErrorSet(p, "Directive .end without .model.", 1); if ( p->iModuleName == 0 ) return Cba_PrsErrorSet(p, "Directive .end without .model.", 1);
//printf( "Saving model \"%s\".\n", Abc_NamStr(p->pDesign->pNames, p->iModuleName) );
Cba_PrsAddCurrentModel( p, p->iModuleName ); Cba_PrsAddCurrentModel( p, p->iModuleName );
p->iModuleName = 0;
Cba_PrsSkipSpaces( p );
if ( !Cba_PrsIsChar(p, '\n') ) return Cba_PrsErrorSet(p, "Trailing symbols on .end line.", 1);
return 0; return 0;
} }
...@@ -260,11 +346,13 @@ static inline int Cba_PrsReadDirective( Cba_Prs_t * p ) ...@@ -260,11 +346,13 @@ static inline int Cba_PrsReadDirective( Cba_Prs_t * p )
int iToken; int iToken;
if ( !Cba_PrsIsChar(p, '.') ) if ( !Cba_PrsIsChar(p, '.') )
return Cba_PrsReadCube( p ); return Cba_PrsReadCube( p );
if ( Vec_StrSize(p->vCover) > 0 ) // SOP was specified for the previous node if ( Vec_StrSize(&p->vCover) > 0 ) // SOP was specified for the previous node
Cba_PrsSaveCover( p ); Cba_PrsSaveCover( p );
iToken = Cba_PrsReadName( p ); iToken = Cba_PrsReadName( p );
if ( iToken == CBA_BLIF_MODEL ) if ( iToken == CBA_BLIF_MODEL )
return Cba_PrsReadModel( p ); return Cba_PrsReadModel( p );
if ( iToken == CBA_BLIF_INOUTS )
return Cba_PrsReadInouts( p );
if ( iToken == CBA_BLIF_INPUTS ) if ( iToken == CBA_BLIF_INPUTS )
return Cba_PrsReadInputs( p ); return Cba_PrsReadInputs( p );
if ( iToken == CBA_BLIF_OUTPUTS ) if ( iToken == CBA_BLIF_OUTPUTS )
...@@ -277,19 +365,23 @@ static inline int Cba_PrsReadDirective( Cba_Prs_t * p ) ...@@ -277,19 +365,23 @@ static inline int Cba_PrsReadDirective( Cba_Prs_t * p )
return Cba_PrsReadBox( p, 1 ); return Cba_PrsReadBox( p, 1 );
if ( iToken == CBA_BLIF_LATCH ) if ( iToken == CBA_BLIF_LATCH )
return Cba_PrsReadLatch( p ); return Cba_PrsReadLatch( p );
if ( iToken == CBA_BLIF_SHORT )
return Cba_PrsReadShort( p );
if ( iToken == CBA_BLIF_END ) if ( iToken == CBA_BLIF_END )
return Cba_PrsReadEnd( p ); return Cba_PrsReadEnd( p );
assert( 0 ); printf( "Cannot read directive \"%s\".\n", Abc_NamStr(p->pDesign->pNames, iToken) );
return 1; return 1;
} }
static inline int Cba_PrsReadLines( Cba_Prs_t * p ) static inline int Cba_PrsReadLines( Cba_Prs_t * p )
{ {
while ( Cba_PrsIsChar(p, '\n') ) while ( p->pCur[1] != '\0' )
{ {
p->pCur++; Cba_PrsSkipSpaces( p ); assert( Cba_PrsIsChar(p, '\n') );
if ( Cba_PrsIsChar(p, '\n') ) Cba_PrsSkip(p);
Cba_PrsSkipSpaces( p );
if ( Cba_PrsIsChar(p, '\n') )
continue; continue;
if ( Cba_PrsReadDirective( p ) ) if ( Cba_PrsReadDirective(p) )
return 1; return 1;
} }
return 0; return 0;
...@@ -320,6 +412,31 @@ Cba_Man_t * Cba_PrsReadBlif( char * pFileName ) ...@@ -320,6 +412,31 @@ Cba_Man_t * Cba_PrsReadBlif( char * pFileName )
return pDesign; return pDesign;
} }
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Cba_PrsReadBlifTest( char * pFileName )
{
abctime clk = Abc_Clock();
extern void Cba_PrsWriteBlif( char * pFileName, Cba_Man_t * pDes );
Cba_Man_t * p = Cba_PrsReadBlif( "aga/ray/ray_hie_oper.blif" );
if ( !p ) return;
printf( "Finished reading %d networks. ", Cba_ManNtkNum(p) );
printf( "Memory = %.2f MB. ", 1.0*Cba_ManMemory(p)/(1<<20) );
Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
// Abc_NamPrint( p->pDesign->pNames );
Cba_PrsWriteBlif( "aga/ray/ray_hie_oper_out.blif", p );
Cba_ManFree( p );
}
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// END OF FILE /// /// END OF FILE ///
......
...@@ -264,24 +264,24 @@ static inline int Cba_PrsReadRange( Cba_Prs_t * p ) ...@@ -264,24 +264,24 @@ static inline int Cba_PrsReadRange( Cba_Prs_t * p )
{ {
if ( !Cba_PrsIsChar(p, '[') ) if ( !Cba_PrsIsChar(p, '[') )
return 0; return 0;
Vec_StrClear( p->vCover ); Vec_StrClear( &p->vCover );
Vec_StrPush( p->vCover, *p->pCur++ ); Vec_StrPush( &p->vCover, *p->pCur++ );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
if ( !Cba_PrsIsDigit(p) ) return Cba_PrsErrorSet(p, "Cannot read digit in range specification.", 2); if ( !Cba_PrsIsDigit(p) ) return Cba_PrsErrorSet(p, "Cannot read digit in range specification.", 2);
while ( Cba_PrsIsDigit(p) ) while ( Cba_PrsIsDigit(p) )
Vec_StrPush( p->vCover, *p->pCur++ ); Vec_StrPush( &p->vCover, *p->pCur++ );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
if ( Cba_PrsIsChar(p, ':') ) if ( Cba_PrsIsChar(p, ':') )
{ {
Vec_StrPush( p->vCover, *p->pCur++ ); Vec_StrPush( &p->vCover, *p->pCur++ );
if ( !Cba_PrsIsDigit(p) ) return Cba_PrsErrorSet(p, "Cannot read digit in range specification.", 2); if ( !Cba_PrsIsDigit(p) ) return Cba_PrsErrorSet(p, "Cannot read digit in range specification.", 2);
while ( Cba_PrsIsDigit(p) ) while ( Cba_PrsIsDigit(p) )
Vec_StrPush( p->vCover, *p->pCur++ ); Vec_StrPush( &p->vCover, *p->pCur++ );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
} }
if ( !Cba_PrsIsChar(p, ']') ) return Cba_PrsErrorSet(p, "Cannot read closing brace in range specification.", 2); if ( !Cba_PrsIsChar(p, ']') ) return Cba_PrsErrorSet(p, "Cannot read closing brace in range specification.", 2);
Vec_StrPush( p->vCover, *p->pCur++ ); Vec_StrPush( &p->vCover, *p->pCur++ );
return Abc_NamStrFindOrAddLim( p->pDesign->pNames, Vec_StrArray(p->vCover), Vec_StrArray(p->vCover)+Vec_StrSize(p->vCover), NULL ); return Abc_NamStrFindOrAddLim( p->pDesign->pNames, Vec_StrArray(&p->vCover), Vec_StrArray(&p->vCover)+Vec_StrSize(&p->vCover), NULL );
} }
static inline void Cba_PrsReadSignalList( Cba_Prs_t * p, Vec_Int_t * vTemp ) static inline void Cba_PrsReadSignalList( Cba_Prs_t * p, Vec_Int_t * vTemp )
{ {
...@@ -303,12 +303,12 @@ static inline void Cba_PrsReadSignalList( Cba_Prs_t * p, Vec_Int_t * vTemp ) ...@@ -303,12 +303,12 @@ static inline void Cba_PrsReadSignalList( Cba_Prs_t * p, Vec_Int_t * vTemp )
static inline int Cba_PrsReadDeclaration( Cba_Prs_t * p, int Type ) static inline int Cba_PrsReadDeclaration( Cba_Prs_t * p, int Type )
{ {
int NameId, RangeId, RangeIdTemp; int NameId, RangeId, RangeIdTemp;
Vec_Int_t * vSigs[4] = { p->vInoutsCur, p->vInputsCur, p->vOutputsCur, p->vWiresCur }; Vec_Int_t * vSigs[4] = { &p->vInoutsCur, &p->vInputsCur, &p->vOutputsCur, &p->vWiresCur };
assert( Type >= CBA_VER_INOUT && Type <= CBA_VER_WIRE ); assert( Type >= CBA_VER_INOUT && Type <= CBA_VER_WIRE );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
RangeId = Cba_PrsReadRange( p ); RangeId = Cba_PrsReadRange( p );
Cba_PrsReadSignalList( p, p->vTemp ); Cba_PrsReadSignalList( p, &p->vTemp );
Vec_IntForEachEntryDouble( p->vTemp, NameId, RangeId, RangeIdTemp ) Vec_IntForEachEntryDouble( &p->vTemp, NameId, RangeId, RangeIdTemp )
{ {
if ( !RangeIdTemp ) return Cba_PrsErrorSet(p, "Range is specified twice in the declaration.", 0); if ( !RangeIdTemp ) return Cba_PrsErrorSet(p, "Range is specified twice in the declaration.", 0);
Vec_IntPushTwo( vSigs[Type - CBA_VER_INOUT], NameId, RangeId ); Vec_IntPushTwo( vSigs[Type - CBA_VER_INOUT], NameId, RangeId );
...@@ -317,17 +317,17 @@ static inline int Cba_PrsReadDeclaration( Cba_Prs_t * p, int Type ) ...@@ -317,17 +317,17 @@ static inline int Cba_PrsReadDeclaration( Cba_Prs_t * p, int Type )
} }
static inline int Cba_PrsReadConcat( Cba_Prs_t * p ) static inline int Cba_PrsReadConcat( Cba_Prs_t * p )
{ {
int iToken = Vec_WecSize( p->vFaninsCur ); int iToken = Vec_WecSize( &p->vFaninsCur );
assert( Cba_PrsIsChar(p, '{') ); assert( Cba_PrsIsChar(p, '{') );
p->pCur++; p->pCur++;
Cba_PrsReadSignalList( p, p->vTemp2 ); Cba_PrsReadSignalList( p, &p->vTemp2 );
if ( !Cba_PrsIsChar(p, '}') ) return Cba_PrsErrorSet(p, "Cannot read concatenation.", 0); if ( !Cba_PrsIsChar(p, '}') ) return Cba_PrsErrorSet(p, "Cannot read concatenation.", 0);
p->pCur++; p->pCur++;
// assign // assign
Vec_IntPush( p->vTypesCur, CBA_PRS_CONCAT ); Vec_IntPush( &p->vTypesCur, CBA_PRS_CONCAT );
Vec_IntPush( p->vFuncsCur, 0 ); Vec_IntPush( &p->vFuncsCur, 0 );
Vec_IntPush( p->vInstIdsCur, 0 ); Vec_IntPush( &p->vInstIdsCur, 0 );
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(p->vFaninsCur), p->vTemp2 ); Cba_PrsSetupVecInt( p, Vec_WecPushLevel(&p->vFaninsCur), &p->vTemp2 );
return iToken; return iToken;
} }
...@@ -335,7 +335,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func ) ...@@ -335,7 +335,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func )
{ {
// have to assign Type, Func, InstId, vFanins // have to assign Type, Func, InstId, vFanins
int FormId, NameId, RangeId, Type, InstId; int FormId, NameId, RangeId, Type, InstId;
Vec_IntClear( p->vTemp ); Vec_IntClear( &p->vTemp );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
if ( Cba_PrsIsChar(p, '(') ) // node if ( Cba_PrsIsChar(p, '(') ) // node
{ {
...@@ -355,7 +355,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func ) ...@@ -355,7 +355,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func )
NameId = Cba_PrsReadName( p ); NameId = Cba_PrsReadName( p );
RangeId = Cba_PrsReadRange( p ); RangeId = Cba_PrsReadRange( p );
} }
Vec_IntPushTwo( p->vTemp, NameId, RangeId ); Vec_IntPushTwo( &p->vTemp, NameId, RangeId );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
if ( Cba_PrsIsChar(p, ')') ) if ( Cba_PrsIsChar(p, ')') )
break; break;
...@@ -390,7 +390,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func ) ...@@ -390,7 +390,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func )
NameId = Cba_PrsReadName( p ); NameId = Cba_PrsReadName( p );
RangeId = Cba_PrsReadRange( p ); RangeId = Cba_PrsReadRange( p );
} }
Vec_IntPushTwo( p->vTemp, NameId, RangeId ); Vec_IntPushTwo( &p->vTemp, NameId, RangeId );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
if ( !Cba_PrsIsChar(p, ')') ) return Cba_PrsErrorSet(p, "Expecting opening paranthesis after the acctual name.", 2); if ( !Cba_PrsIsChar(p, ')') ) return Cba_PrsErrorSet(p, "Expecting opening paranthesis after the acctual name.", 2);
p->pCur++; p->pCur++;
...@@ -402,10 +402,10 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func ) ...@@ -402,10 +402,10 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func )
} }
} }
// assign // assign
Vec_IntPush( p->vTypesCur, Type ); Vec_IntPush( &p->vTypesCur, Type );
Vec_IntPush( p->vFuncsCur, Func ); Vec_IntPush( &p->vFuncsCur, Func );
Vec_IntPush( p->vInstIdsCur, InstId ); Vec_IntPush( &p->vInstIdsCur, InstId );
Cba_PrsSetupVecInt( p, Vec_WecPushLevel(p->vFaninsCur), p->vTemp ); Cba_PrsSetupVecInt( p, Vec_WecPushLevel(&p->vFaninsCur), &p->vTemp );
return 0; return 0;
} }
...@@ -414,7 +414,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func ) ...@@ -414,7 +414,7 @@ static inline int Cba_PrsReadInstance( Cba_Prs_t * p, int Func )
static inline int Cba_PrsReadModule( Cba_Prs_t * p ) static inline int Cba_PrsReadModule( Cba_Prs_t * p )
{ {
int fKnown, iToken, iNameId; int fKnown, iToken, iNameId;
assert( Vec_IntSize(p->vInputsCur) == 0 && Vec_IntSize(p->vOutputsCur) == 0 ); assert( Vec_IntSize(&p->vInputsCur) == 0 && Vec_IntSize(&p->vOutputsCur) == 0 );
Cba_PrsUtilSkipSpaces( p ); Cba_PrsUtilSkipSpaces( p );
if ( !Cba_PrsOk(p) ) return 0; if ( !Cba_PrsOk(p) ) return 0;
// read keyword // read keyword
......
...@@ -57,6 +57,7 @@ void Cba_PrsWriteBlifArray2( FILE * pFile, Cba_Ntk_t * p, Vec_Int_t * vFanins ) ...@@ -57,6 +57,7 @@ void Cba_PrsWriteBlifArray2( FILE * pFile, Cba_Ntk_t * p, Vec_Int_t * vFanins )
assert( Vec_IntSize(vFanins) % 2 == 0 ); assert( Vec_IntSize(vFanins) % 2 == 0 );
Vec_IntForEachEntryDouble( vFanins, FormId, NameId, i ) Vec_IntForEachEntryDouble( vFanins, FormId, NameId, i )
fprintf( pFile, " %s=%s", Cba_NtkStr(p, FormId), Cba_NtkStr(p, NameId) ); fprintf( pFile, " %s=%s", Cba_NtkStr(p, FormId), Cba_NtkStr(p, NameId) );
fprintf( pFile, "\n" );
} }
void Cba_PrsWriteBlifLines( FILE * pFile, Cba_Ntk_t * p ) void Cba_PrsWriteBlifLines( FILE * pFile, Cba_Ntk_t * p )
{ {
...@@ -67,19 +68,19 @@ void Cba_PrsWriteBlifLines( FILE * pFile, Cba_Ntk_t * p ) ...@@ -67,19 +68,19 @@ void Cba_PrsWriteBlifLines( FILE * pFile, Cba_Ntk_t * p )
{ {
fprintf( pFile, ".names" ); fprintf( pFile, ".names" );
Cba_PrsWriteBlifArray( pFile, p, vFanins, 1 ); Cba_PrsWriteBlifArray( pFile, p, vFanins, 1 );
fprintf( pFile, " %s", Cba_NtkStr(p, Func) ); fprintf( pFile, "%s", Cba_NtkFuncStr(p, Func) );
} }
else if ( Type == CBA_PRS_BOX ) // .names/assign/box2 (no formal/actual binding) else if ( Type == CBA_PRS_BOX ) // .names/assign/box2 (no formal/actual binding)
{ {
fprintf( pFile, ".subckt" ); fprintf( pFile, ".subckt" );
fprintf( pFile, " %s", Cba_NtkFuncStr(p, Func) ); fprintf( pFile, " %s", Cba_NtkStr(p, Func) );
Cba_PrsWriteBlifArray2( pFile, p, vFanins ); Cba_PrsWriteBlifArray2( pFile, p, vFanins );
} }
else if ( Type == CBA_PRS_LATCH ) // .names/assign/box2 (no formal/actual binding) else if ( Type == CBA_PRS_LATCH ) // .names/assign/box2 (no formal/actual binding)
{ {
fprintf( pFile, ".latch" ); fprintf( pFile, ".latch" );
fprintf( pFile, " %s", Cba_NtkFuncStr(p, Vec_IntEntry(vFanins, 1)) ); fprintf( pFile, " %s", Cba_NtkStr(p, Vec_IntEntry(vFanins, 1)) );
fprintf( pFile, " %s", Cba_NtkFuncStr(p, Vec_IntEntry(vFanins, 0)) ); fprintf( pFile, " %s", Cba_NtkStr(p, Vec_IntEntry(vFanins, 0)) );
fprintf( pFile, " %c\n", '0' + Func ); fprintf( pFile, " %c\n", '0' + Func );
} }
} }
...@@ -89,7 +90,9 @@ void Cba_PrsWriteBlifNtk( FILE * pFile, Cba_Ntk_t * p ) ...@@ -89,7 +90,9 @@ void Cba_PrsWriteBlifNtk( FILE * pFile, Cba_Ntk_t * p )
assert( Vec_IntSize(&p->vFuncs) == Cba_NtkObjNum(p) ); assert( Vec_IntSize(&p->vFuncs) == Cba_NtkObjNum(p) );
// write header // write header
fprintf( pFile, ".model %s\n", Cba_NtkName(p) ); fprintf( pFile, ".model %s\n", Cba_NtkName(p) );
if ( Vec_IntSize(&p->vInouts) )
fprintf( pFile, ".inouts" ); fprintf( pFile, ".inouts" );
if ( Vec_IntSize(&p->vInouts) )
Cba_PrsWriteBlifArray( pFile, p, &p->vInouts, 0 ); Cba_PrsWriteBlifArray( pFile, p, &p->vInouts, 0 );
fprintf( pFile, ".inputs" ); fprintf( pFile, ".inputs" );
Cba_PrsWriteBlifArray( pFile, p, &p->vInputs, 0 ); Cba_PrsWriteBlifArray( pFile, p, &p->vInputs, 0 );
...@@ -97,7 +100,7 @@ void Cba_PrsWriteBlifNtk( FILE * pFile, Cba_Ntk_t * p ) ...@@ -97,7 +100,7 @@ void Cba_PrsWriteBlifNtk( FILE * pFile, Cba_Ntk_t * p )
Cba_PrsWriteBlifArray( pFile, p, &p->vOutputs, 0 ); Cba_PrsWriteBlifArray( pFile, p, &p->vOutputs, 0 );
// write objects // write objects
Cba_PrsWriteBlifLines( pFile, p ); Cba_PrsWriteBlifLines( pFile, p );
fprintf( pFile, ".end\n" ); fprintf( pFile, ".end\n\n" );
} }
void Cba_PrsWriteBlif( char * pFileName, Cba_Man_t * pDes ) void Cba_PrsWriteBlif( char * pFileName, Cba_Man_t * pDes )
{ {
......
...@@ -257,7 +257,7 @@ int Abc_NamStrHash( const char * pStr, const char * pLim, int nTableSize ) ...@@ -257,7 +257,7 @@ int Abc_NamStrHash( const char * pStr, const char * pLim, int nTableSize )
unsigned i, uHash; unsigned i, uHash;
if ( pLim ) if ( pLim )
{ {
for ( uHash = 0, i = 0; pStr < pLim; i++ ) for ( uHash = 0, i = 0; pStr+i < pLim; i++ )
if ( i & 1 ) if ( i & 1 )
uHash *= pStr[i] * s_FPrimes[i & 0x7F]; uHash *= pStr[i] * s_FPrimes[i & 0x7F];
else else
...@@ -285,6 +285,23 @@ int Abc_NamStrHash( const char * pStr, const char * pLim, int nTableSize ) ...@@ -285,6 +285,23 @@ int Abc_NamStrHash( const char * pStr, const char * pLim, int nTableSize )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline int Abc_NamStrcmp( char * pStr, char * pLim, char * pThis )
{
if ( pLim )
{
while ( pStr < pLim )
if ( *pStr++ != *pThis++ )
return 1;
return *pThis != '\0';
}
else
{
while ( *pStr )
if ( *pStr++ != *pThis++ )
return 1;
return *pThis != '\0';
}
}
static inline int * Abc_NamStrHashFind( Abc_Nam_t * p, const char * pStr, const char * pLim ) static inline int * Abc_NamStrHashFind( Abc_Nam_t * p, const char * pStr, const char * pLim )
{ {
char * pThis; char * pThis;
...@@ -293,7 +310,7 @@ static inline int * Abc_NamStrHashFind( Abc_Nam_t * p, const char * pStr, const ...@@ -293,7 +310,7 @@ static inline int * Abc_NamStrHashFind( Abc_Nam_t * p, const char * pStr, const
for ( pThis = (*pPlace)? Abc_NamIntToStr(p, *pPlace) : NULL; for ( pThis = (*pPlace)? Abc_NamIntToStr(p, *pPlace) : NULL;
pThis; pPlace = Abc_NamIntToNextP(p, *pPlace), pThis; pPlace = Abc_NamIntToNextP(p, *pPlace),
pThis = (*pPlace)? Abc_NamIntToStr(p, *pPlace) : NULL ) pThis = (*pPlace)? Abc_NamIntToStr(p, *pPlace) : NULL )
if ( !strcmp( pStr, pThis ) ) if ( !Abc_NamStrcmp( (char *)pStr, (char *)pLim, pThis ) )
break; break;
return pPlace; return pPlace;
} }
......
...@@ -201,6 +201,18 @@ static inline Vec_Str_t * Vec_StrDupArray( Vec_Str_t * pVec ) ...@@ -201,6 +201,18 @@ static inline Vec_Str_t * Vec_StrDupArray( Vec_Str_t * pVec )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline void Vec_StrZero( Vec_Str_t * p )
{
p->pArray = NULL;
p->nSize = 0;
p->nCap = 0;
}
static inline void Vec_StrErase( Vec_Str_t * p )
{
ABC_FREE( p->pArray );
p->nSize = 0;
p->nCap = 0;
}
static inline void Vec_StrFree( Vec_Str_t * p ) static inline void Vec_StrFree( Vec_Str_t * p )
{ {
ABC_FREE( p->pArray ); ABC_FREE( p->pArray );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment