#include "io.h"
#include "main.h"
#include "mio.h"
Go to the source code of this file.
Functions | |
static char * | Abc_NtkPrintSop (char *pSop) |
static int | Abc_NtkCountLogicNodes (Vec_Ptr_t *vNodes) |
void | Io_WriteDot (Abc_Ntk_t *pNtk, char *FileName) |
void | Io_WriteDotNtk (Abc_Ntk_t *pNtk, Vec_Ptr_t *vNodes, Vec_Ptr_t *vNodesShow, char *pFileName, int fGateNames, int fUseReverse) |
void | Io_WriteDotSeq (Abc_Ntk_t *pNtk, Vec_Ptr_t *vNodes, Vec_Ptr_t *vNodesShow, char *pFileName, int fGateNames, int fUseReverse) |
int Abc_NtkCountLogicNodes | ( | Vec_Ptr_t * | vNodes | ) | [static] |
Function*************************************************************
Synopsis [Computes the printable SOP form.]
Description []
SideEffects []
SeeAlso []
Definition at line 790 of file ioWriteDot.c.
00791 { 00792 Abc_Obj_t * pObj; 00793 int i, Counter = 0; 00794 Vec_PtrForEachEntry( vNodes, pObj, i ) 00795 { 00796 if ( !Abc_ObjIsNode(pObj) ) 00797 continue; 00798 if ( Abc_ObjFaninNum(pObj) == 0 && Abc_ObjFanoutNum(pObj) == 0 ) 00799 continue; 00800 Counter ++; 00801 } 00802 return Counter; 00803 }
char * Abc_NtkPrintSop | ( | char * | pSop | ) | [static] |
CFile****************************************************************
FileName [ioWriteDot.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Command processing package.]
Synopsis [Procedures to write the graph structure of AIG in DOT.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [
] DECLARATIONS ///
Function*************************************************************
Synopsis [Computes the printable SOP form.]
Description []
SideEffects []
SeeAlso []
Definition at line 760 of file ioWriteDot.c.
00761 { 00762 static char Buffer[1000]; 00763 char * pGet, * pSet; 00764 pSet = Buffer; 00765 for ( pGet = pSop; *pGet; pGet++ ) 00766 { 00767 if ( *pGet == '\n' ) 00768 { 00769 *pSet++ = '\\'; 00770 *pSet++ = 'n'; 00771 } 00772 else 00773 *pSet++ = *pGet; 00774 } 00775 *(pSet-2) = 0; 00776 return Buffer; 00777 }
void Io_WriteDot | ( | Abc_Ntk_t * | pNtk, | |
char * | FileName | |||
) |
FUNCTION DEFINITIONS ///Function*************************************************************
Synopsis [Writes the graph structure of network for DOT.]
Description [Useful for graph visualization using tools such as GraphViz: http://www.graphviz.org/]
SideEffects []
SeeAlso []
Definition at line 48 of file ioWriteDot.c.
00049 { 00050 Vec_Ptr_t * vNodes; 00051 vNodes = Abc_NtkCollectObjects( pNtk ); 00052 Io_WriteDotNtk( pNtk, vNodes, NULL, FileName, 0, 0 ); 00053 Vec_PtrFree( vNodes ); 00054 }
void Io_WriteDotNtk | ( | Abc_Ntk_t * | pNtk, | |
Vec_Ptr_t * | vNodes, | |||
Vec_Ptr_t * | vNodesShow, | |||
char * | pFileName, | |||
int | fGateNames, | |||
int | fUseReverse | |||
) |
Function*************************************************************
Synopsis [Writes the graph structure of network for DOT.]
Description [Useful for graph visualization using tools such as GraphViz: http://www.graphviz.org/]
SideEffects []
SeeAlso []
Definition at line 68 of file ioWriteDot.c.
00069 { 00070 FILE * pFile; 00071 Abc_Obj_t * pNode, * pFanin; 00072 char * pSopString; 00073 int LevelMin, LevelMax, fHasCos, Level, i, k, fHasBdds, fCompl; 00074 int Limit = 300; 00075 00076 assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsLogic(pNtk) ); 00077 00078 if ( vNodes->nSize < 1 ) 00079 { 00080 printf( "The set has no nodes. DOT file is not written.\n" ); 00081 return; 00082 } 00083 00084 if ( vNodes->nSize > Limit ) 00085 { 00086 printf( "The set has more than %d nodes. DOT file is not written.\n", Limit ); 00087 return; 00088 } 00089 00090 // start the stream 00091 if ( (pFile = fopen( pFileName, "w" )) == NULL ) 00092 { 00093 fprintf( stdout, "Cannot open the intermediate file \"%s\".\n", pFileName ); 00094 return; 00095 } 00096 00097 // transform logic functions from BDD to SOP 00098 if ( fHasBdds = Abc_NtkIsBddLogic(pNtk) ) 00099 { 00100 if ( !Abc_NtkBddToSop(pNtk, 0) ) 00101 { 00102 printf( "Io_WriteDotNtk(): Converting to SOPs has failed.\n" ); 00103 return; 00104 } 00105 } 00106 00107 // mark the nodes from the set 00108 Vec_PtrForEachEntry( vNodes, pNode, i ) 00109 pNode->fMarkC = 1; 00110 if ( vNodesShow ) 00111 Vec_PtrForEachEntry( vNodesShow, pNode, i ) 00112 pNode->fMarkB = 1; 00113 00114 // get the levels of nodes 00115 LevelMax = Abc_NtkLevel( pNtk ); 00116 if ( fUseReverse ) 00117 { 00118 LevelMin = Abc_NtkLevelReverse( pNtk ); 00119 assert( LevelMax == LevelMin ); 00120 Vec_PtrForEachEntry( vNodes, pNode, i ) 00121 if ( Abc_ObjIsNode(pNode) ) 00122 pNode->Level = LevelMax - pNode->Level + 1; 00123 } 00124 00125 // find the largest and the smallest levels 00126 LevelMin = 10000; 00127 LevelMax = -1; 00128 fHasCos = 0; 00129 Vec_PtrForEachEntry( vNodes, pNode, i ) 00130 { 00131 if ( Abc_ObjIsCo(pNode) ) 00132 { 00133 fHasCos = 1; 00134 continue; 00135 } 00136 if ( LevelMin > (int)pNode->Level ) 00137 LevelMin = pNode->Level; 00138 if ( LevelMax < (int)pNode->Level ) 00139 LevelMax = pNode->Level; 00140 } 00141 00142 // set the level of the CO nodes 00143 if ( fHasCos ) 00144 { 00145 LevelMax++; 00146 Vec_PtrForEachEntry( vNodes, pNode, i ) 00147 { 00148 if ( Abc_ObjIsCo(pNode) ) 00149 pNode->Level = LevelMax; 00150 } 00151 } 00152 00153 // write the DOT header 00154 fprintf( pFile, "# %s\n", "Network structure generated by ABC" ); 00155 fprintf( pFile, "\n" ); 00156 fprintf( pFile, "digraph network {\n" ); 00157 fprintf( pFile, "size = \"7.5,10\";\n" ); 00158 // fprintf( pFile, "size = \"10,8.5\";\n" ); 00159 // fprintf( pFile, "size = \"14,11\";\n" ); 00160 // fprintf( pFile, "page = \"8,11\";\n" ); 00161 // fprintf( pFile, "ranksep = 0.5;\n" ); 00162 // fprintf( pFile, "nodesep = 0.5;\n" ); 00163 fprintf( pFile, "center = true;\n" ); 00164 // fprintf( pFile, "orientation = landscape;\n" ); 00165 // fprintf( pFile, "edge [fontsize = 10];\n" ); 00166 // fprintf( pFile, "edge [dir = none];\n" ); 00167 fprintf( pFile, "edge [dir = back];\n" ); 00168 fprintf( pFile, "\n" ); 00169 00170 // labels on the left of the picture 00171 fprintf( pFile, "{\n" ); 00172 fprintf( pFile, " node [shape = plaintext];\n" ); 00173 fprintf( pFile, " edge [style = invis];\n" ); 00174 fprintf( pFile, " LevelTitle1 [label=\"\"];\n" ); 00175 fprintf( pFile, " LevelTitle2 [label=\"\"];\n" ); 00176 // generate node names with labels 00177 for ( Level = LevelMax; Level >= LevelMin; Level-- ) 00178 { 00179 // the visible node name 00180 fprintf( pFile, " Level%d", Level ); 00181 fprintf( pFile, " [label = " ); 00182 // label name 00183 fprintf( pFile, "\"" ); 00184 fprintf( pFile, "\"" ); 00185 fprintf( pFile, "];\n" ); 00186 } 00187 00188 // genetate the sequence of visible/invisible nodes to mark levels 00189 fprintf( pFile, " LevelTitle1 -> LevelTitle2 ->" ); 00190 for ( Level = LevelMax; Level >= LevelMin; Level-- ) 00191 { 00192 // the visible node name 00193 fprintf( pFile, " Level%d", Level ); 00194 // the connector 00195 if ( Level != LevelMin ) 00196 fprintf( pFile, " ->" ); 00197 else 00198 fprintf( pFile, ";" ); 00199 } 00200 fprintf( pFile, "\n" ); 00201 fprintf( pFile, "}" ); 00202 fprintf( pFile, "\n" ); 00203 fprintf( pFile, "\n" ); 00204 00205 // generate title box on top 00206 fprintf( pFile, "{\n" ); 00207 fprintf( pFile, " rank = same;\n" ); 00208 fprintf( pFile, " LevelTitle1;\n" ); 00209 fprintf( pFile, " title1 [shape=plaintext,\n" ); 00210 fprintf( pFile, " fontsize=20,\n" ); 00211 fprintf( pFile, " fontname = \"Times-Roman\",\n" ); 00212 fprintf( pFile, " label=\"" ); 00213 fprintf( pFile, "%s", "Network structure visualized by ABC" ); 00214 fprintf( pFile, "\\n" ); 00215 fprintf( pFile, "Benchmark \\\"%s\\\". ", pNtk->pName ); 00216 fprintf( pFile, "Time was %s. ", Extra_TimeStamp() ); 00217 fprintf( pFile, "\"\n" ); 00218 fprintf( pFile, " ];\n" ); 00219 fprintf( pFile, "}" ); 00220 fprintf( pFile, "\n" ); 00221 fprintf( pFile, "\n" ); 00222 00223 // generate statistics box 00224 fprintf( pFile, "{\n" ); 00225 fprintf( pFile, " rank = same;\n" ); 00226 fprintf( pFile, " LevelTitle2;\n" ); 00227 fprintf( pFile, " title2 [shape=plaintext,\n" ); 00228 fprintf( pFile, " fontsize=18,\n" ); 00229 fprintf( pFile, " fontname = \"Times-Roman\",\n" ); 00230 fprintf( pFile, " label=\"" ); 00231 if ( Abc_NtkObjNum(pNtk) == Vec_PtrSize(vNodes) ) 00232 fprintf( pFile, "The network contains %d logic nodes and %d latches.", Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk) ); 00233 else 00234 fprintf( pFile, "The set contains %d logic nodes and spans %d levels.", Abc_NtkCountLogicNodes(vNodes), LevelMax - LevelMin + 1 ); 00235 fprintf( pFile, "\\n" ); 00236 fprintf( pFile, "\"\n" ); 00237 fprintf( pFile, " ];\n" ); 00238 fprintf( pFile, "}" ); 00239 fprintf( pFile, "\n" ); 00240 fprintf( pFile, "\n" ); 00241 00242 // generate the POs 00243 if ( fHasCos ) 00244 { 00245 fprintf( pFile, "{\n" ); 00246 fprintf( pFile, " rank = same;\n" ); 00247 // the labeling node of this level 00248 fprintf( pFile, " Level%d;\n", LevelMax ); 00249 // generate the PO nodes 00250 Vec_PtrForEachEntry( vNodes, pNode, i ) 00251 { 00252 if ( !Abc_ObjIsCo(pNode) ) 00253 continue; 00254 fprintf( pFile, " Node%d [label = \"%s%s\"", 00255 pNode->Id, 00256 (Abc_ObjIsBi(pNode)? Abc_ObjName(Abc_ObjFanout0(pNode)):Abc_ObjName(pNode)), 00257 (Abc_ObjIsBi(pNode)? "_in":"") ); 00258 fprintf( pFile, ", shape = %s", (Abc_ObjIsBi(pNode)? "box":"invtriangle") ); 00259 if ( pNode->fMarkB ) 00260 fprintf( pFile, ", style = filled" ); 00261 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00262 fprintf( pFile, "];\n" ); 00263 } 00264 fprintf( pFile, "}" ); 00265 fprintf( pFile, "\n" ); 00266 fprintf( pFile, "\n" ); 00267 } 00268 00269 // generate nodes of each rank 00270 for ( Level = LevelMax - fHasCos; Level >= LevelMin && Level > 0; Level-- ) 00271 { 00272 fprintf( pFile, "{\n" ); 00273 fprintf( pFile, " rank = same;\n" ); 00274 // the labeling node of this level 00275 fprintf( pFile, " Level%d;\n", Level ); 00276 Vec_PtrForEachEntry( vNodes, pNode, i ) 00277 { 00278 if ( (int)pNode->Level != Level ) 00279 continue; 00280 if ( Abc_ObjFaninNum(pNode) == 0 ) 00281 continue; 00282 // fprintf( pFile, " Node%d [label = \"%d\"", pNode->Id, pNode->Id ); 00283 if ( Abc_NtkIsStrash(pNtk) ) 00284 pSopString = ""; 00285 else if ( Abc_NtkHasMapping(pNtk) && fGateNames ) 00286 pSopString = Mio_GateReadName(pNode->pData); 00287 else if ( Abc_NtkHasMapping(pNtk) ) 00288 pSopString = Abc_NtkPrintSop(Mio_GateReadSop(pNode->pData)); 00289 else 00290 pSopString = Abc_NtkPrintSop(pNode->pData); 00291 fprintf( pFile, " Node%d [label = \"%d\\n%s\"", pNode->Id, pNode->Id, pSopString ); 00292 00293 fprintf( pFile, ", shape = ellipse" ); 00294 if ( pNode->fMarkB ) 00295 fprintf( pFile, ", style = filled" ); 00296 fprintf( pFile, "];\n" ); 00297 } 00298 fprintf( pFile, "}" ); 00299 fprintf( pFile, "\n" ); 00300 fprintf( pFile, "\n" ); 00301 } 00302 00303 // generate the PI nodes if any 00304 if ( LevelMin == 0 ) 00305 { 00306 fprintf( pFile, "{\n" ); 00307 fprintf( pFile, " rank = same;\n" ); 00308 // the labeling node of this level 00309 fprintf( pFile, " Level%d;\n", LevelMin ); 00310 // generate the PO nodes 00311 Vec_PtrForEachEntry( vNodes, pNode, i ) 00312 { 00313 if ( !Abc_ObjIsCi(pNode) ) 00314 { 00315 // check if the costant node is present 00316 if ( Abc_ObjFaninNum(pNode) == 0 && Abc_ObjFanoutNum(pNode) > 0 ) 00317 { 00318 fprintf( pFile, " Node%d [label = \"Const%d\"", pNode->Id, Abc_NtkIsStrash(pNode->pNtk) || Abc_NodeIsConst1(pNode) ); 00319 fprintf( pFile, ", shape = ellipse" ); 00320 if ( pNode->fMarkB ) 00321 fprintf( pFile, ", style = filled" ); 00322 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00323 fprintf( pFile, "];\n" ); 00324 } 00325 continue; 00326 } 00327 fprintf( pFile, " Node%d [label = \"%s\"", 00328 pNode->Id, 00329 (Abc_ObjIsBo(pNode)? Abc_ObjName(Abc_ObjFanin0(pNode)):Abc_ObjName(pNode)) ); 00330 fprintf( pFile, ", shape = %s", (Abc_ObjIsBo(pNode)? "box":"triangle") ); 00331 if ( pNode->fMarkB ) 00332 fprintf( pFile, ", style = filled" ); 00333 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00334 fprintf( pFile, "];\n" ); 00335 } 00336 fprintf( pFile, "}" ); 00337 fprintf( pFile, "\n" ); 00338 fprintf( pFile, "\n" ); 00339 } 00340 00341 // generate invisible edges from the square down 00342 fprintf( pFile, "title1 -> title2 [style = invis];\n" ); 00343 Vec_PtrForEachEntry( vNodes, pNode, i ) 00344 { 00345 if ( (int)pNode->Level != LevelMax ) 00346 continue; 00347 fprintf( pFile, "title2 -> Node%d [style = invis];\n", pNode->Id ); 00348 } 00349 00350 // generate edges 00351 Vec_PtrForEachEntry( vNodes, pNode, i ) 00352 { 00353 if ( Abc_ObjIsLatch(pNode) ) 00354 continue; 00355 Abc_ObjForEachFanin( pNode, pFanin, k ) 00356 { 00357 if ( Abc_ObjIsLatch(pFanin) ) 00358 continue; 00359 fCompl = 0; 00360 if ( Abc_NtkIsStrash(pNtk) ) 00361 fCompl = Abc_ObjFaninC(pNode, k); 00362 // generate the edge from this node to the next 00363 fprintf( pFile, "Node%d", pNode->Id ); 00364 fprintf( pFile, " -> " ); 00365 fprintf( pFile, "Node%d", pFanin->Id ); 00366 fprintf( pFile, " [style = %s", fCompl? "dotted" : "bold" ); 00367 // fprintf( pFile, ", label = \"%c\"", 'a' + k ); 00368 fprintf( pFile, "]" ); 00369 fprintf( pFile, ";\n" ); 00370 } 00371 } 00372 00373 fprintf( pFile, "}" ); 00374 fprintf( pFile, "\n" ); 00375 fprintf( pFile, "\n" ); 00376 fclose( pFile ); 00377 00378 // unmark the nodes from the set 00379 Vec_PtrForEachEntry( vNodes, pNode, i ) 00380 pNode->fMarkC = 0; 00381 if ( vNodesShow ) 00382 Vec_PtrForEachEntry( vNodesShow, pNode, i ) 00383 pNode->fMarkB = 0; 00384 00385 // convert the network back into BDDs if this is how it was 00386 if ( fHasBdds ) 00387 Abc_NtkSopToBdd(pNtk); 00388 }
void Io_WriteDotSeq | ( | Abc_Ntk_t * | pNtk, | |
Vec_Ptr_t * | vNodes, | |||
Vec_Ptr_t * | vNodesShow, | |||
char * | pFileName, | |||
int | fGateNames, | |||
int | fUseReverse | |||
) |
Function*************************************************************
Synopsis [Writes the graph structure of network for DOT.]
Description [Useful for graph visualization using tools such as GraphViz: http://www.graphviz.org/]
SideEffects []
SeeAlso []
Definition at line 403 of file ioWriteDot.c.
00404 { 00405 FILE * pFile; 00406 Abc_Obj_t * pNode, * pFanin; 00407 char * pSopString; 00408 int LevelMin, LevelMax, fHasCos, Level, i, k, fHasBdds, fCompl; 00409 int Limit = 300; 00410 00411 assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsLogic(pNtk) ); 00412 00413 if ( vNodes->nSize < 1 ) 00414 { 00415 printf( "The set has no nodes. DOT file is not written.\n" ); 00416 return; 00417 } 00418 00419 if ( vNodes->nSize > Limit ) 00420 { 00421 printf( "The set has more than %d nodes. DOT file is not written.\n", Limit ); 00422 return; 00423 } 00424 00425 // start the stream 00426 if ( (pFile = fopen( pFileName, "w" )) == NULL ) 00427 { 00428 fprintf( stdout, "Cannot open the intermediate file \"%s\".\n", pFileName ); 00429 return; 00430 } 00431 00432 // transform logic functions from BDD to SOP 00433 if ( fHasBdds = Abc_NtkIsBddLogic(pNtk) ) 00434 { 00435 if ( !Abc_NtkBddToSop(pNtk, 0) ) 00436 { 00437 printf( "Io_WriteDotNtk(): Converting to SOPs has failed.\n" ); 00438 return; 00439 } 00440 } 00441 00442 // mark the nodes from the set 00443 Vec_PtrForEachEntry( vNodes, pNode, i ) 00444 pNode->fMarkC = 1; 00445 if ( vNodesShow ) 00446 Vec_PtrForEachEntry( vNodesShow, pNode, i ) 00447 pNode->fMarkB = 1; 00448 00449 // get the levels of nodes 00450 LevelMax = Abc_NtkLevel( pNtk ); 00451 if ( fUseReverse ) 00452 { 00453 LevelMin = Abc_NtkLevelReverse( pNtk ); 00454 assert( LevelMax == LevelMin ); 00455 Vec_PtrForEachEntry( vNodes, pNode, i ) 00456 if ( Abc_ObjIsNode(pNode) ) 00457 pNode->Level = LevelMax - pNode->Level + 1; 00458 } 00459 00460 // find the largest and the smallest levels 00461 LevelMin = 10000; 00462 LevelMax = -1; 00463 fHasCos = 0; 00464 Vec_PtrForEachEntry( vNodes, pNode, i ) 00465 { 00466 if ( Abc_ObjIsCo(pNode) ) 00467 { 00468 fHasCos = 1; 00469 continue; 00470 } 00471 if ( LevelMin > (int)pNode->Level ) 00472 LevelMin = pNode->Level; 00473 if ( LevelMax < (int)pNode->Level ) 00474 LevelMax = pNode->Level; 00475 } 00476 00477 // set the level of the CO nodes 00478 if ( fHasCos ) 00479 { 00480 LevelMax++; 00481 Vec_PtrForEachEntry( vNodes, pNode, i ) 00482 { 00483 if ( Abc_ObjIsCo(pNode) ) 00484 pNode->Level = LevelMax; 00485 } 00486 } 00487 00488 // write the DOT header 00489 fprintf( pFile, "# %s\n", "Network structure generated by ABC" ); 00490 fprintf( pFile, "\n" ); 00491 fprintf( pFile, "digraph network {\n" ); 00492 fprintf( pFile, "size = \"7.5,10\";\n" ); 00493 // fprintf( pFile, "size = \"10,8.5\";\n" ); 00494 // fprintf( pFile, "size = \"14,11\";\n" ); 00495 // fprintf( pFile, "page = \"8,11\";\n" ); 00496 // fprintf( pFile, "ranksep = 0.5;\n" ); 00497 // fprintf( pFile, "nodesep = 0.5;\n" ); 00498 fprintf( pFile, "center = true;\n" ); 00499 // fprintf( pFile, "orientation = landscape;\n" ); 00500 // fprintf( pFile, "edge [fontsize = 10];\n" ); 00501 // fprintf( pFile, "edge [dir = none];\n" ); 00502 fprintf( pFile, "edge [dir = back];\n" ); 00503 fprintf( pFile, "\n" ); 00504 00505 // labels on the left of the picture 00506 fprintf( pFile, "{\n" ); 00507 fprintf( pFile, " node [shape = plaintext];\n" ); 00508 fprintf( pFile, " edge [style = invis];\n" ); 00509 fprintf( pFile, " LevelTitle1 [label=\"\"];\n" ); 00510 fprintf( pFile, " LevelTitle2 [label=\"\"];\n" ); 00511 // generate node names with labels 00512 for ( Level = LevelMax; Level >= LevelMin; Level-- ) 00513 { 00514 // the visible node name 00515 fprintf( pFile, " Level%d", Level ); 00516 fprintf( pFile, " [label = " ); 00517 // label name 00518 fprintf( pFile, "\"" ); 00519 fprintf( pFile, "\"" ); 00520 fprintf( pFile, "];\n" ); 00521 } 00522 00523 // genetate the sequence of visible/invisible nodes to mark levels 00524 fprintf( pFile, " LevelTitle1 -> LevelTitle2 ->" ); 00525 for ( Level = LevelMax; Level >= LevelMin; Level-- ) 00526 { 00527 // the visible node name 00528 fprintf( pFile, " Level%d", Level ); 00529 // the connector 00530 if ( Level != LevelMin ) 00531 fprintf( pFile, " ->" ); 00532 else 00533 fprintf( pFile, ";" ); 00534 } 00535 fprintf( pFile, "\n" ); 00536 fprintf( pFile, "}" ); 00537 fprintf( pFile, "\n" ); 00538 fprintf( pFile, "\n" ); 00539 00540 // generate title box on top 00541 fprintf( pFile, "{\n" ); 00542 fprintf( pFile, " rank = same;\n" ); 00543 fprintf( pFile, " LevelTitle1;\n" ); 00544 fprintf( pFile, " title1 [shape=plaintext,\n" ); 00545 fprintf( pFile, " fontsize=20,\n" ); 00546 fprintf( pFile, " fontname = \"Times-Roman\",\n" ); 00547 fprintf( pFile, " label=\"" ); 00548 fprintf( pFile, "%s", "Network structure visualized by ABC" ); 00549 fprintf( pFile, "\\n" ); 00550 fprintf( pFile, "Benchmark \\\"%s\\\". ", pNtk->pName ); 00551 fprintf( pFile, "Time was %s. ", Extra_TimeStamp() ); 00552 fprintf( pFile, "\"\n" ); 00553 fprintf( pFile, " ];\n" ); 00554 fprintf( pFile, "}" ); 00555 fprintf( pFile, "\n" ); 00556 fprintf( pFile, "\n" ); 00557 00558 // generate statistics box 00559 fprintf( pFile, "{\n" ); 00560 fprintf( pFile, " rank = same;\n" ); 00561 fprintf( pFile, " LevelTitle2;\n" ); 00562 fprintf( pFile, " title2 [shape=plaintext,\n" ); 00563 fprintf( pFile, " fontsize=18,\n" ); 00564 fprintf( pFile, " fontname = \"Times-Roman\",\n" ); 00565 fprintf( pFile, " label=\"" ); 00566 if ( Abc_NtkObjNum(pNtk) == Vec_PtrSize(vNodes) ) 00567 fprintf( pFile, "The network contains %d logic nodes and %d latches.", Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk) ); 00568 else 00569 fprintf( pFile, "The set contains %d logic nodes and spans %d levels.", Abc_NtkCountLogicNodes(vNodes), LevelMax - LevelMin + 1 ); 00570 fprintf( pFile, "\\n" ); 00571 fprintf( pFile, "\"\n" ); 00572 fprintf( pFile, " ];\n" ); 00573 fprintf( pFile, "}" ); 00574 fprintf( pFile, "\n" ); 00575 fprintf( pFile, "\n" ); 00576 00577 // generate the POs 00578 if ( fHasCos ) 00579 { 00580 fprintf( pFile, "{\n" ); 00581 fprintf( pFile, " rank = same;\n" ); 00582 // the labeling node of this level 00583 fprintf( pFile, " Level%d;\n", LevelMax ); 00584 // generate the PO nodes 00585 Vec_PtrForEachEntry( vNodes, pNode, i ) 00586 { 00587 if ( !Abc_ObjIsPo(pNode) ) 00588 continue; 00589 fprintf( pFile, " Node%d [label = \"%s\"", pNode->Id, Abc_ObjName(pNode) ); 00590 fprintf( pFile, ", shape = %s", "invtriangle" ); 00591 if ( pNode->fMarkB ) 00592 fprintf( pFile, ", style = filled" ); 00593 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00594 fprintf( pFile, "];\n" ); 00595 } 00596 fprintf( pFile, "}" ); 00597 fprintf( pFile, "\n" ); 00598 fprintf( pFile, "\n" ); 00599 } 00600 00601 // generate nodes of each rank 00602 for ( Level = LevelMax - fHasCos; Level >= LevelMin && Level > 0; Level-- ) 00603 { 00604 fprintf( pFile, "{\n" ); 00605 fprintf( pFile, " rank = same;\n" ); 00606 // the labeling node of this level 00607 fprintf( pFile, " Level%d;\n", Level ); 00608 Abc_NtkForEachNode( pNtk, pNode, i ) 00609 { 00610 if ( (int)pNode->Level != Level ) 00611 continue; 00612 // fprintf( pFile, " Node%d [label = \"%d\"", pNode->Id, pNode->Id ); 00613 if ( Abc_NtkIsStrash(pNtk) ) 00614 pSopString = ""; 00615 else if ( Abc_NtkHasMapping(pNtk) && fGateNames ) 00616 pSopString = Mio_GateReadName(pNode->pData); 00617 else if ( Abc_NtkHasMapping(pNtk) ) 00618 pSopString = Abc_NtkPrintSop(Mio_GateReadSop(pNode->pData)); 00619 else 00620 pSopString = Abc_NtkPrintSop(pNode->pData); 00621 fprintf( pFile, " Node%d [label = \"%d\\n%s\"", pNode->Id, pNode->Id, pSopString ); 00622 00623 fprintf( pFile, ", shape = ellipse" ); 00624 if ( pNode->fMarkB ) 00625 fprintf( pFile, ", style = filled" ); 00626 fprintf( pFile, "];\n" ); 00627 } 00628 fprintf( pFile, "}" ); 00629 fprintf( pFile, "\n" ); 00630 fprintf( pFile, "\n" ); 00631 } 00632 00633 // generate the PI nodes if any 00634 if ( LevelMin == 0 ) 00635 { 00636 fprintf( pFile, "{\n" ); 00637 fprintf( pFile, " rank = same;\n" ); 00638 // the labeling node of this level 00639 fprintf( pFile, " Level%d;\n", LevelMin ); 00640 // generate the PO nodes 00641 Vec_PtrForEachEntry( vNodes, pNode, i ) 00642 { 00643 if ( pNode->Level > 0 ) 00644 continue; 00645 if ( !Abc_ObjIsPi(pNode) ) 00646 { 00647 // check if the costant node is present 00648 if ( Abc_ObjFaninNum(pNode) == 0 && Abc_ObjFanoutNum(pNode) > 0 ) 00649 { 00650 fprintf( pFile, " Node%d [label = \"Const1\"", pNode->Id ); 00651 fprintf( pFile, ", shape = ellipse" ); 00652 if ( pNode->fMarkB ) 00653 fprintf( pFile, ", style = filled" ); 00654 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00655 fprintf( pFile, "];\n" ); 00656 } 00657 continue; 00658 } 00659 fprintf( pFile, " Node%d [label = \"%s\"", pNode->Id, Abc_ObjName(pNode) ); 00660 fprintf( pFile, ", shape = %s", "triangle" ); 00661 if ( pNode->fMarkB ) 00662 fprintf( pFile, ", style = filled" ); 00663 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00664 fprintf( pFile, "];\n" ); 00665 } 00666 fprintf( pFile, "}" ); 00667 fprintf( pFile, "\n" ); 00668 fprintf( pFile, "\n" ); 00669 } 00670 00671 // fprintf( pFile, "{\n" ); 00672 Vec_PtrForEachEntry( vNodes, pNode, i ) 00673 { 00674 if ( !Abc_ObjIsLatch(pNode) ) 00675 continue; 00676 fprintf( pFile, "Node%d [label = \"%s\"", pNode->Id, Abc_ObjName(pNode) ); 00677 fprintf( pFile, ", shape = box" ); 00678 if ( pNode->fMarkB ) 00679 fprintf( pFile, ", style = filled" ); 00680 fprintf( pFile, ", color = coral, fillcolor = coral" ); 00681 fprintf( pFile, "];\n" ); 00682 } 00683 // fprintf( pFile, "}" ); 00684 // fprintf( pFile, "\n" ); 00685 fprintf( pFile, "\n" ); 00686 00687 // generate invisible edges from the square down 00688 fprintf( pFile, "title1 -> title2 [style = invis];\n" ); 00689 Vec_PtrForEachEntry( vNodes, pNode, i ) 00690 { 00691 if ( (int)pNode->Level != LevelMax ) 00692 continue; 00693 if ( !Abc_ObjIsPo(pNode) ) 00694 continue; 00695 fprintf( pFile, "title2 -> Node%d [style = invis];\n", pNode->Id ); 00696 } 00697 00698 // generate edges 00699 Vec_PtrForEachEntry( vNodes, pNode, i ) 00700 { 00701 if ( Abc_ObjIsBi(pNode) || Abc_ObjIsBo(pNode) ) 00702 continue; 00703 Abc_ObjForEachFanin( pNode, pFanin, k ) 00704 { 00705 fCompl = 0; 00706 if ( Abc_NtkIsStrash(pNtk) ) 00707 { 00708 if ( Abc_ObjIsBi(pFanin) ) 00709 fCompl = Abc_ObjFaninC(pFanin, k); 00710 else 00711 fCompl = Abc_ObjFaninC(pNode, k); 00712 } 00713 if ( Abc_ObjIsBi(pFanin) || Abc_ObjIsBo(pFanin) ) 00714 pFanin = Abc_ObjFanin0(pFanin); 00715 if ( Abc_ObjIsBi(pFanin) || Abc_ObjIsBo(pFanin) ) 00716 pFanin = Abc_ObjFanin0(pFanin); 00717 if ( !pFanin->fMarkC ) 00718 continue; 00719 00720 // generate the edge from this node to the next 00721 fprintf( pFile, "Node%d", pNode->Id ); 00722 fprintf( pFile, " -> " ); 00723 fprintf( pFile, "Node%d", pFanin->Id ); 00724 fprintf( pFile, " [style = %s", fCompl? "dotted" : "bold" ); 00725 // fprintf( pFile, ", label = \"%c\"", 'a' + k ); 00726 fprintf( pFile, "]" ); 00727 fprintf( pFile, ";\n" ); 00728 } 00729 } 00730 00731 fprintf( pFile, "}" ); 00732 fprintf( pFile, "\n" ); 00733 fprintf( pFile, "\n" ); 00734 fclose( pFile ); 00735 00736 // unmark the nodes from the set 00737 Vec_PtrForEachEntry( vNodes, pNode, i ) 00738 pNode->fMarkC = 0; 00739 if ( vNodesShow ) 00740 Vec_PtrForEachEntry( vNodesShow, pNode, i ) 00741 pNode->fMarkB = 0; 00742 00743 // convert the network back into BDDs if this is how it was 00744 if ( fHasBdds ) 00745 Abc_NtkSopToBdd(pNtk); 00746 }