76static char * Io_ReadBlifCleanName(
char * pName );
119 p = Io_ReadBlifFile( pFileName );
124 pNtk = Io_ReadBlifNetwork(
p );
127 Io_ReadBlifFree(
p );
131 Io_ReadBlifCreateTiming(
p, pNtk );
132 Io_ReadBlifFree(
p );
137 printf(
"Io_ReadBlif: The network check has failed.\n" );
160 p->vTokens = Io_ReadBlifGetTokens(
p);
161 if (
p->vTokens == NULL ||
strcmp( (
char *)
p->vTokens->pArray[0],
".model" ) )
164 sprintf(
p->sError,
"Wrong input file format." );
165 Io_ReadBlifPrintErrorMessage(
p );
174 pNtk = Io_ReadBlifNetworkOne(
p );
177 if (
p->vTokens &&
strcmp((
char *)
p->vTokens->pArray[0],
".exdc") == 0 )
179 pNtk->
pExdc = Io_ReadBlifNetworkOne(
p );
180 if ( pNtk->
pExdc == NULL )
185 if ( pNtkMaster == NULL )
187 p->pNtkMaster = pNtkMaster = pNtk;
242 int iLine, fTokensReady, fStatus;
250 if (
strcmp( (
char *)
p->vTokens->pArray[0],
".model" ) == 0 )
252 char * pToken, * pPivot;
253 if ( Vec_PtrSize(
p->vTokens) != 2 )
256 sprintf(
p->sError,
"The .model line does not have exactly two entries." );
257 Io_ReadBlifPrintErrorMessage(
p );
260 for ( pPivot = pToken = (
char *)Vec_PtrEntry(
p->vTokens, 1); *pToken; pToken++ )
261 if ( *pToken ==
'/' || *pToken ==
'\\' )
265 else if (
strcmp( (
char *)
p->vTokens->pArray[0],
".exdc" ) != 0 )
267 printf(
"%s: File parsing skipped after line %d (\"%s\").\n",
p->pFileName,
275 if (
p->pNtkMaster == NULL )
277 fTokensReady = fStatus = 0;
278 for ( iLine = 0; fTokensReady || (
p->vTokens = Io_ReadBlifGetTokens(
p)); iLine++ )
280 if (
p->pNtkMaster == NULL && iLine % 1000 == 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 );
316 else if ( !
strcmp( pDirective,
".exdc" ) )
318 else if ( !
strcmp( pDirective,
".end" ) )
320 p->vTokens = Io_ReadBlifGetTokens(
p);
323 else if ( !
strcmp( pDirective,
".blackbox" ) )
331 printf(
"%s (line %d): Skipping directive \"%s\".\n",
p->pFileName,
333 if (
p->vTokens == NULL )
342 if (
p->pNtkMaster == NULL )
361 for ( i = 1; i < vTokens->nSize; i++ )
380 for ( i = 1; i < vTokens->nSize; i++ )
401 if ( vTokens->nSize < 3 )
404 sprintf(
p->sError,
"The .latch line does not have enough tokens." );
405 Io_ReadBlifPrintErrorMessage(
p );
409 pLatch =
Io_ReadCreateLatch( pNtk, (
char *)vTokens->pArray[1], (
char *)vTokens->pArray[2] );
411 if ( vTokens->nSize == 3 )
412 Abc_LatchSetInitDc( pLatch );
415 ResetValue = atoi((
char *)vTokens->pArray[vTokens->nSize-1]);
416 if ( ResetValue != 0 && ResetValue != 1 && ResetValue != 2 )
419 sprintf(
p->sError,
"The .latch line has an unknown reset value (%s).", (
char*)vTokens->pArray[3] );
420 Io_ReadBlifPrintErrorMessage(
p );
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 );
449 char * pToken,
Char, ** ppNames;
453 if ( vTokens->nSize < 2 )
456 sprintf(
p->sError,
"The .names line has less than two tokens." );
457 Io_ReadBlifPrintErrorMessage(
p );
462 ppNames = (
char **)vTokens->pArray + 1;
463 nNames = vTokens->nSize - 2;
467 p->vCubes->nSize = 0;
468 nFanins = vTokens->nSize - 2;
471 while ( (vTokens = Io_ReadBlifGetTokens(
p)) )
473 pToken = (
char *)vTokens->pArray[0];
474 if ( pToken[0] ==
'.' )
477 if ( vTokens->nSize != 1 )
480 sprintf(
p->sError,
"The number of tokens in the constant cube is wrong." );
481 Io_ReadBlifPrintErrorMessage(
p );
485 Char = ((
char *)vTokens->pArray[0])[0];
486 Vec_StrPush(
p->vCubes,
' ' );
487 Vec_StrPush(
p->vCubes,
Char );
488 Vec_StrPush(
p->vCubes,
'\n' );
493 while ( (vTokens = Io_ReadBlifGetTokens(
p)) )
495 pToken = (
char *)vTokens->pArray[0];
496 if ( pToken[0] ==
'.' )
499 if ( vTokens->nSize != 2 )
502 sprintf(
p->sError,
"The number of tokens in the cube is wrong." );
503 Io_ReadBlifPrintErrorMessage(
p );
507 Vec_StrPrintStr(
p->vCubes, (
char *)vTokens->pArray[0] );
509 Char = ((
char *)vTokens->pArray[1])[0];
513 sprintf(
p->sError,
"The output character in the constant cube is wrong." );
514 Io_ReadBlifPrintErrorMessage(
p );
517 Vec_StrPush(
p->vCubes,
' ' );
518 Vec_StrPush(
p->vCubes,
Char );
519 Vec_StrPush(
p->vCubes,
'\n' );
523 if (
p->vCubes->nSize == 0 )
526 Vec_StrPush(
p->vCubes,
' ' );
527 Vec_StrPush(
p->vCubes,
'0' );
528 Vec_StrPush(
p->vCubes,
'\n' );
530 Vec_StrPush(
p->vCubes, 0 );
536 if ( Abc_ObjFaninNum(pNode) !=
Abc_SopGetVarNum((
char *)Abc_ObjData(pNode)) )
539 sprintf(
p->sError,
"The number of fanins (%d) of node %s is different from SOP size (%d).",
541 Io_ReadBlifPrintErrorMessage(
p );
564 char * pName, * pNamePin;
565 int i, k, nSize, Length;
566 nSize = Vec_PtrSize(vTokens);
581 Length =
strlen(pNamePin);
582 pName = (
char *)Vec_PtrEntry(vTokens, i+2);
583 if ( !
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=' )
595 Length =
strlen(pNamePin);
596 for ( k = 2; k < nSize; k++ )
598 pName = (
char *)Vec_PtrEntry(vTokens, k);
599 if ( !
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=' )
601 Vec_PtrPush( vTokens, pName );
607 Length =
strlen(pNamePin);
608 for ( k = 2; k < nSize; k++ )
610 pName = (
char *)Vec_PtrEntry(vTokens, k);
611 if ( !
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=' )
613 Vec_PtrPush( vTokens, pName );
617 if ( Vec_PtrSize(vTokens) - nSize != nSize - 2 )
620 Vec_PtrWriteEntry( vTokens, k - nSize + 2, pName );
621 Vec_PtrShrink( vTokens, nSize );
631 Length =
strlen(pNamePin);
632 pName = (
char *)Vec_PtrEntry(vTokens, nSize - 1);
633 if ( !
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=' )
635 Vec_PtrPush( vTokens, NULL );
639 Length =
strlen(pNamePin);
640 pName = (
char *)Vec_PtrEntry(vTokens, nSize - 1);
641 if ( !
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=' )
643 pName = (
char *)Vec_PtrPop( vTokens );
644 Vec_PtrPush( vTokens, NULL );
645 Vec_PtrPush( vTokens, pName );
653 Length =
strlen(pNamePin);
654 pName = (
char *)Vec_PtrEntry(vTokens, nSize - 2);
655 if ( !(!
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=') )
658 Length =
strlen(pNamePin);
659 pName = (
char *)Vec_PtrEntry(vTokens, nSize - 1);
660 if ( !(!
strncmp( pNamePin, pName, Length ) && pName[Length] ==
'=') )
690 if ( pGenlib == NULL )
693 sprintf(
p->sError,
"The current library is not available." );
694 Io_ReadBlifPrintErrorMessage(
p );
699 if ( vTokens->nSize < 2 )
702 sprintf(
p->sError,
"The .gate line has less than two tokens." );
703 Io_ReadBlifPrintErrorMessage(
p );
712 sprintf(
p->sError,
"Cannot find gate \"%s\" in the library.", (
char*)vTokens->pArray[1] );
713 Io_ReadBlifPrintErrorMessage(
p );
718 if ( Abc_NtkNodeNum(
p->pNtkCur) == 0 )
723 p->pNtkCur->pManFunc = pGenlib;
730 sprintf(
p->sError,
"Mismatch in the fanins of gate \"%s\".", (
char*)vTokens->pArray[1] );
731 Io_ReadBlifPrintErrorMessage(
p );
737 for ( i = 2; i < vTokens->nSize; i++ )
739 vTokens->pArray[i] = Io_ReadBlifCleanName( (
char *)vTokens->pArray[i] );
740 if ( vTokens->pArray[i] == NULL )
743 sprintf(
p->sError,
"Invalid gate input assignment." );
744 Io_ReadBlifPrintErrorMessage(
p );
752 nNames = vTokens->nSize - 3;
753 ppNames = (
char **)vTokens->pArray + 2;
755 Abc_ObjSetData( pNode, pGate );
759 nNames = vTokens->nSize - 4;
760 ppNames = (
char **)vTokens->pArray + 2;
761 assert( ppNames[nNames] != NULL || ppNames[nNames+1] != NULL );
762 if ( ppNames[nNames] )
765 Abc_ObjSetData( pNode, pGate );
767 if ( ppNames[nNames+1] )
795 if ( vTokens->nSize < 3 )
798 sprintf(
p->sError,
"The .subcircuit line has less than three tokens." );
799 Io_ReadBlifPrintErrorMessage(
p );
804 vNames = Vec_PtrAlloc( 10 );
810 pBox = Abc_NtkCreateBlackbox(
p->pNtkCur );
812 Abc_ObjSetData( pBox, vNames );
829char * Io_ReadBlifCleanName(
char * pName )
833 for ( i = 0; i < Length; i++ )
834 if ( pName[i] ==
'=' )
835 return pName + i + 1;
853 char * pFoo1, * pFoo2;
854 double TimeRise, TimeFall;
857 assert(
strncmp( (
char *)vTokens->pArray[0],
".input_arrival", 14 ) == 0 );
858 if ( vTokens->nSize != 4 )
861 sprintf(
p->sError,
"Wrong number of arguments on .input_arrival line." );
862 Io_ReadBlifPrintErrorMessage(
p );
869 sprintf(
p->sError,
"Cannot find object corresponding to %s on .input_arrival line.", (
char*)vTokens->pArray[1] );
870 Io_ReadBlifPrintErrorMessage(
p );
873 TimeRise = strtod( (
char *)vTokens->pArray[2], &pFoo1 );
874 TimeFall = strtod( (
char *)vTokens->pArray[3], &pFoo2 );
875 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
884 if (Abc_ObjFaninNum(pNet) >0){
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) );
907 char * pFoo1, * pFoo2;
908 double TimeRise, TimeFall;
911 assert(
strncmp( (
char *)vTokens->pArray[0],
".output_required", 16 ) == 0 );
912 if ( vTokens->nSize != 4 )
915 sprintf(
p->sError,
"Wrong number of arguments on .output_required line." );
916 Io_ReadBlifPrintErrorMessage(
p );
923 sprintf(
p->sError,
"Cannot find object corresponding to %s on .output_required line.", (
char*)vTokens->pArray[1] );
924 Io_ReadBlifPrintErrorMessage(
p );
927 TimeRise = strtod( (
char *)vTokens->pArray[2], &pFoo1 );
928 TimeFall = strtod( (
char *)vTokens->pArray[3], &pFoo2 );
929 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
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) );
960 char * pFoo1, * pFoo2;
961 double TimeRise, TimeFall;
964 assert(
strncmp( (
char *)vTokens->pArray[0],
".default_input_arrival", 23 ) == 0 );
965 if ( vTokens->nSize != 3 )
968 sprintf(
p->sError,
"Wrong number of arguments on .default_input_arrival line." );
969 Io_ReadBlifPrintErrorMessage(
p );
972 TimeRise = strtod( (
char *)vTokens->pArray[1], &pFoo1 );
973 TimeFall = strtod( (
char *)vTokens->pArray[2], &pFoo2 );
974 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
983 p->DefInArrRise = (float)TimeRise;
984 p->DefInArrFall = (float)TimeFall;
985 p->fHaveDefInArr = 1;
1002 char * pFoo1, * pFoo2;
1003 double TimeRise, TimeFall;
1006 assert(
strncmp( (
char *)vTokens->pArray[0],
".default_output_required", 25 ) == 0 );
1007 if ( vTokens->nSize != 3 )
1010 sprintf(
p->sError,
"Wrong number of arguments on .default_output_required line." );
1011 Io_ReadBlifPrintErrorMessage(
p );
1014 TimeRise = strtod( (
char *)vTokens->pArray[1], &pFoo1 );
1015 TimeFall = strtod( (
char *)vTokens->pArray[2], &pFoo2 );
1016 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
1025 p->DefOutReqRise = (float)TimeRise;
1026 p->DefOutReqFall = (float)TimeFall;
1027 p->fHaveDefOutReq = 1;
1048 if ( pTemp == pObj )
1055 char * pFoo1, * pFoo2;
1056 double TimeRise, TimeFall;
1059 assert(
strncmp( (
char *)vTokens->pArray[0],
".input_drive", 12 ) == 0 );
1060 if ( vTokens->nSize != 4 )
1063 sprintf(
p->sError,
"Wrong number of arguments on .input_drive line." );
1064 Io_ReadBlifPrintErrorMessage(
p );
1071 sprintf(
p->sError,
"Cannot find object corresponding to %s on .input_drive line.", (
char*)vTokens->pArray[1] );
1072 Io_ReadBlifPrintErrorMessage(
p );
1075 TimeRise = strtod( (
char *)vTokens->pArray[2], &pFoo1 );
1076 TimeFall = strtod( (
char *)vTokens->pArray[3], &pFoo2 );
1077 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
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) );
1108 if ( pTemp == pObj )
1115 char * pFoo1, * pFoo2;
1116 double TimeRise, TimeFall;
1119 assert(
strncmp( (
char *)vTokens->pArray[0],
".output_load", 12 ) == 0 );
1120 if ( vTokens->nSize != 4 )
1123 sprintf(
p->sError,
"Wrong number of arguments on .output_load line." );
1124 Io_ReadBlifPrintErrorMessage(
p );
1131 sprintf(
p->sError,
"Cannot find object corresponding to %s on .output_load line.", (
char*)vTokens->pArray[1] );
1132 Io_ReadBlifPrintErrorMessage(
p );
1135 TimeRise = strtod( (
char *)vTokens->pArray[2], &pFoo1 );
1136 TimeFall = strtod( (
char *)vTokens->pArray[3], &pFoo2 );
1137 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
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) );
1165 char * pFoo1, * pFoo2;
1166 double TimeRise, TimeFall;
1169 assert(
strncmp( (
char *)vTokens->pArray[0],
".default_input_drive", 21 ) == 0 );
1170 if ( vTokens->nSize != 3 )
1173 sprintf(
p->sError,
"Wrong number of arguments on .default_input_drive line." );
1174 Io_ReadBlifPrintErrorMessage(
p );
1177 TimeRise = strtod( (
char *)vTokens->pArray[1], &pFoo1 );
1178 TimeFall = strtod( (
char *)vTokens->pArray[2], &pFoo2 );
1179 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
1188 p->DefInDriRise = (float)TimeRise;
1189 p->DefInDriFall = (float)TimeFall;
1190 p->fHaveDefInDri = 1;
1207 char * pFoo1, * pFoo2;
1208 double TimeRise, TimeFall;
1211 assert(
strncmp( (
char *)vTokens->pArray[0],
".default_output_load", 21 ) == 0 );
1212 if ( vTokens->nSize != 3 )
1215 sprintf(
p->sError,
"Wrong number of arguments on .default_output_load line." );
1216 Io_ReadBlifPrintErrorMessage(
p );
1219 TimeRise = strtod( (
char *)vTokens->pArray[1], &pFoo1 );
1220 TimeFall = strtod( (
char *)vTokens->pArray[2], &pFoo2 );
1221 if ( *pFoo1 !=
'\0' || *pFoo2 !=
'\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 );
1230 p->DefOutLoadRise = (float)TimeRise;
1231 p->DefOutLoadFall = (float)TimeFall;
1232 p->fHaveDefOutLoad = 1;
1250 double AndGateDelay;
1253 assert(
strncmp( (
char *)vTokens->pArray[0],
".and_gate_delay", 25 ) == 0 );
1254 if ( vTokens->nSize != 2 )
1257 sprintf(
p->sError,
"Wrong number of arguments (%d) on .and_gate_delay line (should be 1).", vTokens->nSize-1 );
1258 Io_ReadBlifPrintErrorMessage(
p );
1261 AndGateDelay = strtod( (
char *)vTokens->pArray[1], &pFoo1 );
1262 if ( *pFoo1 !=
'\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 );
1270 p->pNtkCur->AndGateDelay = (float)AndGateDelay;
1288 if (
p->LineCur == 0 )
1289 fprintf(
p->Output,
"%s: %s\n",
p->pFileName,
p->sError );
1291 fprintf(
p->Output,
"%s (line %d): %s\n",
p->pFileName,
p->LineCur,
p->sError );
1312 if (
p->vNewTokens->nSize > 0 )
1314 for ( i = 0; i <
p->vNewTokens->nSize; i++ )
1316 p->vNewTokens->nSize = 0;
1321 if ( vTokens == NULL )
1325 pLastToken = (
char *)vTokens->pArray[vTokens->nSize - 1];
1326 if ( pLastToken[
strlen(pLastToken)-1 ] !=
'\\' )
1330 pLastToken[
strlen(pLastToken)-1 ] = 0;
1331 if ( pLastToken[0] == 0 )
1334 for ( i = 0; i < vTokens->nSize; i++ )
1342 if ( vTokens->nSize == 0 )
1343 return p->vNewTokens;
1345 pLastToken = (
char *)vTokens->pArray[vTokens->nSize - 1];
1346 if ( pLastToken[
strlen(pLastToken)-1 ] ==
'\\' )
1349 pLastToken[
strlen(pLastToken)-1 ] = 0;
1350 if ( pLastToken[0] == 0 )
1353 for ( i = 0; i < vTokens->nSize; i++ )
1358 for ( i = 0; i < vTokens->nSize; i++ )
1362 return p->vNewTokens;
1384 if ( pReader == NULL )
1390 p->pFileName = pFileName;
1391 p->pReader = pReader;
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 );
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 );
1442 char * pName = NULL, * pActual;
1443 int i, Length, Start = -1;
1447 if ( !
stmm_lookup( tName2Model, (
char *)Vec_PtrEntry(pNames, 0), (
char **)&pNtkModel ) )
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 );
1458 if ( Abc_NtkPiNum(pNtkModel) == 0 )
1464 pActual = Io_ReadBlifCleanName(pName);
1465 if ( pActual == NULL )
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 );
1472 Length = pActual - pName - 1;
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 );
1484 pObj = Abc_ObjFanin0(pObj);
1486 if ( !Abc_ObjIsPi(pObj) )
1488 pName[Length] =
'=';
1493 if ( pObj->
pCopy != NULL )
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 );
1502 if ( i == Abc_NtkPiNum(pNtkModel) )
1512 pActual = (
char *)pObj->
pCopy;
1513 if ( pActual == NULL )
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 );
1531 pActual = Io_ReadBlifCleanName(pName);
1532 if ( pActual == NULL )
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 );
1539 Length = pActual - pName - 1;
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 );
1551 pObj = Abc_ObjFanout0(pObj);
1552 if ( pObj->
pCopy != NULL )
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 );
1564 pActual = (
char *)pObj->
pCopy;
1565 if ( pActual == NULL )
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 );
1582 pBox->
pData = pNtkModel;
1622 int Id, Rise, Fall, i;
1628 if (
p->fHaveDefInArr )
1634 if (
p->fHaveDefOutReq )
1640 if (
p->fHaveDefInDri )
1646 if (
p->fHaveDefOutLoad )
struct Abc_Obj_t_ Abc_Obj_t
ABC_DLL Abc_Obj_t * Abc_NtkFindOrCreateNet(Abc_Ntk_t *pNtk, char *pName)
ABC_DLL void Abc_NtkTimeSetDefaultOutputLoad(Abc_Ntk_t *pNtk, float Rise, float Fall)
ABC_DLL void Abc_NtkTimeSetDefaultArrival(Abc_Ntk_t *pNtk, float Rise, float Fall)
ABC_DLL Abc_Ntk_t * Abc_NtkAlloc(Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan)
DECLARATIONS ///.
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
#define Abc_NtkForEachPo(pNtk, pPo, i)
ABC_DLL int Abc_NtkCheckRead(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachBlackbox(pNtk, pObj, i)
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void Abc_NtkFinalizeRead(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_NtkTimeSetRequired(Abc_Ntk_t *pNtk, int ObjId, float Rise, float Fall)
#define Abc_NtkForEachPi(pNtk, pPi, i)
ABC_DLL void Abc_NtkTimeSetDefaultInputDrive(Abc_Ntk_t *pNtk, float Rise, float Fall)
ABC_DLL int Abc_SopGetVarNum(char *pSop)
ABC_DLL void Abc_NtkTimeSetDefaultRequired(Abc_Ntk_t *pNtk, float Rise, float Fall)
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_NtkTimeSetOutputLoad(Abc_Ntk_t *pNtk, int PoNum, float Rise, float Fall)
ABC_DLL void Abc_NtkTimeSetArrival(Abc_Ntk_t *pNtk, int ObjId, float Rise, float Fall)
ABC_DLL void Abc_NtkTimeSetInputDrive(Abc_Ntk_t *pNtk, int PiNum, float Rise, float Fall)
ABC_DLL char * Abc_SopRegister(Mem_Flex_t *pMan, const char *pName)
DECLARATIONS ///.
ABC_DLL Abc_Obj_t * Abc_NtkFindNet(Abc_Ntk_t *pNtk, char *pName)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL void * Abc_FrameReadLibGen()
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
Abc_Obj_t * Io_ReadCreatePo(Abc_Ntk_t *pNtk, char *pName)
Abc_Obj_t * Io_ReadCreatePi(Abc_Ntk_t *pNtk, char *pName)
Abc_Obj_t * Io_ReadCreateLatch(Abc_Ntk_t *pNtk, char *pNetLI, char *pNetLO)
Abc_Obj_t * Io_ReadCreateNode(Abc_Ntk_t *pNtk, char *pNameOut, char *pNamesIn[], int nInputs)
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 ///.
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)
typedefABC_NAMESPACE_IMPL_START struct Io_ReadBlif_t_ Io_ReadBlif_t
DECLARATIONS ///.
void Mem_FlexStop(Mem_Flex_t *p, int fVerbose)
Mio_Pin_t * Mio_GateReadPins(Mio_Gate_t *pGate)
int Mio_GateReadPinNum(Mio_Gate_t *pGate)
struct Mio_LibraryStruct_t_ Mio_Library_t
Mio_Gate_t * Mio_GateReadTwin(Mio_Gate_t *pGate)
Mio_Gate_t * Mio_LibraryReadGateByName(Mio_Library_t *pLib, char *pName, char *pOutName)
char * Mio_PinReadName(Mio_Pin_t *pPin)
Mio_Pin_t * Mio_PinReadNext(Mio_Pin_t *pPin)
struct Mio_PinStruct_t_ Mio_Pin_t
char * Mio_GateReadOutName(Mio_Gate_t *pGate)
struct Mio_GateStruct_t_ Mio_Gate_t
struct Mem_Flex_t_ Mem_Flex_t
int stmm_lookup(stmm_table *table, char *key, char **value)
#define stmm_foreach_item(table, gen, key, value)
Extra_FileReader_t * pReader
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.