61static inline void Prs_NtkAddBlifDirectives(
Prs_Man_t *
p )
64 for ( i = 1; s_BlifTypes[i]; i++ )
85static inline int Prs_CharIsSpace(
char c ) {
return c ==
' ' || c ==
'\t' || c ==
'\r'; }
86static inline int Prs_CharIsStop(
char c ) {
return c ==
'#' || c ==
'\\' || c ==
'\n' || c ==
'='; }
87static inline int Prs_CharIsLit(
char c ) {
return c ==
'0' || c ==
'1' || c ==
'-'; }
89static inline int Prs_ManIsSpace(
Prs_Man_t *
p ) {
return Prs_CharIsSpace(*
p->pCur); }
90static inline int Prs_ManIsStop(
Prs_Man_t *
p ) {
return Prs_CharIsStop(*
p->pCur); }
91static inline int Prs_ManIsLit(
Prs_Man_t *
p ) {
return Prs_CharIsLit(*
p->pCur); }
93static inline int Prs_ManIsChar(
Prs_Man_t *
p,
char c ) {
return *
p->pCur == c; }
94static inline int Prs_ManIsChar2(
Prs_Man_t *
p,
char c ) {
return *
p->pCur++ == c; }
96static inline void Prs_ManSkip(
Prs_Man_t *
p ) {
p->pCur++; }
97static inline char Prs_ManSkip2(
Prs_Man_t *
p ) {
return *
p->pCur++; }
111static inline void Prs_ManSkipToChar(
Prs_Man_t *
p,
char c )
113 while ( !Prs_ManIsChar(
p, c) )
116static inline void Prs_ManSkipSpaces(
Prs_Man_t *
p )
120 while ( Prs_ManIsSpace(
p) )
122 if ( Prs_ManIsChar(
p,
'\\') )
124 Prs_ManSkipToChar(
p,
'\n' );
128 if ( Prs_ManIsChar(
p,
'#') )
129 Prs_ManSkipToChar(
p,
'\n' );
134static inline int Prs_ManReadName(
Prs_Man_t *
p )
137 Prs_ManSkipSpaces(
p );
138 if ( Prs_ManIsChar(
p,
'\n') )
141 while ( !Prs_ManIsSpace(
p) && !Prs_ManIsStop(
p) )
143 if ( pStart ==
p->pCur )
150 Vec_IntClear( &
p->vTemp );
151 while ( (iToken = Prs_ManReadName(
p)) )
153 Vec_IntPush( &
p->vTemp, iToken );
154 Vec_IntPush( vOrder, Abc_Var2Lit2(iToken, Type) );
156 if ( Vec_IntSize(&
p->vTemp) == 0 )
return Prs_ManErrorSet(
p,
"Signal list is empty.", 1);
159static inline int Prs_ManReadList2(
Prs_Man_t *
p )
162 Vec_IntClear( &
p->vTemp );
163 while ( (iToken = Prs_ManReadName(
p)) )
164 Vec_IntPushTwo( &
p->vTemp, 0, iToken );
165 if ( Vec_IntSize(&
p->vTemp) == 0 )
return Prs_ManErrorSet(
p,
"Signal list is empty.", 1);
168static inline int Prs_ManReadList3(
Prs_Man_t *
p )
170 Vec_IntClear( &
p->vTemp );
171 while ( !Prs_ManIsChar(
p,
'\n') )
173 int iToken = Prs_ManReadName(
p);
174 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read formal name.", 1);
175 Vec_IntPush( &
p->vTemp, iToken );
176 Prs_ManSkipSpaces(
p );
177 if ( !Prs_ManIsChar2(
p,
'=') )
return Prs_ManErrorSet(
p,
"Cannot find symbol \"=\".", 1);
178 iToken = Prs_ManReadName(
p);
179 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read actual name.", 1);
180 Vec_IntPush( &
p->vTemp, iToken );
181 Prs_ManSkipSpaces(
p );
183 if ( Vec_IntSize(&
p->vTemp) == 0 )
return Prs_ManErrorSet(
p,
"Cannot read a list of formal/actual names.", 1);
184 if ( Vec_IntSize(&
p->vTemp) % 2 )
return Prs_ManErrorSet(
p,
"The number of formal/actual names is not even.", 1);
199static inline int Prs_ManReadCube(
Prs_Man_t *
p )
202 while ( Prs_ManIsLit(
p) )
203 Vec_StrPush( &
p->vCover, Prs_ManSkip2(
p) );
204 Prs_ManSkipSpaces(
p );
205 if ( Prs_ManIsChar(
p,
'\n') )
207 if ( Vec_StrSize(&
p->vCover) != 1 )
return Prs_ManErrorSet(
p,
"Cannot read cube.", 1);
209 Vec_StrPush( &
p->vCover, Vec_StrEntry(&
p->vCover,0) );
210 Vec_StrWriteEntry( &
p->vCover, 0,
' ' );
211 Vec_StrPush( &
p->vCover,
'\n' );
214 if ( !Prs_ManIsLit(
p) )
return Prs_ManErrorSet(
p,
"Cannot read output literal.", 1);
215 Vec_StrPush( &
p->vCover,
' ' );
216 Vec_StrPush( &
p->vCover, Prs_ManSkip2(
p) );
217 Vec_StrPush( &
p->vCover,
'\n' );
218 Prs_ManSkipSpaces(
p );
219 if ( !Prs_ManIsChar(
p,
'\n') )
return Prs_ManErrorSet(
p,
"Cannot read end of cube.", 1);
222static inline void Prs_ManSaveCover(
Prs_Man_t *
p )
225 if ( Vec_StrSize(&
p->vCover) == 0 )
226 p->pNtk->fHasC0s = 1;
227 else if ( Vec_StrSize(&
p->vCover) == 2 )
229 if ( Vec_StrEntryLast(&
p->vCover) ==
'0' )
230 p->pNtk->fHasC0s = 1;
231 else if ( Vec_StrEntryLast(&
p->vCover) ==
'1' )
232 p->pNtk->fHasC1s = 1;
235 assert( Vec_StrSize(&
p->vCover) > 0 );
236 Vec_StrPush( &
p->vCover,
'\0' );
239 Vec_StrClear( &
p->vCover );
241 assert( Prs_BoxNtk(
p->pNtk, Prs_NtkBoxNum(
p->pNtk)-1) == 1 );
242 Prs_BoxSetNtk(
p->pNtk, Prs_NtkBoxNum(
p->pNtk)-1, iToken );
256static inline int Prs_ManReadInouts(
Prs_Man_t *
p )
258 if ( Prs_ManReadList(
p, &
p->pNtk->vOrder, 3) )
return 1;
259 Vec_IntAppend( &
p->pNtk->vInouts, &
p->vTemp );
262static inline int Prs_ManReadInputs(
Prs_Man_t *
p )
264 if ( Prs_ManReadList(
p, &
p->pNtk->vOrder, 1) )
return 1;
265 Vec_IntAppend( &
p->pNtk->vInputs, &
p->vTemp );
268static inline int Prs_ManReadOutputs(
Prs_Man_t *
p )
270 if ( Prs_ManReadList(
p, &
p->pNtk->vOrder, 2) )
return 1;
271 Vec_IntAppend( &
p->pNtk->vOutputs, &
p->vTemp );
274static inline int Prs_ManReadNode(
Prs_Man_t *
p )
276 if ( Prs_ManReadList2(
p) )
return 1;
278 Prs_NtkAddBox(
p->pNtk, 1, 0, &
p->vTemp );
281static inline int Prs_ManReadBox(
Prs_Man_t *
p,
int fGate )
283 int iToken = Prs_ManReadName(
p);
284 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read model name.", 1);
285 if ( Prs_ManReadList3(
p) )
return 1;
287 Prs_NtkAddBox(
p->pNtk, iToken, 0, &
p->vTemp );
288 if ( fGate )
p->pNtk->fMapped = 1;
291static inline int Prs_ManReadLatch(
Prs_Man_t *
p )
293 int iToken = Prs_ManReadName(
p);
294 Vec_IntClear( &
p->vTemp );
295 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read latch input.", 1);
296 Vec_IntWriteEntry( &
p->vTemp, 1, iToken );
297 iToken = Prs_ManReadName(
p);
298 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read latch output.", 1);
299 Vec_IntWriteEntry( &
p->vTemp, 0, iToken );
300 Prs_ManSkipSpaces(
p );
301 if ( Prs_ManIsChar(
p,
'0') )
303 else if ( Prs_ManIsChar(
p,
'1') )
307 Prs_ManSkipToChar(
p,
'\n' );
309 Prs_NtkAddBox(
p->pNtk, -1, iToken, &
p->vTemp );
312static inline int Prs_ManReadShort(
Prs_Man_t *
p )
314 int iToken = Prs_ManReadName(
p);
315 Vec_IntClear( &
p->vTemp );
316 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read .short input.", 1);
317 Vec_IntWriteEntry( &
p->vTemp, 1, iToken );
318 iToken = Prs_ManReadName(
p);
319 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read .short output.", 1);
320 Vec_IntWriteEntry( &
p->vTemp, 0, iToken );
321 Prs_ManSkipSpaces(
p );
322 if ( !Prs_ManIsChar(
p,
'\n') )
return Prs_ManErrorSet(
p,
"Trailing symbols on .short line.", 1);
325 Prs_NtkAddBox(
p->pNtk, iToken, 0, &
p->vTemp );
328static inline int Prs_ManReadModel(
Prs_Man_t *
p )
331 if (
p->pNtk != NULL )
return Prs_ManErrorSet(
p,
"Parsing previous model is unfinished.", 1);
332 iToken = Prs_ManReadName(
p);
333 if ( iToken == 0 )
return Prs_ManErrorSet(
p,
"Cannot read model name.", 1);
334 Prs_ManInitializeNtk(
p, iToken, 0 );
335 Prs_ManSkipSpaces(
p );
336 if ( !Prs_ManIsChar(
p,
'\n') )
return Prs_ManErrorSet(
p,
"Trailing symbols on .model line.", 1);
339static inline int Prs_ManReadEnd(
Prs_Man_t *
p )
341 if (
p->pNtk == 0 )
return Prs_ManErrorSet(
p,
"Directive .end without .model.", 1);
343 Prs_ManFinalizeNtk(
p );
344 Prs_ManSkipSpaces(
p );
345 if ( !Prs_ManIsChar(
p,
'\n') )
return Prs_ManErrorSet(
p,
"Trailing symbols on .end line.", 1);
349static inline int Prs_ManReadDirective(
Prs_Man_t *
p )
352 if ( !Prs_ManIsChar(
p,
'.') )
353 return Prs_ManReadCube(
p );
354 if ( Vec_StrSize(&
p->vCover) > 0 )
355 Prs_ManSaveCover(
p );
356 iToken = Prs_ManReadName(
p );
358 return Prs_ManReadModel(
p );
360 return Prs_ManReadInouts(
p );
362 return Prs_ManReadInputs(
p );
364 return Prs_ManReadOutputs(
p );
366 return Prs_ManReadNode(
p );
368 return Prs_ManReadBox(
p, 0 );
370 return Prs_ManReadBox(
p, 1 );
372 return Prs_ManReadLatch(
p );
374 return Prs_ManReadShort(
p );
376 return Prs_ManReadEnd(
p );
377 printf(
"Cannot read directive \"%s\".\n",
Abc_NamStr(
p->pStrs, iToken) );
380static inline int Prs_ManReadLines(
Prs_Man_t *
p )
382 while (
p->pCur[1] !=
'\0' )
384 assert( Prs_ManIsChar(
p,
'\n') );
386 Prs_ManSkipSpaces(
p );
387 if ( Prs_ManIsChar(
p,
'\n') )
389 if ( Prs_ManReadDirective(
p) )
414 Prs_NtkAddBlifDirectives(
p );
415 Prs_ManReadLines(
p );
416 if ( Prs_ManErrorPrint(
p) )
438 printf(
"Finished reading %d networks. ", Vec_PtrSize(vPrs) );
440 printf(
"Memory = %.2f MB. ", 1.0*Prs_ManMemory(vPrs)/(1<<20) );
441 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
444 Prs_ManVecFree( vPrs );
460 int iFon = Cba_NtkGetMap(
p, NameId );
463 printf(
"Network \"%s\": Signal \"%s\" is not driven.\n", Cba_NtkName(
p), Cba_NtkStr(
p, NameId) );
468 int i, NameId, iObj, iFon;
469 Cba_NtkCleanObjFuncs(
p );
470 Cba_NtkCleanObjNames(
p );
471 Cba_NtkCleanFonNames(
p );
476 Cba_ObjSetName(
p, iObj, NameId );
477 iFon = Cba_ObjFon0(
p, iObj);
478 Cba_FonSetName(
p, iFon, NameId );
479 Cba_NtkSetMap(
p, NameId, iFon );
480 Vec_IntPush( &
p->vOrder, iObj );
486 Cba_ObjSetName(
p, iObj, NameId );
487 Vec_IntPush( &
p->vOrder, iObj );
493 int i, k, iObj, iTerm, iFon, FormId, ActId;
495 Cba_NtkCleanMap(
p );
497 Cba_NtkSetMap(
p, Cba_ObjName(
p, iObj), Cba_ObjFon0(
p, iObj) );
501 int FuncId = Prs_BoxNtk(pNtk, i);
502 assert( Prs_BoxIONum(pNtk, i) > 0 );
503 assert( Vec_IntSize(vBox) % 2 == 0 );
507 Cba_NtkSetMap(
p, Vec_IntEntry(vBox, 3), Cba_ObjFon0(
p, iObj) );
508 Cba_ObjSetFunc(
p, iObj, Prs_BoxName(pNtk, i)+1 );
510 else if ( Prs_BoxIsNode(pNtk, i) )
512 iObj = Cba_ObjAlloc(
p,
CBA_BOX_NODE, Prs_BoxIONum(pNtk, i)-1, 1 );
513 Cba_FonSetName(
p, Cba_ObjFon0(
p, iObj), Vec_IntEntryLast(vBox) );
514 Cba_NtkSetMap(
p, Vec_IntEntryLast(vBox), Cba_ObjFon0(
p, iObj) );
515 Cba_ObjSetFunc(
p, iObj, FuncId );
519 Cba_Ntk_t * pBox = Cba_ManNtkFind(
p->pDesign, Prs_NtkStr(pNtk, FuncId) );
520 iObj = Cba_ObjAlloc(
p,
CBA_OBJ_BOX, Cba_NtkPiNum(pBox), Cba_NtkPoNum(pBox) );
521 Cba_ObjSetFunc(
p, iObj, Cba_NtkId(pBox) );
523 Cba_NtkCleanMap2(
p );
525 Cba_NtkSetMap2(
p, Cba_ObjName(pBox, iTerm), k+1 );
528 if ( Cba_NtkGetMap2(
p, FormId) )
530 iFon = Cba_ObjFon(
p, iObj, Cba_NtkGetMap2(
p, FormId)-1);
531 Cba_FonSetName(
p, iFon, ActId );
532 Cba_NtkSetMap(
p, ActId, iFon );
539 iObj = Cba_NtkPiNum(
p) + Cba_NtkPoNum(
p) + i + 1;
540 if ( Prs_BoxNtk(pNtk, i) == -1 )
545 Cba_ObjSetFinFon(
p, iObj, 0, iFon );
547 else if ( Prs_BoxIsNode(pNtk, i) )
552 if ( k == 2 * Cba_ObjFinNum(
p, iObj) )
556 Cba_ObjSetFinFon(
p, iObj, k/2, iFon );
563 assert( Cba_NtkPiNum(pBox) == Cba_ObjFinNum(
p, iObj) );
564 assert( Cba_NtkPoNum(pBox) == Cba_ObjFonNum(
p, iObj) );
565 Cba_NtkCleanMap2(
p );
567 Cba_NtkSetMap2(
p, Cba_ObjName(pBox, iTerm), k+1 );
570 if ( Cba_NtkGetMap2(
p, FormId) )
574 Cba_ObjSetFinFon(
p, iObj, Cba_NtkGetMap2(
p, FormId)-1, iFon );
583 Cba_ObjSetFinFon(
p, iObj, 0, iFon );
590 Prs_Ntk_t * pPrsRoot = Prs_ManRoot(vDes);
595 Cba_Man_t *
p = Cba_ManAlloc( pFileName, Vec_PtrSize(vDes), pStrs, pFuns, pMods, NULL );
599 Cba_Ntk_t * pNtk = Cba_NtkAlloc(
p, Prs_NtkId(pPrsNtk), Prs_NtkPiNum(pPrsNtk), Prs_NtkPoNum(pPrsNtk), Prs_NtkObjNum(pPrsNtk), 100, 100 );
601 Cba_NtkAdd(
p, pNtk );
606 printf(
"Elaboration module \"%s\"...\n", Prs_NtkName(pPrsNtk) );
612 printf(
"Quitting because of errors.\n" );
614 Cba_ManPrepareSeq(
p );
633 if ( vDes && Vec_PtrSize(vDes) )
636 Prs_ManVecFree( vDes );
#define ABC_SWAP(Type, a, b)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Prs_NtkForEachPo(p, NameId, i)
struct Prs_Man_t_ Prs_Man_t
#define Prs_NtkForEachPi(p, NameId, i)
struct Prs_Ntk_t_ Prs_Ntk_t
BASIC TYPES ///.
#define Prs_NtkForEachBox(p, vVec, i)
Cba_Man_t * Cba_ManReadBlif(char *pFileName)
void Prs_ManReadBlifTest(char *pFileName)
int Prs_CreateBlifFindFon(Cba_Ntk_t *p, int NameId)
int Prs_CreateBlifNtk(Cba_Ntk_t *p, Prs_Ntk_t *pNtk)
void Prs_CreateBlifPio(Cba_Ntk_t *p, Prs_Ntk_t *pNtk)
Cba_BlifType_t
DECLARATIONS ///.
Cba_Man_t * Prs_ManBuildCbaBlif(char *pFileName, Vec_Ptr_t *vDes)
Vec_Ptr_t * Prs_ManReadBlif(char *pFileName)
void Prs_ManWriteBlif(char *pFileName, Vec_Ptr_t *p)
#define Cba_NtkForEachPo(p, iObj, i)
typedefABC_NAMESPACE_HEADER_START struct Cba_Ntk_t_ Cba_Ntk_t
INCLUDES ///.
struct Cba_Man_t_ Cba_Man_t
#define Cba_NtkForEachPi(p, iObj, i)
int Abc_NamStrFindOrAddLim(Abc_Nam_t *p, char *pStr, char *pLim, int *pfFound)
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
int Abc_NamObjNumMax(Abc_Nam_t *p)
Abc_Nam_t * Abc_NamStart(int nObjs, int nAveSize)
FUNCTION DEFINITIONS ///.
Abc_Nam_t * Abc_NamRef(Abc_Nam_t *p)
char * Abc_NamStr(Abc_Nam_t *p, int NameId)
typedefABC_NAMESPACE_HEADER_START struct Abc_Nam_t_ Abc_Nam_t
INCLUDES ///.
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.