75 char * pSopString, SopString[32];
76 int LevelMin, LevelMax, fHasCos, Level, i, k, fHasBdds, fCompl, Prev, AigNodeId;
79 assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsLogic(pNtk) );
81 if ( vNodes->nSize < 1 )
83 printf(
"The set has no nodes. DOT file is not written.\n" );
87 if ( vNodes->nSize > Limit )
89 printf(
"The set has more than %d nodes. DOT file is not written.\n", Limit );
94 if ( (pFile = fopen( pFileName,
"w" )) == NULL )
96 fprintf( stdout,
"Cannot open the intermediate file \"%s\".\n", pFileName );
101 if ( (fHasBdds = Abc_NtkIsBddLogic(pNtk)) )
105 printf(
"Io_WriteDotNtk(): Converting to SOPs has failed.\n" );
122 assert( LevelMax == LevelMin );
124 if ( Abc_ObjIsNode(pNode) )
134 if ( Abc_ObjIsCo(pNode) )
139 if ( LevelMin > (
int)pNode->
Level )
140 LevelMin = pNode->
Level;
141 if ( LevelMax < (
int)pNode->
Level )
142 LevelMax = pNode->
Level;
151 if ( Abc_ObjIsCo(pNode) )
152 pNode->
Level = LevelMax;
157 fprintf( pFile,
"# %s\n",
"Network structure generated by ABC" );
158 fprintf( pFile,
"\n" );
159 fprintf( pFile,
"digraph network {\n" );
160 fprintf( pFile,
"size = \"7.5,10\";\n" );
166 fprintf( pFile,
"center = true;\n" );
170 fprintf( pFile,
"edge [dir = back];\n" );
171 fprintf( pFile,
"\n" );
174 fprintf( pFile,
"{\n" );
175 fprintf( pFile,
" node [shape = plaintext];\n" );
176 fprintf( pFile,
" edge [style = invis];\n" );
177 fprintf( pFile,
" LevelTitle1 [label=\"\"];\n" );
178 fprintf( pFile,
" LevelTitle2 [label=\"\"];\n" );
180 for ( Level = LevelMax; Level >= LevelMin; Level-- )
183 fprintf( pFile,
" Level%d", Level );
184 fprintf( pFile,
" [label = " );
186 fprintf( pFile,
"\"" );
187 fprintf( pFile,
"\"" );
188 fprintf( pFile,
"];\n" );
192 fprintf( pFile,
" LevelTitle1 -> LevelTitle2 ->" );
193 for ( Level = LevelMax; Level >= LevelMin; Level-- )
196 fprintf( pFile,
" Level%d", Level );
198 if ( Level != LevelMin )
199 fprintf( pFile,
" ->" );
201 fprintf( pFile,
";" );
203 fprintf( pFile,
"\n" );
204 fprintf( pFile,
"}" );
205 fprintf( pFile,
"\n" );
206 fprintf( pFile,
"\n" );
209 fprintf( pFile,
"{\n" );
210 fprintf( pFile,
" rank = same;\n" );
211 fprintf( pFile,
" LevelTitle1;\n" );
212 fprintf( pFile,
" title1 [shape=plaintext,\n" );
213 fprintf( pFile,
" fontsize=20,\n" );
214 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
215 fprintf( pFile,
" label=\"" );
216 fprintf( pFile,
"%s",
"Network structure visualized by ABC" );
217 fprintf( pFile,
"\\n" );
218 fprintf( pFile,
"Benchmark \\\"%s\\\". ", pNtk->
pName );
220 fprintf( pFile,
"\"\n" );
221 fprintf( pFile,
" ];\n" );
222 fprintf( pFile,
"}" );
223 fprintf( pFile,
"\n" );
224 fprintf( pFile,
"\n" );
227 fprintf( pFile,
"{\n" );
228 fprintf( pFile,
" rank = same;\n" );
229 fprintf( pFile,
" LevelTitle2;\n" );
230 fprintf( pFile,
" title2 [shape=plaintext,\n" );
231 fprintf( pFile,
" fontsize=18,\n" );
232 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
233 fprintf( pFile,
" label=\"" );
234 if ( Abc_NtkObjNum(pNtk) == Vec_PtrSize(vNodes) )
235 fprintf( pFile,
"The network contains %d logic nodes and %d latches.", Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk) );
237 fprintf( pFile,
"The set contains %d logic nodes and spans %d levels.", Abc_NtkCountLogicNodes(vNodes), LevelMax - LevelMin + 1 );
238 fprintf( pFile,
"\\n" );
239 fprintf( pFile,
"\"\n" );
240 fprintf( pFile,
" ];\n" );
241 fprintf( pFile,
"}" );
242 fprintf( pFile,
"\n" );
243 fprintf( pFile,
"\n" );
248 fprintf( pFile,
"{\n" );
249 fprintf( pFile,
" rank = same;\n" );
251 fprintf( pFile,
" Level%d;\n", LevelMax );
255 if ( !Abc_ObjIsCo(pNode) )
257 fprintf( pFile,
" Node%d [label = \"%s%s\"",
260 (Abc_ObjIsBi(pNode)?
"_in":
"") );
261 fprintf( pFile,
", shape = %s", (Abc_ObjIsBi(pNode)?
"box":
"invtriangle") );
263 fprintf( pFile,
", style = filled" );
264 fprintf( pFile,
", color = coral, fillcolor = coral" );
265 fprintf( pFile,
"];\n" );
267 fprintf( pFile,
"}" );
268 fprintf( pFile,
"\n" );
269 fprintf( pFile,
"\n" );
273 for ( Level = LevelMax - fHasCos; Level >= LevelMin && Level > 0; Level-- )
275 fprintf( pFile,
"{\n" );
276 fprintf( pFile,
" rank = same;\n" );
278 fprintf( pFile,
" Level%d;\n", Level );
281 if ( (
int)pNode->
Level != Level )
283 if ( Abc_ObjFaninNum(pNode) == 0 )
299 if ( Abc_NtkIsStrash(pNtk) )
301 else if ( Abc_NtkHasMapping(pNtk) && fGateNames )
303 else if ( Abc_NtkHasMapping(pNtk) )
310 sprintf( SopString,
"%d cubes", nCubes );
311 pSopString = SopString;
318 fprintf( pFile,
" Node%d [label = \"%s%d\\n%s\"", pNode->
Id, Abc_LitIsCompl(AigNodeId) ?
"-":
"+", Abc_Lit2Var(AigNodeId), pSopString );
320 fprintf( pFile,
" Node%d [label = \"%d\\n%s\"", pNode->
Id, pNode->
Id+1, pSopString );
325 fprintf( pFile,
", shape = ellipse" );
327 fprintf( pFile,
", style = filled" );
328 fprintf( pFile,
"];\n" );
330 fprintf( pFile,
"}" );
331 fprintf( pFile,
"\n" );
332 fprintf( pFile,
"\n" );
338 fprintf( pFile,
"{\n" );
339 fprintf( pFile,
" rank = same;\n" );
341 fprintf( pFile,
" Level%d;\n", LevelMin );
345 if ( !Abc_ObjIsCi(pNode) )
348 if ( Abc_ObjFaninNum(pNode) == 0 && Abc_ObjFanoutNum(pNode) > 0 )
350 fprintf( pFile,
" Node%d [label = \"Const%d\"", pNode->
Id, Abc_NtkIsStrash(pNode->
pNtk) ||
Abc_NodeIsConst1(pNode) );
351 fprintf( pFile,
", shape = ellipse" );
353 fprintf( pFile,
", style = filled" );
354 fprintf( pFile,
", color = coral, fillcolor = coral" );
355 fprintf( pFile,
"];\n" );
359 fprintf( pFile,
" Node%d [label = \"%s\"",
362 fprintf( pFile,
", shape = %s", (Abc_ObjIsBo(pNode)?
"box":
"triangle") );
364 fprintf( pFile,
", style = filled" );
365 fprintf( pFile,
", color = coral, fillcolor = coral" );
366 fprintf( pFile,
"];\n" );
368 fprintf( pFile,
"}" );
369 fprintf( pFile,
"\n" );
370 fprintf( pFile,
"\n" );
374 fprintf( pFile,
"title1 -> title2 [style = invis];\n" );
377 if ( (
int)pNode->
Level != LevelMax )
379 fprintf( pFile,
"title2 -> Node%d [style = invis];\n", pNode->
Id );
385 if ( (
int)pNode->
Level != LevelMax )
387 if ( !Abc_ObjIsPo(pNode) )
390 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, pNode->
Id );
397 if ( Abc_ObjIsLatch(pNode) )
401 if ( Abc_ObjIsLatch(pFanin) )
404 if ( Abc_NtkIsStrash(pNtk) )
405 fCompl = Abc_ObjFaninC(pNode, k);
407 fprintf( pFile,
"Node%d", pNode->
Id );
408 fprintf( pFile,
" -> " );
409 fprintf( pFile,
"Node%d", pFanin->
Id );
410 fprintf( pFile,
" [style = %s", fCompl?
"dotted" :
"solid" );
412 fprintf( pFile,
"]" );
413 fprintf( pFile,
";\n" );
417 fprintf( pFile,
"}" );
418 fprintf( pFile,
"\n" );
419 fprintf( pFile,
"\n" );
452 int LevelMin, LevelMax, fHasCos, Level, i, k, fHasBdds, fCompl, Prev;
455 assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsLogic(pNtk) );
457 if ( vNodes->nSize < 1 )
459 printf(
"The set has no nodes. DOT file is not written.\n" );
463 if ( vNodes->nSize > Limit )
465 printf(
"The set has more than %d nodes. DOT file is not written.\n", Limit );
470 if ( (pFile = fopen( pFileName,
"w" )) == NULL )
472 fprintf( stdout,
"Cannot open the intermediate file \"%s\".\n", pFileName );
477 if ( (fHasBdds = Abc_NtkIsBddLogic(pNtk)) )
481 printf(
"Io_WriteDotNtk(): Converting to SOPs has failed.\n" );
498 assert( LevelMax == LevelMin );
500 if ( Abc_ObjIsNode(pNode) )
510 if ( Abc_ObjIsCo(pNode) )
515 if ( LevelMin > (
int)pNode->
Level )
516 LevelMin = pNode->
Level;
517 if ( LevelMax < (
int)pNode->
Level )
518 LevelMax = pNode->
Level;
527 if ( Abc_ObjIsCo(pNode) )
528 pNode->
Level = LevelMax;
533 fprintf( pFile,
"# %s\n",
"Network structure generated by ABC" );
534 fprintf( pFile,
"\n" );
535 fprintf( pFile,
"digraph network {\n" );
536 fprintf( pFile,
"size = \"7.5,10\";\n" );
542 fprintf( pFile,
"center = true;\n" );
546 fprintf( pFile,
"edge [dir = back];\n" );
547 fprintf( pFile,
"\n" );
550 fprintf( pFile,
"{\n" );
551 fprintf( pFile,
" node [shape = plaintext];\n" );
552 fprintf( pFile,
" edge [style = invis];\n" );
553 fprintf( pFile,
" LevelTitle1 [label=\"\"];\n" );
554 fprintf( pFile,
" LevelTitle2 [label=\"\"];\n" );
556 for ( Level = LevelMax; Level >= LevelMin; Level-- )
559 fprintf( pFile,
" Level%d", Level );
560 fprintf( pFile,
" [label = " );
562 fprintf( pFile,
"\"" );
563 fprintf( pFile,
"\"" );
564 fprintf( pFile,
"];\n" );
568 fprintf( pFile,
" LevelTitle1 -> LevelTitle2 ->" );
569 for ( Level = LevelMax; Level >= LevelMin; Level-- )
572 fprintf( pFile,
" Level%d", Level );
574 if ( Level != LevelMin )
575 fprintf( pFile,
" ->" );
577 fprintf( pFile,
";" );
579 fprintf( pFile,
"\n" );
580 fprintf( pFile,
"}" );
581 fprintf( pFile,
"\n" );
582 fprintf( pFile,
"\n" );
585 fprintf( pFile,
"{\n" );
586 fprintf( pFile,
" rank = same;\n" );
587 fprintf( pFile,
" LevelTitle1;\n" );
588 fprintf( pFile,
" title1 [shape=plaintext,\n" );
589 fprintf( pFile,
" fontsize=20,\n" );
590 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
591 fprintf( pFile,
" label=\"" );
592 fprintf( pFile,
"%s",
"Network structure visualized by ABC" );
593 fprintf( pFile,
"\\n" );
594 fprintf( pFile,
"Benchmark \\\"%s\\\". ", pNtk->
pName );
596 fprintf( pFile,
"\"\n" );
597 fprintf( pFile,
" ];\n" );
598 fprintf( pFile,
"}" );
599 fprintf( pFile,
"\n" );
600 fprintf( pFile,
"\n" );
603 fprintf( pFile,
"{\n" );
604 fprintf( pFile,
" rank = same;\n" );
605 fprintf( pFile,
" LevelTitle2;\n" );
606 fprintf( pFile,
" title2 [shape=plaintext,\n" );
607 fprintf( pFile,
" fontsize=18,\n" );
608 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
609 fprintf( pFile,
" label=\"" );
610 if ( Abc_NtkObjNum(pNtk) == Vec_PtrSize(vNodes) )
611 fprintf( pFile,
"The network contains %d logic nodes and %d latches.", Abc_NtkNodeNum(pNtk), Abc_NtkLatchNum(pNtk) );
613 fprintf( pFile,
"The set contains %d logic nodes and spans %d levels.", Abc_NtkCountLogicNodes(vNodes), LevelMax - LevelMin + 1 );
614 fprintf( pFile,
"\\n" );
615 fprintf( pFile,
"\"\n" );
616 fprintf( pFile,
" ];\n" );
617 fprintf( pFile,
"}" );
618 fprintf( pFile,
"\n" );
619 fprintf( pFile,
"\n" );
624 fprintf( pFile,
"{\n" );
625 fprintf( pFile,
" rank = same;\n" );
627 fprintf( pFile,
" Level%d;\n", LevelMax );
631 if ( !Abc_ObjIsPo(pNode) )
633 fprintf( pFile,
" Node%d [label = \"%s\"", pNode->
Id,
Abc_ObjName(pNode) );
634 fprintf( pFile,
", shape = %s",
"invtriangle" );
636 fprintf( pFile,
", style = filled" );
637 fprintf( pFile,
", color = coral, fillcolor = coral" );
638 fprintf( pFile,
"];\n" );
640 fprintf( pFile,
"}" );
641 fprintf( pFile,
"\n" );
642 fprintf( pFile,
"\n" );
646 for ( Level = LevelMax - fHasCos; Level >= LevelMin && Level > 0; Level-- )
648 fprintf( pFile,
"{\n" );
649 fprintf( pFile,
" rank = same;\n" );
651 fprintf( pFile,
" Level%d;\n", Level );
654 if ( (
int)pNode->
Level != Level )
657 if ( Abc_NtkIsStrash(pNtk) )
659 else if ( Abc_NtkHasMapping(pNtk) && fGateNames )
661 else if ( Abc_NtkHasMapping(pNtk) )
665 fprintf( pFile,
" Node%d [label = \"%d\\n%s\"", pNode->
Id, pNode->
Id, pSopString );
667 fprintf( pFile,
", shape = ellipse" );
669 fprintf( pFile,
", style = filled" );
670 fprintf( pFile,
"];\n" );
672 fprintf( pFile,
"}" );
673 fprintf( pFile,
"\n" );
674 fprintf( pFile,
"\n" );
680 fprintf( pFile,
"{\n" );
681 fprintf( pFile,
" rank = same;\n" );
683 fprintf( pFile,
" Level%d;\n", LevelMin );
687 if ( pNode->
Level > 0 )
689 if ( !Abc_ObjIsPi(pNode) )
692 if ( Abc_ObjFaninNum(pNode) == 0 && Abc_ObjFanoutNum(pNode) > 0 )
694 fprintf( pFile,
" Node%d [label = \"Const1\"", pNode->
Id );
695 fprintf( pFile,
", shape = ellipse" );
697 fprintf( pFile,
", style = filled" );
698 fprintf( pFile,
", color = coral, fillcolor = coral" );
699 fprintf( pFile,
"];\n" );
703 fprintf( pFile,
" Node%d [label = \"%s\"", pNode->
Id,
Abc_ObjName(pNode) );
704 fprintf( pFile,
", shape = %s",
"triangle" );
706 fprintf( pFile,
", style = filled" );
707 fprintf( pFile,
", color = coral, fillcolor = coral" );
708 fprintf( pFile,
"];\n" );
710 fprintf( pFile,
"}" );
711 fprintf( pFile,
"\n" );
712 fprintf( pFile,
"\n" );
718 if ( !Abc_ObjIsLatch(pNode) )
720 fprintf( pFile,
"Node%d [label = \"%s\"", pNode->
Id,
Abc_ObjName(pNode) );
721 fprintf( pFile,
", shape = box" );
723 fprintf( pFile,
", style = filled" );
724 fprintf( pFile,
", color = coral, fillcolor = coral" );
725 fprintf( pFile,
"];\n" );
729 fprintf( pFile,
"\n" );
732 fprintf( pFile,
"title1 -> title2 [style = invis];\n" );
735 if ( (
int)pNode->
Level != LevelMax )
737 if ( !Abc_ObjIsPo(pNode) )
739 fprintf( pFile,
"title2 -> Node%d [style = invis];\n", pNode->
Id );
745 if ( (
int)pNode->
Level != LevelMax )
747 if ( !Abc_ObjIsPo(pNode) )
750 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, pNode->
Id );
757 if ( Abc_ObjIsBi(pNode) || Abc_ObjIsBo(pNode) )
762 if ( Abc_NtkIsStrash(pNtk) )
764 if ( Abc_ObjIsBi(pFanin) )
765 fCompl = Abc_ObjFaninC(pFanin, k);
767 fCompl = Abc_ObjFaninC(pNode, k);
769 if ( Abc_ObjIsBi(pFanin) || Abc_ObjIsBo(pFanin) )
770 pFanin = Abc_ObjFanin0(pFanin);
771 if ( Abc_ObjIsBi(pFanin) || Abc_ObjIsBo(pFanin) )
772 pFanin = Abc_ObjFanin0(pFanin);
777 fprintf( pFile,
"Node%d", pNode->
Id );
778 fprintf( pFile,
" -> " );
779 fprintf( pFile,
"Node%d", pFanin->
Id );
780 fprintf( pFile,
" [style = %s", fCompl?
"dotted" :
"solid" );
782 fprintf( pFile,
"]" );
783 fprintf( pFile,
";\n" );
787 fprintf( pFile,
"}" );
788 fprintf( pFile,
"\n" );
789 fprintf( pFile,
"\n" );
void Io_WriteDotSeq(Abc_Ntk_t *pNtk, Vec_Ptr_t *vNodes, Vec_Ptr_t *vNodesShow, char *pFileName, int fGateNames, int fUseReverse)
void Io_WriteDotNtk(Abc_Ntk_t *pNtk, Vec_Ptr_t *vNodes, Vec_Ptr_t *vNodesShow, char *pFileName, int fGateNames, int fUseReverse, int fAigIds)