ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cbaReadBlif.c
Go to the documentation of this file.
1
20
21#include "cba.h"
22#include "cbaPrs.h"
23
25
29
30// BLIF keywords
31typedef enum {
32 PRS_BLIF_NONE = 0, // 0: unused
33 PRS_BLIF_MODEL, // 1: .model
34 PRS_BLIF_INOUTS, // 2: .inouts
35 PRS_BLIF_INPUTS, // 3: .inputs
36 PRS_BLIF_OUTPUTS, // 4: .outputs
37 PRS_BLIF_NAMES, // 5: .names
38 PRS_BLIF_SUBCKT, // 6: .subckt
39 PRS_BLIF_GATE, // 7: .gate
40 PRS_BLIF_LATCH, // 8: .latch
41 PRS_BLIF_SHORT, // 9: .short
42 PRS_BLIF_END, // 10: .end
43 PRS_BLIF_UNKNOWN // 11: unknown
45
46static const char * s_BlifTypes[PRS_BLIF_UNKNOWN+1] = {
47 NULL, // 0: unused
48 ".model", // 1: .model
49 ".inouts", // 2: .inputs
50 ".inputs", // 3: .inputs
51 ".outputs", // 4: .outputs
52 ".names", // 5: .names
53 ".subckt", // 6: .subckt
54 ".gate", // 7: .gate
55 ".latch", // 8: .latch
56 ".short", // 9: .short
57 ".end", // 10: .end
58 NULL // 11: unknown
59};
60
61static inline void Prs_NtkAddBlifDirectives( Prs_Man_t * p )
62{
63 int i;
64 for ( i = 1; s_BlifTypes[i]; i++ )
65 Abc_NamStrFindOrAdd( p->pStrs, (char *)s_BlifTypes[i], NULL );
66 assert( Abc_NamObjNumMax(p->pStrs) == i );
67}
68
69
73
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 == '-'; }
88
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); }
92
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; }
95
96static inline void Prs_ManSkip( Prs_Man_t * p ) { p->pCur++; }
97static inline char Prs_ManSkip2( Prs_Man_t * p ) { return *p->pCur++; }
98
99
111static inline void Prs_ManSkipToChar( Prs_Man_t * p, char c )
112{
113 while ( !Prs_ManIsChar(p, c) )
114 Prs_ManSkip(p);
115}
116static inline void Prs_ManSkipSpaces( Prs_Man_t * p )
117{
118 while ( 1 )
119 {
120 while ( Prs_ManIsSpace(p) )
121 Prs_ManSkip(p);
122 if ( Prs_ManIsChar(p, '\\') )
123 {
124 Prs_ManSkipToChar( p, '\n' );
125 Prs_ManSkip(p);
126 continue;
127 }
128 if ( Prs_ManIsChar(p, '#') )
129 Prs_ManSkipToChar( p, '\n' );
130 break;
131 }
132 assert( !Prs_ManIsSpace(p) );
133}
134static inline int Prs_ManReadName( Prs_Man_t * p )
135{
136 char * pStart;
137 Prs_ManSkipSpaces( p );
138 if ( Prs_ManIsChar(p, '\n') )
139 return 0;
140 pStart = p->pCur;
141 while ( !Prs_ManIsSpace(p) && !Prs_ManIsStop(p) )
142 Prs_ManSkip(p);
143 if ( pStart == p->pCur )
144 return 0;
145 return Abc_NamStrFindOrAddLim( p->pStrs, pStart, p->pCur, NULL );
146}
147static inline int Prs_ManReadList( Prs_Man_t * p, Vec_Int_t * vOrder, int Type )
148{
149 int iToken;
150 Vec_IntClear( &p->vTemp );
151 while ( (iToken = Prs_ManReadName(p)) )
152 {
153 Vec_IntPush( &p->vTemp, iToken );
154 Vec_IntPush( vOrder, Abc_Var2Lit2(iToken, Type) );
155 }
156 if ( Vec_IntSize(&p->vTemp) == 0 ) return Prs_ManErrorSet(p, "Signal list is empty.", 1);
157 return 0;
158}
159static inline int Prs_ManReadList2( Prs_Man_t * p )
160{
161 int iToken;
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);
166 return 0;
167}
168static inline int Prs_ManReadList3( Prs_Man_t * p )
169{
170 Vec_IntClear( &p->vTemp );
171 while ( !Prs_ManIsChar(p, '\n') )
172 {
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 );
182 }
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);
185 return 0;
186}
187
199static inline int Prs_ManReadCube( Prs_Man_t * p )
200{
201 assert( Prs_ManIsLit(p) );
202 while ( Prs_ManIsLit(p) )
203 Vec_StrPush( &p->vCover, Prs_ManSkip2(p) );
204 Prs_ManSkipSpaces( p );
205 if ( Prs_ManIsChar(p, '\n') )
206 {
207 if ( Vec_StrSize(&p->vCover) != 1 ) return Prs_ManErrorSet(p, "Cannot read cube.", 1);
208 // fix single literal cube by adding space
209 Vec_StrPush( &p->vCover, Vec_StrEntry(&p->vCover,0) );
210 Vec_StrWriteEntry( &p->vCover, 0, ' ' );
211 Vec_StrPush( &p->vCover, '\n' );
212 return 0;
213 }
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);
220 return 0;
221}
222static inline void Prs_ManSaveCover( Prs_Man_t * p )
223{
224 int iToken;
225 if ( Vec_StrSize(&p->vCover) == 0 )
226 p->pNtk->fHasC0s = 1;
227 else if ( Vec_StrSize(&p->vCover) == 2 )
228 {
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;
233 else assert( 0 );
234 }
235 assert( Vec_StrSize(&p->vCover) > 0 );
236 Vec_StrPush( &p->vCover, '\0' );
237// iToken = Ptr_SopToType( Vec_StrArray(&p->vCover) );
238 iToken = Abc_NamStrFindOrAdd( p->pFuns, Vec_StrArray(&p->vCover), NULL );
239 Vec_StrClear( &p->vCover );
240 // set the cover to the module of this box
241 assert( Prs_BoxNtk(p->pNtk, Prs_NtkBoxNum(p->pNtk)-1) == 1 ); // default const 0
242 Prs_BoxSetNtk( p->pNtk, Prs_NtkBoxNum(p->pNtk)-1, iToken );
243}
244
256static inline int Prs_ManReadInouts( Prs_Man_t * p )
257{
258 if ( Prs_ManReadList(p, &p->pNtk->vOrder, 3) ) return 1;
259 Vec_IntAppend( &p->pNtk->vInouts, &p->vTemp );
260 return 0;
261}
262static inline int Prs_ManReadInputs( Prs_Man_t * p )
263{
264 if ( Prs_ManReadList(p, &p->pNtk->vOrder, 1) ) return 1;
265 Vec_IntAppend( &p->pNtk->vInputs, &p->vTemp );
266 return 0;
267}
268static inline int Prs_ManReadOutputs( Prs_Man_t * p )
269{
270 if ( Prs_ManReadList(p, &p->pNtk->vOrder, 2) ) return 1;
271 Vec_IntAppend( &p->pNtk->vOutputs, &p->vTemp );
272 return 0;
273}
274static inline int Prs_ManReadNode( Prs_Man_t * p )
275{
276 if ( Prs_ManReadList2(p) ) return 1;
277 // save results
278 Prs_NtkAddBox( p->pNtk, 1, 0, &p->vTemp ); // default const 0 function
279 return 0;
280}
281static inline int Prs_ManReadBox( Prs_Man_t * p, int fGate )
282{
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;
286 // save results
287 Prs_NtkAddBox( p->pNtk, iToken, 0, &p->vTemp );
288 if ( fGate ) p->pNtk->fMapped = 1;
289 return 0;
290}
291static inline int Prs_ManReadLatch( Prs_Man_t * p )
292{
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') )
302 iToken = 0;
303 else if ( Prs_ManIsChar(p, '1') )
304 iToken = 1;
305 else
306 iToken = 2;
307 Prs_ManSkipToChar( p, '\n' );
308 // save results
309 Prs_NtkAddBox( p->pNtk, -1, iToken, &p->vTemp ); // -1 stands for latch
310 return 0;
311}
312static inline int Prs_ManReadShort( Prs_Man_t * p )
313{
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);
323 // save results
324 iToken = Abc_NamStrFindOrAdd( p->pStrs, "1 1\n", NULL );
325 Prs_NtkAddBox( p->pNtk, iToken, 0, &p->vTemp );
326 return 0;
327}
328static inline int Prs_ManReadModel( Prs_Man_t * p )
329{
330 int iToken;
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);
337 return 0;
338}
339static inline int Prs_ManReadEnd( Prs_Man_t * p )
340{
341 if ( p->pNtk == 0 ) return Prs_ManErrorSet(p, "Directive .end without .model.", 1);
342 //printf( "Saving model \"%s\".\n", Abc_NamStr(p->pStrs, p->iModuleName) );
343 Prs_ManFinalizeNtk( p );
344 Prs_ManSkipSpaces( p );
345 if ( !Prs_ManIsChar(p, '\n') ) return Prs_ManErrorSet(p, "Trailing symbols on .end line.", 1);
346 return 0;
347}
348
349static inline int Prs_ManReadDirective( Prs_Man_t * p )
350{
351 int iToken;
352 if ( !Prs_ManIsChar(p, '.') )
353 return Prs_ManReadCube( p );
354 if ( Vec_StrSize(&p->vCover) > 0 ) // SOP was specified for the previous node
355 Prs_ManSaveCover( p );
356 iToken = Prs_ManReadName( p );
357 if ( iToken == PRS_BLIF_MODEL )
358 return Prs_ManReadModel( p );
359 if ( iToken == PRS_BLIF_INOUTS )
360 return Prs_ManReadInouts( p );
361 if ( iToken == PRS_BLIF_INPUTS )
362 return Prs_ManReadInputs( p );
363 if ( iToken == PRS_BLIF_OUTPUTS )
364 return Prs_ManReadOutputs( p );
365 if ( iToken == PRS_BLIF_NAMES )
366 return Prs_ManReadNode( p );
367 if ( iToken == PRS_BLIF_SUBCKT )
368 return Prs_ManReadBox( p, 0 );
369 if ( iToken == PRS_BLIF_GATE )
370 return Prs_ManReadBox( p, 1 );
371 if ( iToken == PRS_BLIF_LATCH )
372 return Prs_ManReadLatch( p );
373 if ( iToken == PRS_BLIF_SHORT )
374 return Prs_ManReadShort( p );
375 if ( iToken == PRS_BLIF_END )
376 return Prs_ManReadEnd( p );
377 printf( "Cannot read directive \"%s\".\n", Abc_NamStr(p->pStrs, iToken) );
378 return 1;
379}
380static inline int Prs_ManReadLines( Prs_Man_t * p )
381{
382 while ( p->pCur[1] != '\0' )
383 {
384 assert( Prs_ManIsChar(p, '\n') );
385 Prs_ManSkip(p);
386 Prs_ManSkipSpaces( p );
387 if ( Prs_ManIsChar(p, '\n') )
388 continue;
389 if ( Prs_ManReadDirective(p) )
390 return 1;
391 }
392 return 0;
393}
394
406Vec_Ptr_t * Prs_ManReadBlif( char * pFileName )
407{
408 Vec_Ptr_t * vPrs = NULL;
409 Prs_Man_t * p = Prs_ManAlloc( pFileName );
410 if ( p == NULL )
411 return NULL;
412 Abc_NamStrFindOrAdd( p->pFuns, " 0\n", NULL );
413 Abc_NamStrFindOrAdd( p->pFuns, " 1\n", NULL );
414 Prs_NtkAddBlifDirectives( p );
415 Prs_ManReadLines( p );
416 if ( Prs_ManErrorPrint(p) )
417 ABC_SWAP( Vec_Ptr_t *, vPrs, p->vNtks );
418 Prs_ManFree( p );
419 return vPrs;
420}
421
433void Prs_ManReadBlifTest( char * pFileName )
434{
435 abctime clk = Abc_Clock();
436 Vec_Ptr_t * vPrs = Prs_ManReadBlif( pFileName );
437 if ( !vPrs ) return;
438 printf( "Finished reading %d networks. ", Vec_PtrSize(vPrs) );
439 printf( "NameIDs = %d. ", Abc_NamObjNumMax(Prs_ManNameMan(vPrs)) );
440 printf( "Memory = %.2f MB. ", 1.0*Prs_ManMemory(vPrs)/(1<<20) );
441 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
442// Abc_NamPrint( p->pStrs );
443 Prs_ManWriteBlif( Extra_FileNameGenericAppend(pFileName, "_out.blif"), vPrs );
444 Prs_ManVecFree( vPrs );
445}
446
459{
460 int iFon = Cba_NtkGetMap( p, NameId );
461 if ( iFon )
462 return iFon;
463 printf( "Network \"%s\": Signal \"%s\" is not driven.\n", Cba_NtkName(p), Cba_NtkStr(p, NameId) );
464 return 0;
465}
467{
468 int i, NameId, iObj, iFon;
469 Cba_NtkCleanObjFuncs( p );
470 Cba_NtkCleanObjNames( p );
471 Cba_NtkCleanFonNames( p );
472 // create inputs
473 Prs_NtkForEachPi( pNtk, NameId, i )
474 {
475 iObj = Cba_ObjAlloc( p, CBA_OBJ_PI, 0, 1 );
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 );
481 }
482 // create outputs
483 Prs_NtkForEachPo( pNtk, NameId, i )
484 {
485 iObj = Cba_ObjAlloc( p, CBA_OBJ_PO, 1, 0 );
486 Cba_ObjSetName( p, iObj, NameId );
487 Vec_IntPush( &p->vOrder, iObj );
488 }
489}
491{
492 Vec_Int_t * vBox;
493 int i, k, iObj, iTerm, iFon, FormId, ActId;
494 // map inputs
495 Cba_NtkCleanMap( p );
496 Cba_NtkForEachPi( p, iObj, i )
497 Cba_NtkSetMap( p, Cba_ObjName(p, iObj), Cba_ObjFon0(p, iObj) );
498 // create objects
499 Prs_NtkForEachBox( pNtk, vBox, i )
500 {
501 int FuncId = Prs_BoxNtk(pNtk, i);
502 assert( Prs_BoxIONum(pNtk, i) > 0 );
503 assert( Vec_IntSize(vBox) % 2 == 0 );
504 if ( FuncId == -1 ) // latch
505 {
506 iObj = Cba_ObjAlloc( p, CBA_BOX_DFFRS, 4, 1 );
507 Cba_NtkSetMap( p, Vec_IntEntry(vBox, 3), Cba_ObjFon0(p, iObj) ); // latch output
508 Cba_ObjSetFunc( p, iObj, Prs_BoxName(pNtk, i)+1 ); // init + 1
509 }
510 else if ( Prs_BoxIsNode(pNtk, i) ) // node
511 {
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) ); // node output
514 Cba_NtkSetMap( p, Vec_IntEntryLast(vBox), Cba_ObjFon0(p, iObj) );
515 Cba_ObjSetFunc( p, iObj, FuncId );
516 }
517 else // box
518 {
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) );
522 // mark PO objects
523 Cba_NtkCleanMap2( p );
524 Cba_NtkForEachPo( pBox, iTerm, k )
525 Cba_NtkSetMap2( p, Cba_ObjName(pBox, iTerm), k+1 );
526 // map box fons
527 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
528 if ( Cba_NtkGetMap2(p, FormId) )
529 {
530 iFon = Cba_ObjFon(p, iObj, Cba_NtkGetMap2(p, FormId)-1);
531 Cba_FonSetName( p, iFon, ActId );
532 Cba_NtkSetMap( p, ActId, iFon );
533 }
534 }
535 }
536 // connect objects
537 Prs_NtkForEachBox( pNtk, vBox, i )
538 {
539 iObj = Cba_NtkPiNum(p) + Cba_NtkPoNum(p) + i + 1;
540 if ( Prs_BoxNtk(pNtk, i) == -1 ) // latch
541 {
542 assert( Cba_ObjType(p, iObj) == CBA_BOX_DFFRS );
543 iFon = Prs_CreateBlifFindFon( p, Vec_IntEntry(vBox, 1) ); // latch input
544 if ( iFon )
545 Cba_ObjSetFinFon( p, iObj, 0, iFon );
546 }
547 else if ( Prs_BoxIsNode(pNtk, i) ) // node
548 {
549 assert( Cba_ObjType(p, iObj) == CBA_BOX_NODE );
550 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
551 {
552 if ( k == 2 * Cba_ObjFinNum(p, iObj) ) // stop at node output
553 break;
554 iFon = Prs_CreateBlifFindFon( p, ActId );
555 if ( iFon )
556 Cba_ObjSetFinFon( p, iObj, k/2, iFon );
557 }
558 }
559 else // box
560 {
561 // mark PI objects
562 Cba_Ntk_t * pBox = Cba_ObjNtk(p, iObj);
563 assert( Cba_NtkPiNum(pBox) == Cba_ObjFinNum(p, iObj) );
564 assert( Cba_NtkPoNum(pBox) == Cba_ObjFonNum(p, iObj) );
565 Cba_NtkCleanMap2( p );
566 Cba_NtkForEachPi( pBox, iTerm, k )
567 Cba_NtkSetMap2( p, Cba_ObjName(pBox, iTerm), k+1 );
568 // connect box fins
569 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
570 if ( Cba_NtkGetMap2(p, FormId) )
571 {
572 iFon = Prs_CreateBlifFindFon( p, ActId );
573 if ( iFon )
574 Cba_ObjSetFinFon( p, iObj, Cba_NtkGetMap2(p, FormId)-1, iFon );
575 }
576 }
577 }
578 // connect outputs
579 Cba_NtkForEachPo( p, iObj, i )
580 {
581 iFon = Prs_CreateBlifFindFon( p, Cba_ObjName(p, iObj) );
582 if ( iFon )
583 Cba_ObjSetFinFon( p, iObj, 0, iFon );
584 }
585 return 0;
586}
587Cba_Man_t * Prs_ManBuildCbaBlif( char * pFileName, Vec_Ptr_t * vDes )
588{
589 Prs_Ntk_t * pPrsNtk; int i, fError = 0;
590 Prs_Ntk_t * pPrsRoot = Prs_ManRoot(vDes);
591 // start the manager
592 Abc_Nam_t * pStrs = Abc_NamRef(pPrsRoot->pStrs);
593 Abc_Nam_t * pFuns = Abc_NamRef(pPrsRoot->pFuns);
594 Abc_Nam_t * pMods = Abc_NamStart( 100, 24 );
595 Cba_Man_t * p = Cba_ManAlloc( pFileName, Vec_PtrSize(vDes), pStrs, pFuns, pMods, NULL );
596 // initialize networks
597 Vec_PtrForEachEntry( Prs_Ntk_t *, vDes, pPrsNtk, i )
598 {
599 Cba_Ntk_t * pNtk = Cba_NtkAlloc( p, Prs_NtkId(pPrsNtk), Prs_NtkPiNum(pPrsNtk), Prs_NtkPoNum(pPrsNtk), Prs_NtkObjNum(pPrsNtk), 100, 100 );
600 Prs_CreateBlifPio( pNtk, pPrsNtk );
601 Cba_NtkAdd( p, pNtk );
602 }
603 // create networks
604 Vec_PtrForEachEntry( Prs_Ntk_t *, vDes, pPrsNtk, i )
605 {
606 printf( "Elaboration module \"%s\"...\n", Prs_NtkName(pPrsNtk) );
607 fError = Prs_CreateBlifNtk( Cba_ManNtk(p, i+1), pPrsNtk );
608 if ( fError )
609 break;
610 }
611 if ( fError )
612 printf( "Quitting because of errors.\n" );
613 else
614 Cba_ManPrepareSeq( p );
615 return p;
616}
617
629Cba_Man_t * Cba_ManReadBlif( char * pFileName )
630{
631 Cba_Man_t * p = NULL;
632 Vec_Ptr_t * vDes = Prs_ManReadBlif( pFileName );
633 if ( vDes && Vec_PtrSize(vDes) )
634 p = Prs_ManBuildCbaBlif( pFileName, vDes );
635 if ( vDes )
636 Prs_ManVecFree( vDes );
637 return p;
638}
639
643
644
646
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
@ PRS_BLIF_UNKNOWN
Definition bacReadBlif.c:43
@ PRS_BLIF_INPUTS
Definition bacReadBlif.c:35
@ PRS_BLIF_LATCH
Definition bacReadBlif.c:40
@ PRS_BLIF_MODEL
Definition bacReadBlif.c:33
@ PRS_BLIF_GATE
Definition bacReadBlif.c:39
@ PRS_BLIF_SUBCKT
Definition bacReadBlif.c:38
@ PRS_BLIF_OUTPUTS
Definition bacReadBlif.c:36
@ PRS_BLIF_NONE
Definition bacReadBlif.c:32
@ PRS_BLIF_END
Definition bacReadBlif.c:42
@ PRS_BLIF_SHORT
Definition bacReadBlif.c:41
@ PRS_BLIF_NAMES
Definition bacReadBlif.c:37
@ PRS_BLIF_INOUTS
Definition bacReadBlif.c:34
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define Prs_NtkForEachPo(p, NameId, i)
Definition cbaPrs.h:180
struct Prs_Man_t_ Prs_Man_t
Definition cbaPrs.h:107
#define Prs_NtkForEachPi(p, NameId, i)
Definition cbaPrs.h:178
struct Prs_Ntk_t_ Prs_Ntk_t
BASIC TYPES ///.
Definition cbaPrs.h:73
#define Prs_NtkForEachBox(p, vVec, i)
Definition cbaPrs.h:182
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 ///.
Definition cbaReadBlif.c:31
Cba_Man_t * Prs_ManBuildCbaBlif(char *pFileName, Vec_Ptr_t *vDes)
Vec_Ptr_t * Prs_ManReadBlif(char *pFileName)
@ CBA_OBJ_BOX
Definition cbaTypes.h:43
@ CBA_BOX_NODE
Definition cbaTypes.h:121
@ CBA_OBJ_PI
Definition cbaTypes.h:41
@ CBA_OBJ_PO
Definition cbaTypes.h:42
@ CBA_BOX_DFFRS
Definition cbaTypes.h:139
void Prs_ManWriteBlif(char *pFileName, Vec_Ptr_t *p)
#define Cba_NtkForEachPo(p, iObj, i)
Definition cba.h:310
typedefABC_NAMESPACE_HEADER_START struct Cba_Ntk_t_ Cba_Ntk_t
INCLUDES ///.
Definition cba.h:45
struct Cba_Man_t_ Cba_Man_t
Definition cba.h:46
#define Cba_NtkForEachPi(p, iObj, i)
Definition cba.h:308
Cube * p
Definition exorList.c:222
char * Extra_FileNameGenericAppend(char *pBase, char *pSuffix)
Abc_Nam_t * pStrs
Definition cbaPrs.h:84
Abc_Nam_t * pFuns
Definition cbaPrs.h:85
int Abc_NamStrFindOrAddLim(Abc_Nam_t *p, char *pStr, char *pLim, int *pfFound)
Definition utilNam.c:492
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
Definition utilNam.c:453
int Abc_NamObjNumMax(Abc_Nam_t *p)
Definition utilNam.c:231
Abc_Nam_t * Abc_NamStart(int nObjs, int nAveSize)
FUNCTION DEFINITIONS ///.
Definition utilNam.c:80
Abc_Nam_t * Abc_NamRef(Abc_Nam_t *p)
Definition utilNam.c:195
char * Abc_NamStr(Abc_Nam_t *p, int NameId)
Definition utilNam.c:555
typedefABC_NAMESPACE_HEADER_START struct Abc_Nam_t_ Abc_Nam_t
INCLUDES ///.
Definition utilNam.h:39
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
Definition vecInt.h:72
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55