Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
abc
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
abc
Commits
705006a6
Commit
705006a6
authored
Dec 03, 2014
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Changes to the parser.
parent
e970aa85
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
354 additions
and
187 deletions
+354
-187
src/base/abci/abc.c
+4
-0
src/base/cba/cba.h
+20
-2
src/base/cba/cbaPrs.h
+33
-37
src/base/cba/cbaReadBlif.c
+234
-117
src/base/cba/cbaReadVer.c
+24
-24
src/base/cba/cbaWriteBlif.c
+8
-5
src/misc/util/utilNam.c
+19
-2
src/misc/vec/vecStr.h
+12
-0
No files found.
src/base/abci/abc.c
View file @
705006a6
...
@@ -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
"
);
src/base/cba/cba.h
View file @
705006a6
...
@@ -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 =========================================================*/
...
...
src/base/cba/cbaPrs.h
View file @
705006a6
...
@@ -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
(
&
p
Ntk
->
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_Int
FreeP
(
&
p
->
vInoutsCur
);
Vec_Int
Erase
(
&
p
->
vInoutsCur
);
Vec_Int
FreeP
(
&
p
->
vInputsCur
);
Vec_Int
Erase
(
&
p
->
vInputsCur
);
Vec_Int
FreeP
(
&
p
->
vOutputsCur
);
Vec_Int
Erase
(
&
p
->
vOutputsCur
);
Vec_Int
FreeP
(
&
p
->
vWiresCur
);
Vec_Int
Erase
(
&
p
->
vWiresCur
);
Vec_Int
FreeP
(
&
p
->
vTypesCur
);
Vec_Int
Erase
(
&
p
->
vTypesCur
);
Vec_Int
FreeP
(
&
p
->
vFuncsCur
);
Vec_Int
Erase
(
&
p
->
vFuncsCur
);
Vec_Int
FreeP
(
&
p
->
vInstIdsCur
);
Vec_Int
Erase
(
&
p
->
vInstIdsCur
);
Vec_WecFreeP
(
&
p
->
vFaninsCur
);
ABC_FREE
(
p
->
vFaninsCur
.
pArray
);
// temporary
// temporary
Vec_Str
FreeP
(
&
p
->
vCover
);
Vec_Str
Erase
(
&
p
->
vCover
);
Vec_Int
FreeP
(
&
p
->
vTemp
);
Vec_Int
Erase
(
&
p
->
vTemp
);
Vec_Int
FreeP
(
&
p
->
vTemp2
);
Vec_Int
Erase
(
&
p
->
vTemp2
);
ABC_FREE
(
p
->
pBuffer
);
ABC_FREE
(
p
->
pBuffer
);
ABC_FREE
(
p
);
ABC_FREE
(
p
);
}
}
...
...
src/base/cba/cbaReadBlif.c
View file @
705006a6
...
@@ -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_PrsRead
Name2
(
Cba_Prs_t
*
p
)
static
inline
int
Cba_PrsRead
List
(
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_PrsRead
Signals
(
Cba_Prs_t
*
p
,
int
fSkipFirst
)
static
inline
int
Cba_PrsRead
Inouts
(
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_PrsRead
Signals
(
p
,
0
)
)
return
1
;
if
(
Cba_PrsRead
List
(
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_PrsRead
Signals
(
p
,
0
)
)
return
1
;
if
(
Cba_PrsRead
List
(
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_PrsRead
Model
(
Cba_Prs_t
*
p
)
static
inline
int
Cba_PrsRead
Short
(
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 ///
...
...
src/base/cba/cbaReadVer.c
View file @
705006a6
...
@@ -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
...
...
src/base/cba/cbaWriteBlif.c
View file @
705006a6
...
@@ -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_Ntk
Str
(
p
,
Func
)
);
fprintf
(
pFile
,
"
%s"
,
Cba_NtkFunc
Str
(
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_Ntk
Func
Str
(
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_Ntk
Func
Str
(
p
,
Vec_IntEntry
(
vFanins
,
1
))
);
fprintf
(
pFile
,
" %s"
,
Cba_NtkStr
(
p
,
Vec_IntEntry
(
vFanins
,
1
))
);
fprintf
(
pFile
,
" %s"
,
Cba_Ntk
Func
Str
(
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
)
{
{
...
...
src/misc/util/utilNam.c
View file @
705006a6
...
@@ -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
;
}
}
...
...
src/misc/vec/vecStr.h
View file @
705006a6
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment