ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
ioReadBlif.c
Go to the documentation of this file.
1
20
21#include "ioAbc.h"
22#include "base/main/main.h"
23#include "map/mio/mio.h"
24
25
26
27
29
30
34
35typedef struct Io_ReadBlif_t_ Io_ReadBlif_t; // all reading info
37{
38 // general info about file
39 char * pFileName; // the name of the file
40 Extra_FileReader_t * pReader; // the input file reader
41 // current processing info
42 Abc_Ntk_t * pNtkMaster; // the primary network
43 Abc_Ntk_t * pNtkCur; // the primary network
44 int LineCur; // the line currently parsed
45 // temporary storage for tokens
46 Vec_Ptr_t * vTokens; // the current tokens
47 Vec_Ptr_t * vNewTokens; // the temporary storage for the tokens
48 Vec_Str_t * vCubes; // the temporary storage for the tokens
49 // timing information
50 Vec_Int_t * vInArrs; // input arrival
51 Vec_Int_t * vOutReqs; // output required
52 Vec_Int_t * vInDrives; // input drive
53 Vec_Int_t * vOutLoads; // output load
54 float DefInArrRise; // input arrival default
55 float DefInArrFall; // input arrival default
56 float DefOutReqRise;// output required default
57 float DefOutReqFall;// output required default
58 float DefInDriRise; // input drive default
59 float DefInDriFall; // input drive default
60 float DefOutLoadRise;// output load default
61 float DefOutLoadFall;// output load default
62 int fHaveDefInArr; // provided in the file
63 int fHaveDefOutReq; // provided in the file
64 int fHaveDefInDri; // provided in the file
65 int fHaveDefOutLoad;// provided in the file
66 // the error message
67 FILE * Output; // the output stream
68 char sError[1000]; // the error string generated during parsing
69 int fError; // set to 1 when error occurs
70};
71
72static Io_ReadBlif_t * Io_ReadBlifFile( char * pFileName );
73static void Io_ReadBlifFree( Io_ReadBlif_t * p );
74static void Io_ReadBlifPrintErrorMessage( Io_ReadBlif_t * p );
75static Vec_Ptr_t * Io_ReadBlifGetTokens( Io_ReadBlif_t * p );
76static char * Io_ReadBlifCleanName( char * pName );
77
78static Abc_Ntk_t * Io_ReadBlifNetwork( Io_ReadBlif_t * p );
79static Abc_Ntk_t * Io_ReadBlifNetworkOne( Io_ReadBlif_t * p );
80static int Io_ReadBlifNetworkInputs( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
81static int Io_ReadBlifNetworkOutputs( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
82static int Io_ReadBlifNetworkLatch( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
83static int Io_ReadBlifNetworkNames( Io_ReadBlif_t * p, Vec_Ptr_t ** pvTokens );
84static int Io_ReadBlifNetworkGate( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
85static int Io_ReadBlifNetworkSubcircuit( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
86static int Io_ReadBlifNetworkInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
87static int Io_ReadBlifNetworkOutputRequired( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
88static int Io_ReadBlifNetworkDefaultInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
89static int Io_ReadBlifNetworkDefaultOutputRequired( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
90static int Io_ReadBlifNetworkInputDrive( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
91static int Io_ReadBlifNetworkOutputLoad( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
92static int Io_ReadBlifNetworkDefaultInputDrive( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
93static int Io_ReadBlifNetworkDefaultOutputLoad( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
94static int Io_ReadBlifNetworkAndGateDelay( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens );
95static int Io_ReadBlifNetworkConnectBoxes( Io_ReadBlif_t * p, Abc_Ntk_t * pNtkMaster );
96static int Io_ReadBlifCreateTiming( Io_ReadBlif_t * p, Abc_Ntk_t * pNtkMaster );
97
101
113Abc_Ntk_t * Io_ReadBlif( char * pFileName, int fCheck )
114{
116 Abc_Ntk_t * pNtk;
117
118 // start the file
119 p = Io_ReadBlifFile( pFileName );
120 if ( p == NULL )
121 return NULL;
122
123 // read the hierarchical network
124 pNtk = Io_ReadBlifNetwork( p );
125 if ( pNtk == NULL )
126 {
127 Io_ReadBlifFree( p );
128 return NULL;
129 }
130 pNtk->pSpec = Extra_UtilStrsav( pFileName );
131 Io_ReadBlifCreateTiming( p, pNtk );
132 Io_ReadBlifFree( p );
133
134 // make sure that everything is okay with the network structure
135 if ( fCheck && !Abc_NtkCheckRead( pNtk ) )
136 {
137 printf( "Io_ReadBlif: The network check has failed.\n" );
138 Abc_NtkDelete( pNtk );
139 return NULL;
140 }
141 return pNtk;
142}
143
155Abc_Ntk_t * Io_ReadBlifNetwork( Io_ReadBlif_t * p )
156{
157 Abc_Ntk_t * pNtk, * pNtkMaster;
158
159 // read the name of the master network
160 p->vTokens = Io_ReadBlifGetTokens(p);
161 if ( p->vTokens == NULL || strcmp( (char *)p->vTokens->pArray[0], ".model" ) )
162 {
163 p->LineCur = 0;
164 sprintf( p->sError, "Wrong input file format." );
165 Io_ReadBlifPrintErrorMessage( p );
166 return NULL;
167 }
168
169 // read networks (with EXDC)
170 pNtkMaster = NULL;
171 while ( p->vTokens )
172 {
173 // read the network and its EXDC if present
174 pNtk = Io_ReadBlifNetworkOne( p );
175 if ( pNtk == NULL )
176 break;
177 if ( p->vTokens && strcmp((char *)p->vTokens->pArray[0], ".exdc") == 0 )
178 {
179 pNtk->pExdc = Io_ReadBlifNetworkOne( p );
180 if ( pNtk->pExdc == NULL )
181 break;
182 Abc_NtkFinalizeRead( pNtk->pExdc );
183 }
184 // add this network as part of the hierarchy
185 if ( pNtkMaster == NULL ) // no master network so far
186 {
187 p->pNtkMaster = pNtkMaster = pNtk;
188 continue;
189 }
190/*
191 // make sure hierarchy does not have the network with this name
192 if ( pNtkMaster->tName2Model && stmm_is_member( pNtkMaster->tName2Model, pNtk->pName ) )
193 {
194 p->LineCur = 0;
195 sprintf( p->sError, "Model %s is multiply defined in the file.", pNtk->pName );
196 Io_ReadBlifPrintErrorMessage( p );
197 Abc_NtkDelete( pNtk );
198 Abc_NtkDelete( pNtkMaster );
199 pNtkMaster = NULL;
200 return NULL;
201 }
202 // add the network to the hierarchy
203 if ( pNtkMaster->tName2Model == NULL )
204 pNtkMaster->tName2Model = stmm_init_table((int (*)(void))strcmp, (int (*)(void))stmm_strhash);
205 stmm_insert( pNtkMaster->tName2Model, pNtk->pName, (char *)pNtk );
206*/
207 }
208/*
209 // if there is a hierarchy, connect the boxes
210 if ( pNtkMaster && pNtkMaster->tName2Model )
211 {
212 if ( Io_ReadBlifNetworkConnectBoxes( p, pNtkMaster ) )
213 {
214 Abc_NtkDelete( pNtkMaster );
215 return NULL;
216 }
217 }
218 else
219*/
220 if ( !p->fError )
221 Abc_NtkFinalizeRead( pNtkMaster );
222 // return the master network
223 return pNtkMaster;
224}
225
237Abc_Ntk_t * Io_ReadBlifNetworkOne( Io_ReadBlif_t * p )
238{
239 ProgressBar * pProgress = NULL;
240 Abc_Ntk_t * pNtk;
241 char * pDirective;
242 int iLine, fTokensReady, fStatus;
243
244 // make sure the tokens are present
245 assert( p->vTokens != NULL );
246
247 // create the new network
248 p->pNtkCur = pNtk = Abc_NtkAlloc( ABC_NTK_NETLIST, ABC_FUNC_SOP, 1 );
249 // read the model name
250 if ( strcmp( (char *)p->vTokens->pArray[0], ".model" ) == 0 )
251 {
252 char * pToken, * pPivot;
253 if ( Vec_PtrSize(p->vTokens) != 2 )
254 {
255 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
256 sprintf( p->sError, "The .model line does not have exactly two entries." );
257 Io_ReadBlifPrintErrorMessage( p );
258 return NULL;
259 }
260 for ( pPivot = pToken = (char *)Vec_PtrEntry(p->vTokens, 1); *pToken; pToken++ )
261 if ( *pToken == '/' || *pToken == '\\' )
262 pPivot = pToken+1;
263 pNtk->pName = Extra_UtilStrsav( pPivot );
264 }
265 else if ( strcmp( (char *)p->vTokens->pArray[0], ".exdc" ) != 0 )
266 {
267 printf( "%s: File parsing skipped after line %d (\"%s\").\n", p->pFileName,
268 Extra_FileReaderGetLineNumber(p->pReader, 0), (char*)p->vTokens->pArray[0] );
269 Abc_NtkDelete(pNtk);
270 p->pNtkCur = NULL;
271 return NULL;
272 }
273
274 // read the inputs/outputs
275 if ( p->pNtkMaster == NULL )
276 pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p->pReader) );
277 fTokensReady = fStatus = 0;
278 for ( iLine = 0; fTokensReady || (p->vTokens = Io_ReadBlifGetTokens(p)); iLine++ )
279 {
280 if ( p->pNtkMaster == NULL && iLine % 1000 == 0 )
281 Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p->pReader), NULL );
282
283 // consider different line types
284 fTokensReady = 0;
285 pDirective = (char *)p->vTokens->pArray[0];
286 if ( !strcmp( pDirective, ".names" ) )
287 { fStatus = Io_ReadBlifNetworkNames( p, &p->vTokens ); fTokensReady = 1; }
288 else if ( !strcmp( pDirective, ".gate" ) )
289 fStatus = Io_ReadBlifNetworkGate( p, p->vTokens );
290 else if ( !strcmp( pDirective, ".latch" ) )
291 fStatus = Io_ReadBlifNetworkLatch( p, p->vTokens );
292 else if ( !strcmp( pDirective, ".inputs" ) )
293 fStatus = Io_ReadBlifNetworkInputs( p, p->vTokens );
294 else if ( !strcmp( pDirective, ".outputs" ) )
295 fStatus = Io_ReadBlifNetworkOutputs( p, p->vTokens );
296 else if ( !strcmp( pDirective, ".input_arrival" ) )
297 fStatus = Io_ReadBlifNetworkInputArrival( p, p->vTokens );
298 else if ( !strcmp( pDirective, ".output_required" ) )
299 fStatus = Io_ReadBlifNetworkOutputRequired( p, p->vTokens );
300 else if ( !strcmp( pDirective, ".default_input_arrival" ) )
301 fStatus = Io_ReadBlifNetworkDefaultInputArrival( p, p->vTokens );
302 else if ( !strcmp( pDirective, ".default_output_required" ) )
303 fStatus = Io_ReadBlifNetworkDefaultOutputRequired( p, p->vTokens );
304 else if ( !strcmp( pDirective, ".input_drive" ) )
305 fStatus = Io_ReadBlifNetworkInputDrive( p, p->vTokens );
306 else if ( !strcmp( pDirective, ".output_load" ) )
307 fStatus = Io_ReadBlifNetworkOutputLoad( p, p->vTokens );
308 else if ( !strcmp( pDirective, ".default_input_drive" ) )
309 fStatus = Io_ReadBlifNetworkDefaultInputDrive( p, p->vTokens );
310 else if ( !strcmp( pDirective, ".default_output_load" ) )
311 fStatus = Io_ReadBlifNetworkDefaultOutputLoad( p, p->vTokens );
312 else if ( !strcmp( pDirective, ".and_gate_delay" ) )
313 fStatus = Io_ReadBlifNetworkAndGateDelay( p, p->vTokens );
314// else if ( !strcmp( pDirective, ".subckt" ) )
315// fStatus = Io_ReadBlifNetworkSubcircuit( p, p->vTokens );
316 else if ( !strcmp( pDirective, ".exdc" ) )
317 break;
318 else if ( !strcmp( pDirective, ".end" ) )
319 {
320 p->vTokens = Io_ReadBlifGetTokens(p);
321 break;
322 }
323 else if ( !strcmp( pDirective, ".blackbox" ) )
324 {
325 pNtk->ntkType = ABC_NTK_NETLIST;
327 Mem_FlexStop( (Mem_Flex_t *)pNtk->pManFunc, 0 );
328 pNtk->pManFunc = NULL;
329 }
330 else
331 printf( "%s (line %d): Skipping directive \"%s\".\n", p->pFileName,
332 Extra_FileReaderGetLineNumber(p->pReader, 0), pDirective );
333 if ( p->vTokens == NULL ) // some files do not have ".end" in the end
334 break;
335 if ( fStatus == 1 )
336 {
337 Extra_ProgressBarStop( pProgress );
338 Abc_NtkDelete( pNtk );
339 return NULL;
340 }
341 }
342 if ( p->pNtkMaster == NULL )
343 Extra_ProgressBarStop( pProgress );
344 return pNtk;
345}
346
358int Io_ReadBlifNetworkInputs( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
359{
360 int i;
361 for ( i = 1; i < vTokens->nSize; i++ )
362 Io_ReadCreatePi( p->pNtkCur, (char *)vTokens->pArray[i] );
363 return 0;
364}
365
377int Io_ReadBlifNetworkOutputs( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
378{
379 int i;
380 for ( i = 1; i < vTokens->nSize; i++ )
381 Io_ReadCreatePo( p->pNtkCur, (char *)vTokens->pArray[i] );
382 return 0;
383}
384
396int Io_ReadBlifNetworkLatch( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
397{
398 Abc_Ntk_t * pNtk = p->pNtkCur;
399 Abc_Obj_t * pLatch;
400 int ResetValue;
401 if ( vTokens->nSize < 3 )
402 {
403 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
404 sprintf( p->sError, "The .latch line does not have enough tokens." );
405 Io_ReadBlifPrintErrorMessage( p );
406 return 1;
407 }
408 // create the latch
409 pLatch = Io_ReadCreateLatch( pNtk, (char *)vTokens->pArray[1], (char *)vTokens->pArray[2] );
410 // get the latch reset value
411 if ( vTokens->nSize == 3 )
412 Abc_LatchSetInitDc( pLatch );
413 else
414 {
415 ResetValue = atoi((char *)vTokens->pArray[vTokens->nSize-1]);
416 if ( ResetValue != 0 && ResetValue != 1 && ResetValue != 2 )
417 {
418 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
419 sprintf( p->sError, "The .latch line has an unknown reset value (%s).", (char*)vTokens->pArray[3] );
420 Io_ReadBlifPrintErrorMessage( p );
421 return 1;
422 }
423 if ( ResetValue == 0 )
424 Abc_LatchSetInit0( pLatch );
425 else if ( ResetValue == 1 )
426 Abc_LatchSetInit1( pLatch );
427 else if ( ResetValue == 2 )
428 Abc_LatchSetInitDc( pLatch );
429 }
430 return 0;
431}
432
444int Io_ReadBlifNetworkNames( Io_ReadBlif_t * p, Vec_Ptr_t ** pvTokens )
445{
446 Vec_Ptr_t * vTokens = *pvTokens;
447 Abc_Ntk_t * pNtk = p->pNtkCur;
448 Abc_Obj_t * pNode;
449 char * pToken, Char, ** ppNames;
450 int nFanins, nNames;
451
452 // create a new node and add it to the network
453 if ( vTokens->nSize < 2 )
454 {
455 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
456 sprintf( p->sError, "The .names line has less than two tokens." );
457 Io_ReadBlifPrintErrorMessage( p );
458 return 1;
459 }
460
461 // create the node
462 ppNames = (char **)vTokens->pArray + 1;
463 nNames = vTokens->nSize - 2;
464 pNode = Io_ReadCreateNode( pNtk, ppNames[nNames], ppNames, nNames );
465
466 // derive the functionality of the node
467 p->vCubes->nSize = 0;
468 nFanins = vTokens->nSize - 2;
469 if ( nFanins == 0 )
470 {
471 while ( (vTokens = Io_ReadBlifGetTokens(p)) )
472 {
473 pToken = (char *)vTokens->pArray[0];
474 if ( pToken[0] == '.' )
475 break;
476 // read the cube
477 if ( vTokens->nSize != 1 )
478 {
479 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
480 sprintf( p->sError, "The number of tokens in the constant cube is wrong." );
481 Io_ReadBlifPrintErrorMessage( p );
482 return 1;
483 }
484 // create the cube
485 Char = ((char *)vTokens->pArray[0])[0];
486 Vec_StrPush( p->vCubes, ' ' );
487 Vec_StrPush( p->vCubes, Char );
488 Vec_StrPush( p->vCubes, '\n' );
489 }
490 }
491 else
492 {
493 while ( (vTokens = Io_ReadBlifGetTokens(p)) )
494 {
495 pToken = (char *)vTokens->pArray[0];
496 if ( pToken[0] == '.' )
497 break;
498 // read the cube
499 if ( vTokens->nSize != 2 )
500 {
501 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
502 sprintf( p->sError, "The number of tokens in the cube is wrong." );
503 Io_ReadBlifPrintErrorMessage( p );
504 return 1;
505 }
506 // create the cube
507 Vec_StrPrintStr( p->vCubes, (char *)vTokens->pArray[0] );
508 // check the char
509 Char = ((char *)vTokens->pArray[1])[0];
510 if ( Char != '0' && Char != '1' && Char != 'x' && Char != 'n' )
511 {
512 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
513 sprintf( p->sError, "The output character in the constant cube is wrong." );
514 Io_ReadBlifPrintErrorMessage( p );
515 return 1;
516 }
517 Vec_StrPush( p->vCubes, ' ' );
518 Vec_StrPush( p->vCubes, Char );
519 Vec_StrPush( p->vCubes, '\n' );
520 }
521 }
522 // if there is nothing there
523 if ( p->vCubes->nSize == 0 )
524 {
525 // create an empty cube
526 Vec_StrPush( p->vCubes, ' ' );
527 Vec_StrPush( p->vCubes, '0' );
528 Vec_StrPush( p->vCubes, '\n' );
529 }
530 Vec_StrPush( p->vCubes, 0 );
531
532 // set the pointer to the functionality of the node
533 Abc_ObjSetData( pNode, Abc_SopRegister((Mem_Flex_t *)pNtk->pManFunc, p->vCubes->pArray) );
534
535 // check the size
536 if ( Abc_ObjFaninNum(pNode) != Abc_SopGetVarNum((char *)Abc_ObjData(pNode)) )
537 {
538 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
539 sprintf( p->sError, "The number of fanins (%d) of node %s is different from SOP size (%d).",
540 Abc_ObjFaninNum(pNode), Abc_ObjName(Abc_ObjFanout(pNode,0)), Abc_SopGetVarNum((char *)Abc_ObjData(pNode)) );
541 Io_ReadBlifPrintErrorMessage( p );
542 return 1;
543 }
544
545 // return the last array of tokens
546 *pvTokens = vTokens;
547 return 0;
548}
549
562{
563 Mio_Pin_t * pGatePin;
564 char * pName, * pNamePin;
565 int i, k, nSize, Length;
566 nSize = Vec_PtrSize(vTokens);
567 if ( pTwin == NULL )
568 {
569 if ( nSize - 3 != Mio_GateReadPinNum(pGate) )
570 return 0;
571 }
572 else
573 {
574 if ( nSize - 3 != Mio_GateReadPinNum(pGate) && nSize - 4 != Mio_GateReadPinNum(pGate) )
575 return 0;
576 }
577 // check if the names are in order
578 for ( pGatePin = Mio_GateReadPins(pGate), i = 0; pGatePin; pGatePin = Mio_PinReadNext(pGatePin), i++ )
579 {
580 pNamePin = Mio_PinReadName(pGatePin);
581 Length = strlen(pNamePin);
582 pName = (char *)Vec_PtrEntry(vTokens, i+2);
583 if ( !strncmp( pNamePin, pName, Length ) && pName[Length] == '=' )
584 continue;
585 break;
586 }
587 if ( pTwin == NULL )
588 {
589 if ( i == Mio_GateReadPinNum(pGate) )
590 return 1;
591 // reorder the pins
592 for ( pGatePin = Mio_GateReadPins(pGate), i = 0; pGatePin; pGatePin = Mio_PinReadNext(pGatePin), i++ )
593 {
594 pNamePin = Mio_PinReadName(pGatePin);
595 Length = strlen(pNamePin);
596 for ( k = 2; k < nSize; k++ )
597 {
598 pName = (char *)Vec_PtrEntry(vTokens, k);
599 if ( !strncmp( pNamePin, pName, Length ) && pName[Length] == '=' )
600 {
601 Vec_PtrPush( vTokens, pName );
602 break;
603 }
604 }
605 }
606 pNamePin = Mio_GateReadOutName(pGate);
607 Length = strlen(pNamePin);
608 for ( k = 2; k < nSize; k++ )
609 {
610 pName = (char *)Vec_PtrEntry(vTokens, k);
611 if ( !strncmp( pNamePin, pName, Length ) && pName[Length] == '=' )
612 {
613 Vec_PtrPush( vTokens, pName );
614 break;
615 }
616 }
617 if ( Vec_PtrSize(vTokens) - nSize != nSize - 2 )
618 return 0;
619 Vec_PtrForEachEntryStart( char *, vTokens, pName, k, nSize )
620 Vec_PtrWriteEntry( vTokens, k - nSize + 2, pName );
621 Vec_PtrShrink( vTokens, nSize );
622 }
623 else
624 {
625 if ( i != Mio_GateReadPinNum(pGate) ) // expect the correct order of input pins in the network with twin gates
626 return 0;
627 // check the last two entries
628 if ( nSize - 3 == Mio_GateReadPinNum(pGate) ) // only one output is available
629 {
630 pNamePin = Mio_GateReadOutName(pGate);
631 Length = strlen(pNamePin);
632 pName = (char *)Vec_PtrEntry(vTokens, nSize - 1);
633 if ( !strncmp( pNamePin, pName, Length ) && pName[Length] == '=' ) // the last entry is pGate
634 {
635 Vec_PtrPush( vTokens, NULL );
636 return 1;
637 }
638 pNamePin = Mio_GateReadOutName(pTwin);
639 Length = strlen(pNamePin);
640 pName = (char *)Vec_PtrEntry(vTokens, nSize - 1);
641 if ( !strncmp( pNamePin, pName, Length ) && pName[Length] == '=' ) // the last entry is pTwin
642 {
643 pName = (char *)Vec_PtrPop( vTokens );
644 Vec_PtrPush( vTokens, NULL );
645 Vec_PtrPush( vTokens, pName );
646 return 1;
647 }
648 return 0;
649 }
650 if ( nSize - 4 == Mio_GateReadPinNum(pGate) ) // two outputs are available
651 {
652 pNamePin = Mio_GateReadOutName(pGate);
653 Length = strlen(pNamePin);
654 pName = (char *)Vec_PtrEntry(vTokens, nSize - 2);
655 if ( !(!strncmp( pNamePin, pName, Length ) && pName[Length] == '=') )
656 return 0;
657 pNamePin = Mio_GateReadOutName(pTwin);
658 Length = strlen(pNamePin);
659 pName = (char *)Vec_PtrEntry(vTokens, nSize - 1);
660 if ( !(!strncmp( pNamePin, pName, Length ) && pName[Length] == '=') )
661 return 0;
662 return 1;
663 }
664 assert( 0 );
665 }
666 return 1;
667}
668
680int Io_ReadBlifNetworkGate( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
681{
682 Mio_Library_t * pGenlib;
683 Mio_Gate_t * pGate;
684 Abc_Obj_t * pNode;
685 char ** ppNames;
686 int i, nNames;
687
688 // check that the library is available
689 pGenlib = (Mio_Library_t *)Abc_FrameReadLibGen();
690 if ( pGenlib == NULL )
691 {
692 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
693 sprintf( p->sError, "The current library is not available." );
694 Io_ReadBlifPrintErrorMessage( p );
695 return 1;
696 }
697
698 // create a new node and add it to the network
699 if ( vTokens->nSize < 2 )
700 {
701 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
702 sprintf( p->sError, "The .gate line has less than two tokens." );
703 Io_ReadBlifPrintErrorMessage( p );
704 return 1;
705 }
706
707 // get the gate
708 pGate = Mio_LibraryReadGateByName( pGenlib, (char *)vTokens->pArray[1], NULL );
709 if ( pGate == NULL )
710 {
711 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
712 sprintf( p->sError, "Cannot find gate \"%s\" in the library.", (char*)vTokens->pArray[1] );
713 Io_ReadBlifPrintErrorMessage( p );
714 return 1;
715 }
716
717 // if this is the first line with gate, update the network type
718 if ( Abc_NtkNodeNum(p->pNtkCur) == 0 )
719 {
720 assert( p->pNtkCur->ntkFunc == ABC_FUNC_SOP );
721 p->pNtkCur->ntkFunc = ABC_FUNC_MAP;
722 Mem_FlexStop( (Mem_Flex_t *)p->pNtkCur->pManFunc, 0 );
723 p->pNtkCur->pManFunc = pGenlib;
724 }
725
726 // reorder the formal inputs to be in the same order as in the gate
727 if ( !Io_ReadBlifReorderFormalNames( vTokens, pGate, Mio_GateReadTwin(pGate) ) )
728 {
729 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
730 sprintf( p->sError, "Mismatch in the fanins of gate \"%s\".", (char*)vTokens->pArray[1] );
731 Io_ReadBlifPrintErrorMessage( p );
732 return 1;
733 }
734
735
736 // remove the formal parameter names
737 for ( i = 2; i < vTokens->nSize; i++ )
738 {
739 vTokens->pArray[i] = Io_ReadBlifCleanName( (char *)vTokens->pArray[i] );
740 if ( vTokens->pArray[i] == NULL )
741 {
742 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
743 sprintf( p->sError, "Invalid gate input assignment." );
744 Io_ReadBlifPrintErrorMessage( p );
745 return 1;
746 }
747 }
748
749 // create the node
750 if ( Mio_GateReadTwin(pGate) == NULL )
751 {
752 nNames = vTokens->nSize - 3;
753 ppNames = (char **)vTokens->pArray + 2;
754 pNode = Io_ReadCreateNode( p->pNtkCur, ppNames[nNames], ppNames, nNames );
755 Abc_ObjSetData( pNode, pGate );
756 }
757 else
758 {
759 nNames = vTokens->nSize - 4;
760 ppNames = (char **)vTokens->pArray + 2;
761 assert( ppNames[nNames] != NULL || ppNames[nNames+1] != NULL );
762 if ( ppNames[nNames] )
763 {
764 pNode = Io_ReadCreateNode( p->pNtkCur, ppNames[nNames], ppNames, nNames );
765 Abc_ObjSetData( pNode, pGate );
766 }
767 if ( ppNames[nNames+1] )
768 {
769 pNode = Io_ReadCreateNode( p->pNtkCur, ppNames[nNames+1], ppNames, nNames );
770 Abc_ObjSetData( pNode, Mio_GateReadTwin(pGate) );
771 }
772 }
773 return 0;
774}
775
787int Io_ReadBlifNetworkSubcircuit( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
788{
789 Abc_Obj_t * pBox;
790 Vec_Ptr_t * vNames;
791 char * pName;
792 int i;
793
794 // create a new node and add it to the network
795 if ( vTokens->nSize < 3 )
796 {
797 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
798 sprintf( p->sError, "The .subcircuit line has less than three tokens." );
799 Io_ReadBlifPrintErrorMessage( p );
800 return 1;
801 }
802
803 // store the names of formal/actual inputs/outputs of the box
804 vNames = Vec_PtrAlloc( 10 );
805 Vec_PtrForEachEntryStart( char *, vTokens, pName, i, 1 )
806// Vec_PtrPush( vNames, Abc_NtkRegisterName(p->pNtkCur, pName) );
807 Vec_PtrPush( vNames, Extra_UtilStrsav(pName) ); // memory leak!!!
808
809 // create a new box and add it to the network
810 pBox = Abc_NtkCreateBlackbox( p->pNtkCur );
811 // set the pointer to the node names
812 Abc_ObjSetData( pBox, vNames );
813 // remember the line of the file
814 pBox->pCopy = (Abc_Obj_t *)(ABC_PTRINT_T)Extra_FileReaderGetLineNumber(p->pReader, 0);
815 return 0;
816}
817
829char * Io_ReadBlifCleanName( char * pName )
830{
831 int i, Length;
832 Length = strlen(pName);
833 for ( i = 0; i < Length; i++ )
834 if ( pName[i] == '=' )
835 return pName + i + 1;
836 return NULL;
837}
838
850int Io_ReadBlifNetworkInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
851{
852 Abc_Obj_t * pNet;
853 char * pFoo1, * pFoo2;
854 double TimeRise, TimeFall;
855
856 // make sure this is indeed the .inputs line
857 assert( strncmp( (char *)vTokens->pArray[0], ".input_arrival", 14 ) == 0 );
858 if ( vTokens->nSize != 4 )
859 {
860 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
861 sprintf( p->sError, "Wrong number of arguments on .input_arrival line." );
862 Io_ReadBlifPrintErrorMessage( p );
863 return 1;
864 }
865 pNet = Abc_NtkFindNet( p->pNtkCur, (char *)vTokens->pArray[1] );
866 if ( pNet == NULL )
867 {
868 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
869 sprintf( p->sError, "Cannot find object corresponding to %s on .input_arrival line.", (char*)vTokens->pArray[1] );
870 Io_ReadBlifPrintErrorMessage( p );
871 return 1;
872 }
873 TimeRise = strtod( (char *)vTokens->pArray[2], &pFoo1 );
874 TimeFall = strtod( (char *)vTokens->pArray[3], &pFoo2 );
875 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
876 {
877 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
878 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .input_arrival line.", (char*)vTokens->pArray[2], (char*)vTokens->pArray[3] );
879 Io_ReadBlifPrintErrorMessage( p );
880 return 1;
881 }
882 // set timing info
883 // printf("Debug: Forcing setting of arrival times\n");
884 if (Abc_ObjFaninNum(pNet) >0){
885 Abc_NtkTimeSetArrival( p->pNtkCur, Abc_ObjFanin0(pNet)->Id, (float)TimeRise, (float)TimeFall );
886 Vec_IntPush( p->vInArrs, Abc_ObjFanin0(pNet)->Id );
887 Vec_IntPush( p->vInArrs, Abc_Float2Int((float)TimeRise) );
888 Vec_IntPush( p->vInArrs, Abc_Float2Int((float)TimeFall) );
889 }
890 return 0;
891}
892
904int Io_ReadBlifNetworkOutputRequired( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
905{
906 Abc_Obj_t * pNet;
907 char * pFoo1, * pFoo2;
908 double TimeRise, TimeFall;
909
910 // make sure this is indeed the .inputs line
911 assert( strncmp( (char *)vTokens->pArray[0], ".output_required", 16 ) == 0 );
912 if ( vTokens->nSize != 4 )
913 {
914 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
915 sprintf( p->sError, "Wrong number of arguments on .output_required line." );
916 Io_ReadBlifPrintErrorMessage( p );
917 return 1;
918 }
919 pNet = Abc_NtkFindNet( p->pNtkCur, (char *)vTokens->pArray[1] );
920 if ( pNet == NULL )
921 {
922 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
923 sprintf( p->sError, "Cannot find object corresponding to %s on .output_required line.", (char*)vTokens->pArray[1] );
924 Io_ReadBlifPrintErrorMessage( p );
925 return 1;
926 }
927 TimeRise = strtod( (char *)vTokens->pArray[2], &pFoo1 );
928 TimeFall = strtod( (char *)vTokens->pArray[3], &pFoo2 );
929 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
930 {
931 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
932 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .output_required line.", (char*)vTokens->pArray[2], (char*)vTokens->pArray[3] );
933 Io_ReadBlifPrintErrorMessage( p );
934 return 1;
935 }
936 // set timing info
937 // printf("Setting required time for object %d to R %f F %f\n",
938 // Abc_ObjFanout0(pNet)->Id, (float)TimeRise, (float)TimeFall );
939
940 Abc_NtkTimeSetRequired( p->pNtkCur, Abc_ObjFanout0(pNet)->Id, (float)TimeRise, (float)TimeFall );
941 Vec_IntPush( p->vOutReqs, Abc_ObjFanout0(pNet)->Id );
942 Vec_IntPush( p->vOutReqs, Abc_Float2Int((float)TimeRise) );
943 Vec_IntPush( p->vOutReqs, Abc_Float2Int((float)TimeFall) );
944 return 0;
945}
946
958int Io_ReadBlifNetworkDefaultInputArrival( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
959{
960 char * pFoo1, * pFoo2;
961 double TimeRise, TimeFall;
962
963 // make sure this is indeed the .inputs line
964 assert( strncmp( (char *)vTokens->pArray[0], ".default_input_arrival", 23 ) == 0 );
965 if ( vTokens->nSize != 3 )
966 {
967 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
968 sprintf( p->sError, "Wrong number of arguments on .default_input_arrival line." );
969 Io_ReadBlifPrintErrorMessage( p );
970 return 1;
971 }
972 TimeRise = strtod( (char *)vTokens->pArray[1], &pFoo1 );
973 TimeFall = strtod( (char *)vTokens->pArray[2], &pFoo2 );
974 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
975 {
976 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
977 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .default_input_arrival line.", (char*)vTokens->pArray[1], (char*)vTokens->pArray[2] );
978 Io_ReadBlifPrintErrorMessage( p );
979 return 1;
980 }
981 // set timing info
982 //Abc_NtkTimeSetDefaultArrival( p->pNtkCur, (float)TimeRise, (float)TimeFall );
983 p->DefInArrRise = (float)TimeRise;
984 p->DefInArrFall = (float)TimeFall;
985 p->fHaveDefInArr = 1;
986 return 0;
987}
988
1000int Io_ReadBlifNetworkDefaultOutputRequired( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
1001{
1002 char * pFoo1, * pFoo2;
1003 double TimeRise, TimeFall;
1004
1005 // make sure this is indeed the .inputs line
1006 assert( strncmp( (char *)vTokens->pArray[0], ".default_output_required", 25 ) == 0 );
1007 if ( vTokens->nSize != 3 )
1008 {
1009 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1010 sprintf( p->sError, "Wrong number of arguments on .default_output_required line." );
1011 Io_ReadBlifPrintErrorMessage( p );
1012 return 1;
1013 }
1014 TimeRise = strtod( (char *)vTokens->pArray[1], &pFoo1 );
1015 TimeFall = strtod( (char *)vTokens->pArray[2], &pFoo2 );
1016 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
1017 {
1018 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1019 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .default_output_required line.", (char*)vTokens->pArray[1], (char*)vTokens->pArray[2] );
1020 Io_ReadBlifPrintErrorMessage( p );
1021 return 1;
1022 }
1023 // set timing info
1024// Abc_NtkTimeSetDefaultRequired( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1025 p->DefOutReqRise = (float)TimeRise;
1026 p->DefOutReqFall = (float)TimeFall;
1027 p->fHaveDefOutReq = 1;
1028 return 0;
1029}
1030
1031
1044{
1045 Abc_Obj_t * pTemp;
1046 int i;
1047 Abc_NtkForEachCi( pNtk, pTemp, i )
1048 if ( pTemp == pObj )
1049 return i;
1050 return -1;
1051}
1052int Io_ReadBlifNetworkInputDrive( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
1053{
1054 Abc_Obj_t * pNet;
1055 char * pFoo1, * pFoo2;
1056 double TimeRise, TimeFall;
1057
1058 // make sure this is indeed the .inputs line
1059 assert( strncmp( (char *)vTokens->pArray[0], ".input_drive", 12 ) == 0 );
1060 if ( vTokens->nSize != 4 )
1061 {
1062 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1063 sprintf( p->sError, "Wrong number of arguments on .input_drive line." );
1064 Io_ReadBlifPrintErrorMessage( p );
1065 return 1;
1066 }
1067 pNet = Abc_NtkFindNet( p->pNtkCur, (char *)vTokens->pArray[1] );
1068 if ( pNet == NULL )
1069 {
1070 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1071 sprintf( p->sError, "Cannot find object corresponding to %s on .input_drive line.", (char*)vTokens->pArray[1] );
1072 Io_ReadBlifPrintErrorMessage( p );
1073 return 1;
1074 }
1075 TimeRise = strtod( (char *)vTokens->pArray[2], &pFoo1 );
1076 TimeFall = strtod( (char *)vTokens->pArray[3], &pFoo2 );
1077 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
1078 {
1079 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1080 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .input_drive line.", (char*)vTokens->pArray[2], (char*)vTokens->pArray[3] );
1081 Io_ReadBlifPrintErrorMessage( p );
1082 return 1;
1083 }
1084 // set timing info
1085 //Abc_NtkTimeSetInputDrive( p->pNtkCur, Io_ReadFindCiId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanin0(pNet)->Id)), (float)TimeRise, (float)TimeFall );
1086 Vec_IntPush( p->vInDrives, Io_ReadFindCiId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanin0(pNet)->Id)) );
1087 Vec_IntPush( p->vInDrives, Abc_Float2Int((float)TimeRise) );
1088 Vec_IntPush( p->vInDrives, Abc_Float2Int((float)TimeFall) );
1089 return 0;
1090}
1091
1104{
1105 Abc_Obj_t * pTemp;
1106 int i;
1107 Abc_NtkForEachPo( pNtk, pTemp, i )
1108 if ( pTemp == pObj )
1109 return i;
1110 return -1;
1111}
1112int Io_ReadBlifNetworkOutputLoad( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
1113{
1114 Abc_Obj_t * pNet;
1115 char * pFoo1, * pFoo2;
1116 double TimeRise, TimeFall;
1117
1118 // make sure this is indeed the .inputs line
1119 assert( strncmp( (char *)vTokens->pArray[0], ".output_load", 12 ) == 0 );
1120 if ( vTokens->nSize != 4 )
1121 {
1122 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1123 sprintf( p->sError, "Wrong number of arguments on .output_load line." );
1124 Io_ReadBlifPrintErrorMessage( p );
1125 return 1;
1126 }
1127 pNet = Abc_NtkFindNet( p->pNtkCur, (char *)vTokens->pArray[1] );
1128 if ( pNet == NULL )
1129 {
1130 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1131 sprintf( p->sError, "Cannot find object corresponding to %s on .output_load line.", (char*)vTokens->pArray[1] );
1132 Io_ReadBlifPrintErrorMessage( p );
1133 return 1;
1134 }
1135 TimeRise = strtod( (char *)vTokens->pArray[2], &pFoo1 );
1136 TimeFall = strtod( (char *)vTokens->pArray[3], &pFoo2 );
1137 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
1138 {
1139 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1140 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .output_load line.", (char*)vTokens->pArray[2], (char*)vTokens->pArray[3] );
1141 Io_ReadBlifPrintErrorMessage( p );
1142 return 1;
1143 }
1144 // set timing info
1145// Abc_NtkTimeSetOutputLoad( p->pNtkCur, Io_ReadFindCoId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanout0(pNet)->Id)), (float)TimeRise, (float)TimeFall );
1146 Vec_IntPush( p->vOutLoads, Io_ReadFindCoId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanout0(pNet)->Id)) );
1147 Vec_IntPush( p->vOutLoads, Abc_Float2Int((float)TimeRise) );
1148 Vec_IntPush( p->vOutLoads, Abc_Float2Int((float)TimeFall) );
1149 return 0;
1150}
1151
1163int Io_ReadBlifNetworkDefaultInputDrive( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
1164{
1165 char * pFoo1, * pFoo2;
1166 double TimeRise, TimeFall;
1167
1168 // make sure this is indeed the .inputs line
1169 assert( strncmp( (char *)vTokens->pArray[0], ".default_input_drive", 21 ) == 0 );
1170 if ( vTokens->nSize != 3 )
1171 {
1172 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1173 sprintf( p->sError, "Wrong number of arguments on .default_input_drive line." );
1174 Io_ReadBlifPrintErrorMessage( p );
1175 return 1;
1176 }
1177 TimeRise = strtod( (char *)vTokens->pArray[1], &pFoo1 );
1178 TimeFall = strtod( (char *)vTokens->pArray[2], &pFoo2 );
1179 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
1180 {
1181 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1182 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .default_input_drive line.", (char*)vTokens->pArray[1], (char*)vTokens->pArray[2] );
1183 Io_ReadBlifPrintErrorMessage( p );
1184 return 1;
1185 }
1186 // set timing info
1187// Abc_NtkTimeSetDefaultInputDrive( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1188 p->DefInDriRise = (float)TimeRise;
1189 p->DefInDriFall = (float)TimeFall;
1190 p->fHaveDefInDri = 1;
1191 return 0;
1192}
1193
1205int Io_ReadBlifNetworkDefaultOutputLoad( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
1206{
1207 char * pFoo1, * pFoo2;
1208 double TimeRise, TimeFall;
1209
1210 // make sure this is indeed the .inputs line
1211 assert( strncmp( (char *)vTokens->pArray[0], ".default_output_load", 21 ) == 0 );
1212 if ( vTokens->nSize != 3 )
1213 {
1214 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1215 sprintf( p->sError, "Wrong number of arguments on .default_output_load line." );
1216 Io_ReadBlifPrintErrorMessage( p );
1217 return 1;
1218 }
1219 TimeRise = strtod( (char *)vTokens->pArray[1], &pFoo1 );
1220 TimeFall = strtod( (char *)vTokens->pArray[2], &pFoo2 );
1221 if ( *pFoo1 != '\0' || *pFoo2 != '\0' )
1222 {
1223 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1224 sprintf( p->sError, "Bad value (%s %s) for rise or fall time on .default_output_load line.", (char*)vTokens->pArray[1], (char*)vTokens->pArray[2] );
1225 Io_ReadBlifPrintErrorMessage( p );
1226 return 1;
1227 }
1228 // set timing info
1229// Abc_NtkTimeSetDefaultOutputLoad( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1230 p->DefOutLoadRise = (float)TimeRise;
1231 p->DefOutLoadFall = (float)TimeFall;
1232 p->fHaveDefOutLoad = 1;
1233 return 0;
1234}
1235
1247int Io_ReadBlifNetworkAndGateDelay( Io_ReadBlif_t * p, Vec_Ptr_t * vTokens )
1248{
1249 char * pFoo1;
1250 double AndGateDelay;
1251
1252 // make sure this is indeed the .inputs line
1253 assert( strncmp( (char *)vTokens->pArray[0], ".and_gate_delay", 25 ) == 0 );
1254 if ( vTokens->nSize != 2 )
1255 {
1256 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1257 sprintf( p->sError, "Wrong number of arguments (%d) on .and_gate_delay line (should be 1).", vTokens->nSize-1 );
1258 Io_ReadBlifPrintErrorMessage( p );
1259 return 1;
1260 }
1261 AndGateDelay = strtod( (char *)vTokens->pArray[1], &pFoo1 );
1262 if ( *pFoo1 != '\0' )
1263 {
1264 p->LineCur = Extra_FileReaderGetLineNumber(p->pReader, 0);
1265 sprintf( p->sError, "Bad value (%s) for AND gate delay in on .and_gate_delay line line.", (char*)vTokens->pArray[1] );
1266 Io_ReadBlifPrintErrorMessage( p );
1267 return 1;
1268 }
1269 // set timing info
1270 p->pNtkCur->AndGateDelay = (float)AndGateDelay;
1271 return 0;
1272}
1273
1285void Io_ReadBlifPrintErrorMessage( Io_ReadBlif_t * p )
1286{
1287 p->fError = 1;
1288 if ( p->LineCur == 0 ) // the line number is not given
1289 fprintf( p->Output, "%s: %s\n", p->pFileName, p->sError );
1290 else // print the error message with the line number
1291 fprintf( p->Output, "%s (line %d): %s\n", p->pFileName, p->LineCur, p->sError );
1292}
1293
1305Vec_Ptr_t * Io_ReadBlifGetTokens( Io_ReadBlif_t * p )
1306{
1307 Vec_Ptr_t * vTokens;
1308 char * pLastToken;
1309 int i;
1310
1311 // get rid of the old tokens
1312 if ( p->vNewTokens->nSize > 0 )
1313 {
1314 for ( i = 0; i < p->vNewTokens->nSize; i++ )
1315 ABC_FREE( p->vNewTokens->pArray[i] );
1316 p->vNewTokens->nSize = 0;
1317 }
1318
1319 // get the new tokens
1320 vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p->pReader);
1321 if ( vTokens == NULL )
1322 return vTokens;
1323
1324 // check if there is a transfer to another line
1325 pLastToken = (char *)vTokens->pArray[vTokens->nSize - 1];
1326 if ( pLastToken[ strlen(pLastToken)-1 ] != '\\' )
1327 return vTokens;
1328
1329 // remove the slash
1330 pLastToken[ strlen(pLastToken)-1 ] = 0;
1331 if ( pLastToken[0] == 0 )
1332 vTokens->nSize--;
1333 // load them into the new array
1334 for ( i = 0; i < vTokens->nSize; i++ )
1335 Vec_PtrPush( p->vNewTokens, Extra_UtilStrsav((char *)vTokens->pArray[i]) );
1336
1337 // load as long as there is the line break
1338 while ( 1 )
1339 {
1340 // get the new tokens
1341 vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p->pReader);
1342 if ( vTokens->nSize == 0 )
1343 return p->vNewTokens;
1344 // check if there is a transfer to another line
1345 pLastToken = (char *)vTokens->pArray[vTokens->nSize - 1];
1346 if ( pLastToken[ strlen(pLastToken)-1 ] == '\\' )
1347 {
1348 // remove the slash
1349 pLastToken[ strlen(pLastToken)-1 ] = 0;
1350 if ( pLastToken[0] == 0 )
1351 vTokens->nSize--;
1352 // load them into the new array
1353 for ( i = 0; i < vTokens->nSize; i++ )
1354 Vec_PtrPush( p->vNewTokens, Extra_UtilStrsav((char *)vTokens->pArray[i]) );
1355 continue;
1356 }
1357 // otherwise, load them and break
1358 for ( i = 0; i < vTokens->nSize; i++ )
1359 Vec_PtrPush( p->vNewTokens, Extra_UtilStrsav((char *)vTokens->pArray[i]) );
1360 break;
1361 }
1362 return p->vNewTokens;
1363}
1364
1376Io_ReadBlif_t * Io_ReadBlifFile( char * pFileName )
1377{
1378 Extra_FileReader_t * pReader;
1379 Io_ReadBlif_t * p;
1380
1381 // start the reader
1382 pReader = Extra_FileReaderAlloc( pFileName, "#", "\n\r", " \t" );
1383
1384 if ( pReader == NULL )
1385 return NULL;
1386
1387 // start the reading data structure
1388 p = ABC_ALLOC( Io_ReadBlif_t, 1 );
1389 memset( p, 0, sizeof(Io_ReadBlif_t) );
1390 p->pFileName = pFileName;
1391 p->pReader = pReader;
1392 p->Output = stdout;
1393 p->vNewTokens = Vec_PtrAlloc( 100 );
1394 p->vCubes = Vec_StrAlloc( 100 );
1395 p->vInArrs = Vec_IntAlloc( 100 );
1396 p->vOutReqs = Vec_IntAlloc( 100 );
1397 p->vInDrives = Vec_IntAlloc( 100 );
1398 p->vOutLoads = Vec_IntAlloc( 100 );
1399 return p;
1400}
1401
1413void Io_ReadBlifFree( Io_ReadBlif_t * p )
1414{
1415 Extra_FileReaderFree( p->pReader );
1416 Vec_PtrFree( p->vNewTokens );
1417 Vec_StrFree( p->vCubes );
1418 Vec_IntFree( p->vInArrs );
1419 Vec_IntFree( p->vOutReqs );
1420 Vec_IntFree( p->vInDrives );
1421 Vec_IntFree( p->vOutLoads );
1422 ABC_FREE( p );
1423}
1424
1425
1438{
1439 Vec_Ptr_t * pNames;
1440 Abc_Ntk_t * pNtkModel;
1441 Abc_Obj_t * pObj, * pNet;
1442 char * pName = NULL, * pActual;
1443 int i, Length, Start = -1;
1444
1445 // get the model for this box
1446 pNames = (Vec_Ptr_t *)pBox->pData;
1447 if ( !stmm_lookup( tName2Model, (char *)Vec_PtrEntry(pNames, 0), (char **)&pNtkModel ) )
1448 {
1449 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1450 sprintf( p->sError, "Cannot find the model for subcircuit %s.", (char*)Vec_PtrEntry(pNames, 0) );
1451 Io_ReadBlifPrintErrorMessage( p );
1452 return 1;
1453 }
1454
1455 // create the fanins of the box
1456 Abc_NtkForEachPi( pNtkModel, pObj, i )
1457 pObj->pCopy = NULL;
1458 if ( Abc_NtkPiNum(pNtkModel) == 0 )
1459 Start = 1;
1460 else
1461 {
1462 Vec_PtrForEachEntryStart( char *, pNames, pName, i, 1 )
1463 {
1464 pActual = Io_ReadBlifCleanName(pName);
1465 if ( pActual == NULL )
1466 {
1467 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1468 sprintf( p->sError, "Cannot parse formal/actual name pair \"%s\".", pName );
1469 Io_ReadBlifPrintErrorMessage( p );
1470 return 1;
1471 }
1472 Length = pActual - pName - 1;
1473 pName[Length] = 0;
1474 // find the PI net with this name
1475 pObj = Abc_NtkFindNet( pNtkModel, pName );
1476 if ( pObj == NULL )
1477 {
1478 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1479 sprintf( p->sError, "Cannot find formal input \"%s\" as an PI of model \"%s\".", pName, (char*)Vec_PtrEntry(pNames, 0) );
1480 Io_ReadBlifPrintErrorMessage( p );
1481 return 1;
1482 }
1483 // get the PI
1484 pObj = Abc_ObjFanin0(pObj);
1485 // quit if this is not a PI net
1486 if ( !Abc_ObjIsPi(pObj) )
1487 {
1488 pName[Length] = '=';
1489 Start = i;
1490 break;
1491 }
1492 // remember the actual name in the net
1493 if ( pObj->pCopy != NULL )
1494 {
1495 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1496 sprintf( p->sError, "Formal input \"%s\" is used more than once.", pName );
1497 Io_ReadBlifPrintErrorMessage( p );
1498 return 1;
1499 }
1500 pObj->pCopy = (Abc_Obj_t *)pActual;
1501 // quit if we processed all PIs
1502 if ( i == Abc_NtkPiNum(pNtkModel) )
1503 {
1504 Start = i+1;
1505 break;
1506 }
1507 }
1508 }
1509 // create the fanins of the box
1510 Abc_NtkForEachPi( pNtkModel, pObj, i )
1511 {
1512 pActual = (char *)pObj->pCopy;
1513 if ( pActual == NULL )
1514 {
1515 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1516 sprintf( p->sError, "Formal input \"%s\" of model %s is not driven.", pName, (char*)Vec_PtrEntry(pNames, 0) );
1517 Io_ReadBlifPrintErrorMessage( p );
1518 return 1;
1519 }
1520 pNet = Abc_NtkFindOrCreateNet( pBox->pNtk, pActual );
1521 Abc_ObjAddFanin( pBox, pNet );
1522 }
1523 Abc_NtkForEachPi( pNtkModel, pObj, i )
1524 pObj->pCopy = NULL;
1525
1526 // create the fanouts of the box
1527 Abc_NtkForEachPo( pNtkModel, pObj, i )
1528 pObj->pCopy = NULL;
1529 Vec_PtrForEachEntryStart( char *, pNames, pName, i, Start )
1530 {
1531 pActual = Io_ReadBlifCleanName(pName);
1532 if ( pActual == NULL )
1533 {
1534 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1535 sprintf( p->sError, "Cannot parse formal/actual name pair \"%s\".", pName );
1536 Io_ReadBlifPrintErrorMessage( p );
1537 return 1;
1538 }
1539 Length = pActual - pName - 1;
1540 pName[Length] = 0;
1541 // find the PO net with this name
1542 pObj = Abc_NtkFindNet( pNtkModel, pName );
1543 if ( pObj == NULL )
1544 {
1545 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1546 sprintf( p->sError, "Cannot find formal output \"%s\" as an PO of model \"%s\".", pName, (char*)Vec_PtrEntry(pNames, 0) );
1547 Io_ReadBlifPrintErrorMessage( p );
1548 return 1;
1549 }
1550 // get the PO
1551 pObj = Abc_ObjFanout0(pObj);
1552 if ( pObj->pCopy != NULL )
1553 {
1554 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1555 sprintf( p->sError, "Formal output \"%s\" is used more than once.", pName );
1556 Io_ReadBlifPrintErrorMessage( p );
1557 return 1;
1558 }
1559 pObj->pCopy = (Abc_Obj_t *)pActual;
1560 }
1561 // create the fanouts of the box
1562 Abc_NtkForEachPo( pNtkModel, pObj, i )
1563 {
1564 pActual = (char *)pObj->pCopy;
1565 if ( pActual == NULL )
1566 {
1567 p->LineCur = (int)(ABC_PTRINT_T)pBox->pCopy;
1568 sprintf( p->sError, "Formal output \"%s\" of model %s is not driven.", pName, (char*)Vec_PtrEntry(pNames, 0) );
1569 Io_ReadBlifPrintErrorMessage( p );
1570 return 1;
1571 }
1572 pNet = Abc_NtkFindOrCreateNet( pBox->pNtk, pActual );
1573 Abc_ObjAddFanin( pNet, pBox );
1574 }
1575 Abc_NtkForEachPo( pNtkModel, pObj, i )
1576 pObj->pCopy = NULL;
1577
1578 // remove the array of names, assign the pointer to the model
1579 Vec_PtrForEachEntry( char *, (Vec_Ptr_t *)pBox->pData, pName, i )
1580 ABC_FREE( pName );
1581 Vec_PtrFree( (Vec_Ptr_t *)pBox->pData );
1582 pBox->pData = pNtkModel;
1583 return 0;
1584}
1585
1598{
1599 Abc_Obj_t * pBox;
1600 int i;
1601 // go through the boxes
1602 Abc_NtkForEachBlackbox( pNtk, pBox, i )
1603 if ( Io_ReadBlifNetworkConnectBoxesOneBox( p, pBox, tName2Model ) )
1604 return 1;
1605 Abc_NtkFinalizeRead( pNtk );
1606 return 0;
1607}
1608
1620int Io_ReadBlifCreateTiming( Io_ReadBlif_t * p, Abc_Ntk_t * pNtk )
1621{
1622 int Id, Rise, Fall, i;
1623
1624 // set timing info
1625 //Abc_NtkTimeSetDefaultArrival( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1626// p->DefInArrRise = (float)TimeRise;
1627// p->DefInArrFall = (float)TimeFall;
1628 if ( p->fHaveDefInArr )
1629 Abc_NtkTimeSetDefaultArrival( pNtk, p->DefInArrRise, p->DefInArrFall );
1630 // set timing info
1631 //Abc_NtkTimeSetDefaultRequired( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1632// p->DefOutReqRise = (float)TimeRise;
1633// p->DefOutReqFall = (float)TimeFall;
1634 if ( p->fHaveDefOutReq )
1635 Abc_NtkTimeSetDefaultRequired( pNtk, p->DefOutReqRise, p->DefOutReqFall );
1636 // set timing info
1637 //Abc_NtkTimeSetDefaultInputDrive( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1638// p->DefInDriRise = (float)TimeRise;
1639// p->DefInDriFall = (float)TimeFall;
1640 if ( p->fHaveDefInDri )
1641 Abc_NtkTimeSetDefaultInputDrive( pNtk, p->DefInDriRise, p->DefInDriFall );
1642 // set timing info
1643 //Abc_NtkTimeSetDefaultOutputLoad( p->pNtkCur, (float)TimeRise, (float)TimeFall );
1644// p->DefOutLoadRise = (float)TimeRise;
1645// p->DefOutLoadFall = (float)TimeFall;
1646 if ( p->fHaveDefOutLoad )
1647 Abc_NtkTimeSetDefaultOutputLoad( pNtk, p->DefOutLoadRise, p->DefOutLoadFall );
1648
1649 // set timing info
1650 //Abc_NtkTimeSetArrival( p->pNtkCur, Abc_ObjFanin0(pNet)->Id, (float)TimeRise, (float)TimeFall );
1651// Vec_IntPush( p->vInArrs, Abc_ObjFanin0(pNet)->Id );
1652// Vec_IntPush( p->vInArrs, Abc_Float2Int((float)TimeRise) );
1653// Vec_IntPush( p->vInArrs, Abc_Float2Int((float)TimeFall) );
1654 Vec_IntForEachEntryTriple( p->vInArrs, Id, Rise, Fall, i )
1655 Abc_NtkTimeSetArrival( pNtk, Id, Abc_Int2Float(Rise), Abc_Int2Float(Fall) );
1656 // set timing info
1657 //Abc_NtkTimeSetRequired( p->pNtkCur, Abc_ObjFanout0(pNet)->Id, (float)TimeRise, (float)TimeFall );
1658// Vec_IntPush( p->vOutReqs, Abc_ObjFanout0(pNet)->Id );
1659// Vec_IntPush( p->vOutReqs, Abc_Float2Int((float)TimeRise) );
1660// Vec_IntPush( p->vOutReqs, Abc_Float2Int((float)TimeFall) );
1661 Vec_IntForEachEntryTriple( p->vOutReqs, Id, Rise, Fall, i )
1662 Abc_NtkTimeSetRequired( pNtk, Id, Abc_Int2Float(Rise), Abc_Int2Float(Fall) );
1663 // set timing info
1664 //Abc_NtkTimeSetInputDrive( p->pNtkCur, Io_ReadFindCiId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanin0(pNet)->Id)), (float)TimeRise, (float)TimeFall );
1665// Vec_IntPush( p->vInDrives, Io_ReadFindCiId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanin0(pNet)->Id)) );
1666// Vec_IntPush( p->vInDrives, Abc_Float2Int((float)TimeRise) );
1667// Vec_IntPush( p->vInDrives, Abc_Float2Int((float)TimeFall) );
1668 Vec_IntForEachEntryTriple( p->vInDrives, Id, Rise, Fall, i )
1669 Abc_NtkTimeSetInputDrive( pNtk, Id, Abc_Int2Float(Rise), Abc_Int2Float(Fall) );
1670 // set timing info
1671 //Abc_NtkTimeSetOutputLoad( p->pNtkCur, Io_ReadFindCoId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanout0(pNet)->Id)), (float)TimeRise, (float)TimeFall );
1672// Vec_IntPush( p->vOutLoads, Io_ReadFindCoId(p->pNtkCur, Abc_NtkObj(p->pNtkCur, Abc_ObjFanout0(pNet)->Id)) );
1673// Vec_IntPush( p->vOutLoads, Abc_Float2Int((float)TimeRise) );
1674// Vec_IntPush( p->vOutLoads, Abc_Float2Int((float)TimeFall) );
1675 Vec_IntForEachEntryTriple( p->vOutLoads, Id, Rise, Fall, i )
1676 Abc_NtkTimeSetOutputLoad( pNtk, Id, Abc_Int2Float(Rise), Abc_Int2Float(Fall) );
1677 return 1;
1678}
1679
1680#if 0
1681
1693int Io_ReadBlifNetworkConnectBoxes( Io_ReadBlif_t * p, Abc_Ntk_t * pNtkMaster )
1694{
1695 stmm_generator * gen;
1696 Abc_Ntk_t * pNtk;
1697 char * pName;
1698 // connect the master network
1699 if ( Io_ReadBlifNetworkConnectBoxesOne( p, pNtkMaster, pNtkMaster->tName2Model ) )
1700 return 1;
1701 // connect other networks
1702 stmm_foreach_item( pNtkMaster->tName2Model, gen, &pName, (char **)&pNtk )
1703 if ( Io_ReadBlifNetworkConnectBoxesOne( p, pNtk, pNtkMaster->tName2Model ) )
1704 return 1;
1705 return 0;
1706}
1707
1708#endif
1709
1713
1714
1716
struct Abc_Obj_t_ Abc_Obj_t
Definition abc.h:116
ABC_DLL Abc_Obj_t * Abc_NtkFindOrCreateNet(Abc_Ntk_t *pNtk, char *pName)
Definition abcObj.c:587
ABC_DLL void Abc_NtkTimeSetDefaultOutputLoad(Abc_Ntk_t *pNtk, float Rise, float Fall)
Definition abcTiming.c:265
ABC_DLL void Abc_NtkTimeSetDefaultArrival(Abc_Ntk_t *pNtk, float Rise, float Fall)
Definition abcTiming.c:173
ABC_DLL Abc_Ntk_t * Abc_NtkAlloc(Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan)
DECLARATIONS ///.
Definition abcNtk.c:53
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
Definition abcFanio.c:84
#define Abc_NtkForEachPo(pNtk, pPo, i)
Definition abc.h:520
ABC_DLL int Abc_NtkCheckRead(Abc_Ntk_t *pNtk)
Definition abcCheck.c:80
#define Abc_NtkForEachBlackbox(pNtk, pObj, i)
Definition abc.h:512
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
Definition abcNames.c:49
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL void Abc_NtkFinalizeRead(Abc_Ntk_t *pNtk)
Definition abcNtk.c:413
@ ABC_NTK_NETLIST
Definition abc.h:56
ABC_DLL void Abc_NtkTimeSetRequired(Abc_Ntk_t *pNtk, int ObjId, float Rise, float Fall)
Definition abcTiming.c:224
#define Abc_NtkForEachPi(pNtk, pPi, i)
Definition abc.h:516
ABC_DLL void Abc_NtkTimeSetDefaultInputDrive(Abc_Ntk_t *pNtk, float Rise, float Fall)
Definition abcTiming.c:249
ABC_DLL int Abc_SopGetVarNum(char *pSop)
Definition abcSop.c:584
ABC_DLL void Abc_NtkTimeSetDefaultRequired(Abc_Ntk_t *pNtk, float Rise, float Fall)
Definition abcTiming.c:184
#define Abc_NtkForEachCi(pNtk, pCi, i)
Definition abc.h:518
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
ABC_DLL void Abc_NtkTimeSetOutputLoad(Abc_Ntk_t *pNtk, int PoNum, float Rise, float Fall)
Definition abcTiming.c:312
@ ABC_FUNC_BLACKBOX
Definition abc.h:70
@ ABC_FUNC_SOP
Definition abc.h:65
@ ABC_FUNC_MAP
Definition abc.h:68
ABC_DLL void Abc_NtkTimeSetArrival(Abc_Ntk_t *pNtk, int ObjId, float Rise, float Fall)
Definition abcTiming.c:208
ABC_DLL void Abc_NtkTimeSetInputDrive(Abc_Ntk_t *pNtk, int PiNum, float Rise, float Fall)
Definition abcTiming.c:293
ABC_DLL char * Abc_SopRegister(Mem_Flex_t *pMan, const char *pName)
DECLARATIONS ///.
Definition abcSop.c:62
ABC_DLL Abc_Obj_t * Abc_NtkFindNet(Abc_Ntk_t *pNtk, char *pName)
Definition abcObj.c:515
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL void * Abc_FrameReadLibGen()
Definition mainFrame.c:59
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
struct Vec_Str_t_ Vec_Str_t
Definition bblif.c:46
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
Definition bbrNtbdd.c:27
char Char
Cube * p
Definition exorList.c:222
void Extra_ProgressBarStop(ProgressBar *p)
void * Extra_FileReaderGetTokens(Extra_FileReader_t *p)
Extra_FileReader_t * Extra_FileReaderAlloc(char *pFileName, char *pCharsComment, char *pCharsStop, char *pCharsClean)
FUNCTION DEFINITIONS ///.
char * Extra_UtilStrsav(const char *s)
struct Extra_FileReader_t_ Extra_FileReader_t
Definition extra.h:135
int Extra_FileReaderGetLineNumber(Extra_FileReader_t *p, int iToken)
int Extra_FileReaderGetCurPosition(Extra_FileReader_t *p)
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
int Extra_FileReaderGetFileSize(Extra_FileReader_t *p)
void Extra_FileReaderFree(Extra_FileReader_t *p)
Abc_Obj_t * Io_ReadCreatePo(Abc_Ntk_t *pNtk, char *pName)
Definition ioUtil.c:644
Abc_Obj_t * Io_ReadCreatePi(Abc_Ntk_t *pNtk, char *pName)
Definition ioUtil.c:619
Abc_Obj_t * Io_ReadCreateLatch(Abc_Ntk_t *pNtk, char *pNetLI, char *pNetLO)
Definition ioUtil.c:669
Abc_Obj_t * Io_ReadCreateNode(Abc_Ntk_t *pNtk, char *pNameOut, char *pNamesIn[], int nInputs)
Definition ioUtil.c:734
int Io_ReadFindCiId(Abc_Ntk_t *pNtk, Abc_Obj_t *pObj)
int Io_ReadBlifNetworkConnectBoxesOneBox(Io_ReadBlif_t *p, Abc_Obj_t *pBox, stmm_table *tName2Model)
int Io_ReadBlifNetworkConnectBoxesOne(Io_ReadBlif_t *p, Abc_Ntk_t *pNtk, stmm_table *tName2Model)
Abc_Ntk_t * Io_ReadBlif(char *pFileName, int fCheck)
FUNCTION DEFINITIONS ///.
Definition ioReadBlif.c:113
int Io_ReadFindCoId(Abc_Ntk_t *pNtk, Abc_Obj_t *pObj)
int Io_ReadBlifReorderFormalNames(Vec_Ptr_t *vTokens, Mio_Gate_t *pGate, Mio_Gate_t *pTwin)
Definition ioReadBlif.c:561
typedefABC_NAMESPACE_IMPL_START struct Io_ReadBlif_t_ Io_ReadBlif_t
DECLARATIONS ///.
Definition ioReadBlif.c:35
void Mem_FlexStop(Mem_Flex_t *p, int fVerbose)
Definition mem.c:359
Mio_Pin_t * Mio_GateReadPins(Mio_Gate_t *pGate)
Definition mioApi.c:173
int Mio_GateReadPinNum(Mio_Gate_t *pGate)
Definition mioApi.c:177
struct Mio_LibraryStruct_t_ Mio_Library_t
Definition mio.h:42
Mio_Gate_t * Mio_GateReadTwin(Mio_Gate_t *pGate)
Definition mioApi.c:176
Mio_Gate_t * Mio_LibraryReadGateByName(Mio_Library_t *pLib, char *pName, char *pOutName)
Definition mioApi.c:105
char * Mio_PinReadName(Mio_Pin_t *pPin)
Definition mioApi.c:208
Mio_Pin_t * Mio_PinReadNext(Mio_Pin_t *pPin)
Definition mioApi.c:217
struct Mio_PinStruct_t_ Mio_Pin_t
Definition mio.h:44
char * Mio_GateReadOutName(Mio_Gate_t *pGate)
Definition mioApi.c:170
struct Mio_GateStruct_t_ Mio_Gate_t
Definition mio.h:43
struct Mem_Flex_t_ Mem_Flex_t
Definition mem.h:34
int stmm_lookup(stmm_table *table, char *key, char **value)
Definition stmm.c:134
#define stmm_foreach_item(table, gen, key, value)
Definition stmm.h:121
Abc_NtkType_t ntkType
Definition abc.h:156
char * pName
Definition abc.h:158
Abc_Ntk_t * pExdc
Definition abc.h:201
void * pManFunc
Definition abc.h:191
char * pSpec
Definition abc.h:159
Abc_NtkFunc_t ntkFunc
Definition abc.h:157
void * pData
Definition abc.h:145
Abc_Ntk_t * pNtk
Definition abc.h:130
Abc_Obj_t * pCopy
Definition abc.h:148
char sError[1000]
Definition ioReadBlif.c:68
Vec_Str_t * vCubes
Definition ioReadBlif.c:48
Vec_Int_t * vOutLoads
Definition ioReadBlif.c:53
Abc_Ntk_t * pNtkCur
Definition ioReadBlif.c:43
Abc_Ntk_t * pNtkMaster
Definition ioReadBlif.c:42
float DefInDriFall
Definition ioReadBlif.c:59
float DefInDriRise
Definition ioReadBlif.c:58
Vec_Int_t * vInArrs
Definition ioReadBlif.c:50
Vec_Int_t * vOutReqs
Definition ioReadBlif.c:51
float DefInArrFall
Definition ioReadBlif.c:55
Vec_Ptr_t * vTokens
Definition ioReadBlif.c:46
char * pFileName
Definition ioReadBlif.c:39
float DefOutReqRise
Definition ioReadBlif.c:56
float DefOutLoadRise
Definition ioReadBlif.c:60
Vec_Int_t * vInDrives
Definition ioReadBlif.c:52
Extra_FileReader_t * pReader
Definition ioReadBlif.c:40
float DefOutLoadFall
Definition ioReadBlif.c:61
Vec_Ptr_t * vNewTokens
Definition ioReadBlif.c:47
float DefInArrRise
Definition ioReadBlif.c:54
float DefOutReqFall
Definition ioReadBlif.c:57
#define assert(ex)
Definition util_old.h:213
int strncmp()
char * memset()
int strlen()
int strcmp()
char * sprintf()
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
Definition vecInt.h:76
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
Definition vecPtr.h:57
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