55 Vec_Bit_t * vPath = Vec_BitStart( Gia_ManObjNum(
p) );
56 int i, k, iFan, LevelMax, nLevels, * pLevels, Level, Prev;
57 int nLuts = 0, nNodes = 0, nEdges = 0;
63 if ( pLevels[iFan] == nLevels )
64 Vec_BitWriteEntry( vPath, iFan, 1 );
70 if ( !Vec_BitEntry(vPath, i) )
75 if ( pLevels[iFan] +1 < pLevels[i] )
77 assert( pLevels[iFan] + 1 == pLevels[i] );
78 Vec_BitWriteEntry( vPath, iFan, 1 );
88 fprintf( stdout,
"Cannot visualize AIG with more than %d critical nodes.\n",
NODE_MAX );
91 if ( (pFile = fopen( pFileName,
"w" )) == NULL )
95 fprintf( stdout,
"Cannot open the intermediate file \"%s\".\n", pFileName );
99 Vec_IntFreeP( &
p->vLevels );
100 p->vLevels = Vec_IntAllocArray( pLevels, Gia_ManObjNum(
p) );
103 LevelMax = 1 + nLevels;
105 Vec_IntWriteEntry(
p->vLevels, Gia_ObjId(
p, pNode), LevelMax );
108 fprintf( pFile,
"# %s\n",
"AIG structure generated by GIA package" );
109 fprintf( pFile,
"\n" );
110 fprintf( pFile,
"digraph AIG {\n" );
111 fprintf( pFile,
"size = \"7.5,10\";\n" );
114 fprintf( pFile,
"center = true;\n" );
118 fprintf( pFile,
"edge [dir = back];\n" );
119 fprintf( pFile,
"\n" );
122 fprintf( pFile,
"{\n" );
123 fprintf( pFile,
" node [shape = plaintext];\n" );
124 fprintf( pFile,
" edge [style = invis];\n" );
125 fprintf( pFile,
" LevelTitle1 [label=\"\"];\n" );
126 fprintf( pFile,
" LevelTitle2 [label=\"\"];\n" );
128 for ( Level = LevelMax; Level >= 0; Level-- )
131 fprintf( pFile,
" Level%d", Level );
132 fprintf( pFile,
" [label = " );
134 fprintf( pFile,
"\"" );
135 fprintf( pFile,
"\"" );
136 fprintf( pFile,
"];\n" );
140 fprintf( pFile,
" LevelTitle1 -> LevelTitle2 ->" );
141 for ( Level = LevelMax; Level >= 0; Level-- )
144 fprintf( pFile,
" Level%d", Level );
147 fprintf( pFile,
" ->" );
149 fprintf( pFile,
";" );
151 fprintf( pFile,
"\n" );
152 fprintf( pFile,
"}" );
153 fprintf( pFile,
"\n" );
154 fprintf( pFile,
"\n" );
157 fprintf( pFile,
"{\n" );
158 fprintf( pFile,
" rank = same;\n" );
159 fprintf( pFile,
" LevelTitle1;\n" );
160 fprintf( pFile,
" title1 [shape=plaintext,\n" );
161 fprintf( pFile,
" fontsize=20,\n" );
162 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
163 fprintf( pFile,
" label=\"" );
164 fprintf( pFile,
"%s",
"AIG structure visualized by ABC" );
165 fprintf( pFile,
"\\n" );
166 fprintf( pFile,
"Benchmark \\\"%s\\\". ",
"aig" );
168 fprintf( pFile,
"\"\n" );
169 fprintf( pFile,
" ];\n" );
170 fprintf( pFile,
"}" );
171 fprintf( pFile,
"\n" );
172 fprintf( pFile,
"\n" );
175 fprintf( pFile,
"{\n" );
176 fprintf( pFile,
" rank = same;\n" );
177 fprintf( pFile,
" LevelTitle2;\n" );
178 fprintf( pFile,
" title2 [shape=plaintext,\n" );
179 fprintf( pFile,
" fontsize=18,\n" );
180 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
181 fprintf( pFile,
" label=\"" );
182 fprintf( pFile,
"The critical path contains %d LUTs with %d critical edges and spans %d levels.", nNodes, nEdges, nLevels );
183 fprintf( pFile,
"\\n" );
184 fprintf( pFile,
"\"\n" );
185 fprintf( pFile,
" ];\n" );
186 fprintf( pFile,
"}" );
187 fprintf( pFile,
"\n" );
188 fprintf( pFile,
"\n" );
191 fprintf( pFile,
"{\n" );
192 fprintf( pFile,
" rank = same;\n" );
194 fprintf( pFile,
" Level%d;\n", LevelMax );
198 if ( Gia_ObjLevel(
p, Gia_ObjFanin0(pNode)) < nLevels )
200 assert( Gia_ObjLevel(
p, Gia_ObjFanin0(pNode)) == nLevels );
201 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
202 fprintf( pFile,
", shape = %s",
"invtriangle" );
203 fprintf( pFile,
", color = coral, fillcolor = coral" );
204 fprintf( pFile,
"];\n" );
206 fprintf( pFile,
"}" );
207 fprintf( pFile,
"\n" );
208 fprintf( pFile,
"\n" );
211 for ( Level = LevelMax - 1; Level > 0; Level-- )
213 fprintf( pFile,
"{\n" );
214 fprintf( pFile,
" rank = same;\n" );
216 fprintf( pFile,
" Level%d;\n", Level );
219 if ( (
int)Gia_ObjLevel(
p, pNode) != Level || !Vec_BitEntry(vPath, i) )
221 fprintf( pFile,
" Node%d [label = \"%d:%d\"", i, Vec_IntSize(
p->vIdsOrig)?Vec_IntEntry(
p->vIdsOrig,i):i, Gia_ObjIsAnd(pNode)?Gia_ObjLutSize(
p, i):0 );
222 fprintf( pFile,
", shape = ellipse" );
224 fprintf( pFile,
", style = filled" );
225 fprintf( pFile,
"];\n" );
227 fprintf( pFile,
"}" );
228 fprintf( pFile,
"\n" );
229 fprintf( pFile,
"\n" );
233 fprintf( pFile,
"{\n" );
234 fprintf( pFile,
" rank = same;\n" );
236 fprintf( pFile,
" Level%d;\n", 0 );
240 if ( !Vec_BitEntry(vPath, Gia_ObjId(
p, pNode)) )
242 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
243 fprintf( pFile,
", shape = %s",
"triangle" );
244 fprintf( pFile,
", color = coral, fillcolor = coral" );
245 fprintf( pFile,
"];\n" );
247 fprintf( pFile,
"}" );
248 fprintf( pFile,
"\n" );
249 fprintf( pFile,
"\n" );
252 fprintf( pFile,
"title1 -> title2 [style = invis];\n" );
255 if ( Gia_ObjLevel(
p, Gia_ObjFanin0(pNode)) < nLevels )
257 fprintf( pFile,
"title2 -> Node%d [style = invis];\n", Gia_ObjId(
p, pNode) );
263 if ( Gia_ObjLevel(
p, Gia_ObjFanin0(pNode)) < nLevels )
265 assert( Gia_ObjLevel(
p, Gia_ObjFanin0(pNode)) == nLevels );
267 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
268 Prev = Gia_ObjId(
p, pNode);
274 if ( !Vec_BitEntry(vPath, Gia_ObjId(
p, pNode)) )
277 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
278 Prev = Gia_ObjId(
p, pNode);
284 if ( Gia_ObjIsCo(pNode) )
286 if ( Gia_ObjLevel(
p, Gia_ObjFanin0(pNode)) == nLevels )
289 fprintf( pFile,
"Node%d", i );
290 fprintf( pFile,
" -> " );
291 fprintf( pFile,
"Node%d", Gia_ObjFaninId0p(
p, pNode) );
292 fprintf( pFile,
" [" );
293 fprintf( pFile,
"style = %s",
"solid" );
294 fprintf( pFile,
"]" );
295 fprintf( pFile,
";\n" );
299 if ( !Gia_ObjIsAnd(pNode) || !Vec_BitEntry(vPath, i) )
303 if ( pLevels[iFan] + 1 < pLevels[i] )
305 assert( pLevels[iFan] + 1 == pLevels[i] );
307 fprintf( pFile,
"Node%d", i );
308 fprintf( pFile,
" -> " );
309 fprintf( pFile,
"Node%d", iFan );
310 fprintf( pFile,
" [" );
311 fprintf( pFile,
"style = %s",
"solid" );
312 fprintf( pFile,
"]" );
313 fprintf( pFile,
";\n" );
317 fprintf( pFile,
"}" );
318 fprintf( pFile,
"\n" );
319 fprintf( pFile,
"\n" );
322 Vec_IntFreeP( &
p->vLevels );
323 Vec_BitFree( vPath );
343 int LevelMax, Prev, Level, i;
344 int fConstIsUsed = 0;
348 fprintf( stdout,
"Cannot visualize AIG with more than %d nodes.\n",
NODE_MAX );
351 if ( (pFile = fopen( pFileName,
"w" )) == NULL )
353 fprintf( stdout,
"Cannot open the intermediate file \"%s\".\n", pFileName );
361 else if (
p->nXors ||
p->nMuxes )
363 if ( Gia_ObjIsXor(pNode) || Gia_ObjIsMux(
p, pNode) )
369 Vec_IntWriteEntry(
p->vLevels, Gia_ObjId(
p, pNode), LevelMax );
372 fprintf( pFile,
"# %s\n",
"AIG structure generated by GIA package" );
373 fprintf( pFile,
"\n" );
374 fprintf( pFile,
"digraph AIG {\n" );
375 fprintf( pFile,
"size = \"7.5,10\";\n" );
378 fprintf( pFile,
"center = true;\n" );
382 fprintf( pFile,
"edge [dir = back];\n" );
383 fprintf( pFile,
"\n" );
386 fprintf( pFile,
"{\n" );
387 fprintf( pFile,
" node [shape = plaintext];\n" );
388 fprintf( pFile,
" edge [style = invis];\n" );
389 fprintf( pFile,
" LevelTitle1 [label=\"\"];\n" );
390 fprintf( pFile,
" LevelTitle2 [label=\"\"];\n" );
392 for ( Level = LevelMax; Level >= 0; Level-- )
395 fprintf( pFile,
" Level%d", Level );
396 fprintf( pFile,
" [label = " );
398 fprintf( pFile,
"\"" );
399 fprintf( pFile,
"\"" );
400 fprintf( pFile,
"];\n" );
404 fprintf( pFile,
" LevelTitle1 -> LevelTitle2 ->" );
405 for ( Level = LevelMax; Level >= 0; Level-- )
408 fprintf( pFile,
" Level%d", Level );
411 fprintf( pFile,
" ->" );
413 fprintf( pFile,
";" );
415 fprintf( pFile,
"\n" );
416 fprintf( pFile,
"}" );
417 fprintf( pFile,
"\n" );
418 fprintf( pFile,
"\n" );
421 fprintf( pFile,
"{\n" );
422 fprintf( pFile,
" rank = same;\n" );
423 fprintf( pFile,
" LevelTitle1;\n" );
424 fprintf( pFile,
" title1 [shape=plaintext,\n" );
425 fprintf( pFile,
" fontsize=20,\n" );
426 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
427 fprintf( pFile,
" label=\"" );
428 fprintf( pFile,
"%s",
"AIG structure visualized by ABC" );
429 fprintf( pFile,
"\\n" );
430 fprintf( pFile,
"Benchmark \\\"%s\\\". ",
"aig" );
432 fprintf( pFile,
"\"\n" );
433 fprintf( pFile,
" ];\n" );
434 fprintf( pFile,
"}" );
435 fprintf( pFile,
"\n" );
436 fprintf( pFile,
"\n" );
439 fprintf( pFile,
"{\n" );
440 fprintf( pFile,
" rank = same;\n" );
441 fprintf( pFile,
" LevelTitle2;\n" );
442 fprintf( pFile,
" title2 [shape=plaintext,\n" );
443 fprintf( pFile,
" fontsize=18,\n" );
444 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
445 fprintf( pFile,
" label=\"" );
446 fprintf( pFile,
"The AIG contains %d nodes and spans %d levels.", Gia_ManAndNum(
p), LevelMax-1 );
447 fprintf( pFile,
"\\n" );
448 fprintf( pFile,
"\"\n" );
449 fprintf( pFile,
" ];\n" );
450 fprintf( pFile,
"}" );
451 fprintf( pFile,
"\n" );
452 fprintf( pFile,
"\n" );
455 fprintf( pFile,
"{\n" );
456 fprintf( pFile,
" rank = same;\n" );
458 fprintf( pFile,
" Level%d;\n", LevelMax );
462 if ( Gia_ObjFaninId0p(
p, pNode) == 0 )
473 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
475 fprintf( pFile,
", shape = %s",
"invtriangle" );
476 fprintf( pFile,
", color = coral, fillcolor = coral" );
477 fprintf( pFile,
"];\n" );
479 fprintf( pFile,
"}" );
480 fprintf( pFile,
"\n" );
481 fprintf( pFile,
"\n" );
484 for ( Level = LevelMax - 1; Level > 0; Level-- )
486 fprintf( pFile,
"{\n" );
487 fprintf( pFile,
" rank = same;\n" );
489 fprintf( pFile,
" Level%d;\n", Level );
492 if ( (
int)Gia_ObjLevel(
p, pNode) != Level )
501 fprintf( pFile,
" Node%d [label = \"%d\"", i, i );
503 if ( Gia_ObjIsXor(pNode) )
504 fprintf( pFile,
", shape = doublecircle" );
505 else if ( Gia_ObjIsMux(
p, pNode) )
506 fprintf( pFile,
", shape = trapezium" );
508 fprintf( pFile,
", shape = ellipse" );
511 fprintf( pFile,
", style = filled" );
512 fprintf( pFile,
"];\n" );
514 fprintf( pFile,
"}" );
515 fprintf( pFile,
"\n" );
516 fprintf( pFile,
"\n" );
520 fprintf( pFile,
"{\n" );
521 fprintf( pFile,
" rank = same;\n" );
523 fprintf( pFile,
" Level%d;\n", 0 );
528 fprintf( pFile,
" Node%d [label = \"Const0\"", 0 );
529 fprintf( pFile,
", shape = ellipse" );
530 fprintf( pFile,
", color = coral, fillcolor = coral" );
531 fprintf( pFile,
"];\n" );
545 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
547 fprintf( pFile,
", shape = %s",
"triangle" );
548 fprintf( pFile,
", color = coral, fillcolor = coral" );
549 fprintf( pFile,
"];\n" );
551 fprintf( pFile,
"}" );
552 fprintf( pFile,
"\n" );
553 fprintf( pFile,
"\n" );
556 fprintf( pFile,
"title1 -> title2 [style = invis];\n" );
558 fprintf( pFile,
"title2 -> Node%d [style = invis];\n", Gia_ObjId(
p, pNode) );
564 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
565 Prev = Gia_ObjId(
p, pNode);
572 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
573 Prev = Gia_ObjId(
p, pNode);
579 if ( !Gia_ObjIsAnd(pNode) && !Gia_ObjIsCo(pNode) && !Gia_ObjIsBuf(pNode) )
582 fprintf( pFile,
"Node%d", i );
583 fprintf( pFile,
" -> " );
584 fprintf( pFile,
"Node%d", Gia_ObjFaninId0(pNode, i) );
585 fprintf( pFile,
" [" );
586 fprintf( pFile,
"style = %s", Gia_ObjFaninC0(pNode)?
"dotted" :
"solid" );
589 fprintf( pFile,
"]" );
590 fprintf( pFile,
";\n" );
591 if ( !Gia_ObjIsAnd(pNode) )
594 fprintf( pFile,
"Node%d", i );
595 fprintf( pFile,
" -> " );
596 fprintf( pFile,
"Node%d", Gia_ObjFaninId1(pNode, i) );
597 fprintf( pFile,
" [" );
598 fprintf( pFile,
"style = %s", Gia_ObjFaninC1(pNode)?
"dotted" :
"solid" );
601 fprintf( pFile,
"]" );
602 fprintf( pFile,
";\n" );
604 if ( !Gia_ObjIsMux(
p, pNode) )
607 fprintf( pFile,
"Node%d", i );
608 fprintf( pFile,
" -> " );
609 fprintf( pFile,
"Node%d", Gia_ObjFaninId2(
p, i) );
610 fprintf( pFile,
" [" );
611 fprintf( pFile,
"style = %s", Gia_ObjFaninC2(
p, pNode)?
"dotted" :
"bold" );
614 fprintf( pFile,
"]" );
615 fprintf( pFile,
";\n" );
641 fprintf( pFile,
"}" );
642 fprintf( pFile,
"\n" );
643 fprintf( pFile,
"\n" );
650 else if (
p->nXors ||
p->nMuxes )
653 Vec_IntFreeP( &
p->vLevels );
679 int LevelMax, Prev, Level, i;
680 int fConstIsUsed = 0;
685 fprintf( stdout,
"Cannot visualize AIG with more than %d nodes.\n",
NODE_MAX );
688 if ( (pFile = fopen( pFileName,
"w" )) == NULL )
690 fprintf( stdout,
"Cannot open the intermediate file \"%s\".\n", pFileName );
700 LevelMax = 1 +
p->nLevels;
702 Vec_IntWriteEntry(
p->vLevels, Gia_ObjId(
p, pNode), LevelMax );
705 fprintf( pFile,
"# %s\n",
"AIG structure generated by GIA package" );
706 fprintf( pFile,
"\n" );
707 fprintf( pFile,
"digraph AIG {\n" );
708 fprintf( pFile,
"size = \"7.5,10\";\n" );
711 fprintf( pFile,
"center = true;\n" );
715 fprintf( pFile,
"edge [dir = back];\n" );
716 fprintf( pFile,
"\n" );
719 fprintf( pFile,
"{\n" );
720 fprintf( pFile,
" node [shape = plaintext];\n" );
721 fprintf( pFile,
" edge [style = invis];\n" );
722 fprintf( pFile,
" LevelTitle1 [label=\"\"];\n" );
723 fprintf( pFile,
" LevelTitle2 [label=\"\"];\n" );
725 for ( Level = LevelMax; Level >= 0; Level-- )
728 fprintf( pFile,
" Level%d", Level );
729 fprintf( pFile,
" [label = " );
731 fprintf( pFile,
"\"" );
732 fprintf( pFile,
"\"" );
733 fprintf( pFile,
"];\n" );
737 fprintf( pFile,
" LevelTitle1 -> LevelTitle2 ->" );
738 for ( Level = LevelMax; Level >= 0; Level-- )
741 fprintf( pFile,
" Level%d", Level );
744 fprintf( pFile,
" ->" );
746 fprintf( pFile,
";" );
748 fprintf( pFile,
"\n" );
749 fprintf( pFile,
"}" );
750 fprintf( pFile,
"\n" );
751 fprintf( pFile,
"\n" );
754 fprintf( pFile,
"{\n" );
755 fprintf( pFile,
" rank = same;\n" );
756 fprintf( pFile,
" LevelTitle1;\n" );
757 fprintf( pFile,
" title1 [shape=plaintext,\n" );
758 fprintf( pFile,
" fontsize=20,\n" );
759 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
760 fprintf( pFile,
" label=\"" );
761 fprintf( pFile,
"%s",
"AIG structure visualized by ABC" );
762 fprintf( pFile,
"\\n" );
763 fprintf( pFile,
"Benchmark \\\"%s\\\". ",
"aig" );
765 fprintf( pFile,
"\"\n" );
766 fprintf( pFile,
" ];\n" );
767 fprintf( pFile,
"}" );
768 fprintf( pFile,
"\n" );
769 fprintf( pFile,
"\n" );
772 fprintf( pFile,
"{\n" );
773 fprintf( pFile,
" rank = same;\n" );
774 fprintf( pFile,
" LevelTitle2;\n" );
775 fprintf( pFile,
" title2 [shape=plaintext,\n" );
776 fprintf( pFile,
" fontsize=18,\n" );
777 fprintf( pFile,
" fontname = \"Times-Roman\",\n" );
778 fprintf( pFile,
" label=\"" );
779 fprintf( pFile,
"The AIG contains %d nodes, %d full-adders, and %d half-adders, and spans %d levels.",
780 Gia_ManAndNum(
p), nFadds, Vec_IntSize(vAdds)/6-nFadds, LevelMax-1 );
781 fprintf( pFile,
"\\n" );
782 fprintf( pFile,
"\"\n" );
783 fprintf( pFile,
" ];\n" );
784 fprintf( pFile,
"}" );
785 fprintf( pFile,
"\n" );
786 fprintf( pFile,
"\n" );
789 fprintf( pFile,
"{\n" );
790 fprintf( pFile,
" rank = same;\n" );
792 fprintf( pFile,
" Level%d;\n", LevelMax );
796 if ( Gia_ObjFaninId0p(
p, pNode) == 0 )
798 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
800 fprintf( pFile,
", shape = %s",
"invtriangle" );
801 fprintf( pFile,
", color = coral, fillcolor = coral" );
802 fprintf( pFile,
"];\n" );
804 fprintf( pFile,
"}" );
805 fprintf( pFile,
"\n" );
806 fprintf( pFile,
"\n" );
809 for ( Level = LevelMax - 1; Level > 0; Level-- )
811 fprintf( pFile,
"{\n" );
812 fprintf( pFile,
" rank = same;\n" );
814 fprintf( pFile,
" Level%d;\n", Level );
817 int iNode = Gia_ObjId(
p, pNode );
818 if ( (
int)Gia_ObjLevel(
p, pNode) != Level )
829 if ( !pNode->
fMark0 && Vec_IntEntry(vMapAdds, iNode) >= 0 )
831 int iBox = Vec_IntEntry(vMapAdds, iNode);
832 fprintf( pFile,
" Node%d [label = \"%d_%d\"",
Gia_ShowAddOut(vAdds, vMapAdds, iNode), Vec_IntEntry(vAdds, 6*iBox+3), Vec_IntEntry(vAdds, 6*iBox+4) );
833 if ( Vec_IntEntry(vAdds, 6*iBox+2) == 0 )
834 fprintf( pFile,
", shape = octagon" );
836 fprintf( pFile,
", shape = doubleoctagon" );
838 else if ( Vec_IntEntry(vMapXors, iNode) >= 0 )
840 fprintf( pFile,
" Node%d [label = \"%d\"", iNode, iNode );
841 fprintf( pFile,
", shape = doublecircle" );
843 else if ( Gia_ObjIsXor(pNode) )
845 fprintf( pFile,
" Node%d [label = \"%d\"", iNode, iNode );
846 fprintf( pFile,
", shape = doublecircle" );
848 else if ( Gia_ObjIsMux(
p, pNode) )
850 fprintf( pFile,
" Node%d [label = \"%d\"", iNode, iNode );
851 fprintf( pFile,
", shape = trapezium" );
855 fprintf( pFile,
" Node%d [label = \"%d\"", iNode, iNode );
856 fprintf( pFile,
", shape = ellipse" );
859 fprintf( pFile,
", style = filled" );
860 fprintf( pFile,
"];\n" );
862 fprintf( pFile,
"}" );
863 fprintf( pFile,
"\n" );
864 fprintf( pFile,
"\n" );
868 fprintf( pFile,
"{\n" );
869 fprintf( pFile,
" rank = same;\n" );
871 fprintf( pFile,
" Level%d;\n", 0 );
876 fprintf( pFile,
" Node%d [label = \"Const0\"", 0 );
877 fprintf( pFile,
", shape = ellipse" );
878 fprintf( pFile,
", color = coral, fillcolor = coral" );
879 fprintf( pFile,
"];\n" );
884 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
886 fprintf( pFile,
", shape = %s",
"triangle" );
887 fprintf( pFile,
", color = coral, fillcolor = coral" );
888 fprintf( pFile,
"];\n" );
890 fprintf( pFile,
"}" );
891 fprintf( pFile,
"\n" );
892 fprintf( pFile,
"\n" );
895 fprintf( pFile,
"title1 -> title2 [style = invis];\n" );
897 fprintf( pFile,
"title2 -> Node%d [style = invis];\n", Gia_ObjId(
p, pNode) );
903 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
904 Prev = Gia_ObjId(
p, pNode);
911 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
912 Prev = Gia_ObjId(
p, pNode);
918 int iNode = Gia_ObjId(
p, pNode );
919 fprintf( pFile,
"Node%d", iNode );
920 fprintf( pFile,
" -> " );
921 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, Gia_ObjFaninId0(pNode, iNode)) );
922 fprintf( pFile,
" [" );
923 fprintf( pFile,
"style = %s", Gia_ObjFaninC0(pNode)?
"dotted" :
"solid" );
924 fprintf( pFile,
"]" );
925 fprintf( pFile,
";\n" );
929 int iNode = Gia_ObjId(
p, pNode );
930 if ( Vec_IntEntry(vMapAdds, Gia_ObjId(
p, pNode)) >= 0 )
932 int k, iBox = Vec_IntEntry(vMapAdds, iNode);
933 for ( k = 0; k < 3; k++ )
934 if ( Vec_IntEntry(vAdds, 6*iBox+k) )
936 int iBox2 = Vec_IntEntry(vMapAdds, Vec_IntEntry(vAdds, 6*iBox+k));
937 int fXor2 = iBox2 >= 0 ? (int)(Vec_IntEntry(vAdds, 6*iBox2+3) == Vec_IntEntry(vAdds, 6*iBox+k)) : 0;
938 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, iNode) );
939 fprintf( pFile,
" -> " );
940 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, Vec_IntEntry(vAdds, 6*iBox+k)) );
941 fprintf( pFile,
" [" );
942 fprintf( pFile,
"style = %s", fXor2?
"bold" :
"solid" );
943 fprintf( pFile,
"]" );
944 fprintf( pFile,
";\n" );
948 if ( Vec_IntEntry(vMapXors, Gia_ObjId(
p, pNode)) >= 0 )
950 int k, iXor = Vec_IntEntry(vMapXors, iNode);
951 for ( k = 1; k < 4; k++ )
952 if ( Vec_IntEntry(vXors, 4*iXor+k) )
954 int iXor2 = Vec_IntEntry(vMapXors, Vec_IntEntry(vXors, 4*iXor+k));
955 fprintf( pFile,
"Node%d", iNode );
956 fprintf( pFile,
" -> " );
957 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, Vec_IntEntry(vXors, 4*iXor+k)) );
958 fprintf( pFile,
" [" );
959 fprintf( pFile,
"style = %s", iXor2 >= 0?
"bold" :
"solid" );
960 fprintf( pFile,
"]" );
961 fprintf( pFile,
";\n" );
966 fprintf( pFile,
"Node%d", iNode );
967 fprintf( pFile,
" -> " );
968 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, Gia_ObjFaninId0(pNode, iNode)) );
969 fprintf( pFile,
" [" );
970 fprintf( pFile,
"style = %s", Gia_ObjFaninC0(pNode)?
"dotted" :
"solid" );
971 fprintf( pFile,
"]" );
972 fprintf( pFile,
";\n" );
973 if ( !Gia_ObjIsAnd(pNode) )
976 fprintf( pFile,
"Node%d", iNode );
977 fprintf( pFile,
" -> " );
978 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, Gia_ObjFaninId1(pNode, iNode)) );
979 fprintf( pFile,
" [" );
980 fprintf( pFile,
"style = %s", Gia_ObjFaninC1(pNode)?
"dotted" :
"solid" );
981 fprintf( pFile,
"]" );
982 fprintf( pFile,
";\n" );
984 if ( !Gia_ObjIsMux(
p, pNode) )
987 fprintf( pFile,
"Node%d", iNode );
988 fprintf( pFile,
" -> " );
989 fprintf( pFile,
"Node%d",
Gia_ShowAddOut(vAdds, vMapAdds, Gia_ObjFaninId2(
p, iNode)) );
990 fprintf( pFile,
" [" );
991 fprintf( pFile,
"style = %s", Gia_ObjFaninC2(
p, pNode)?
"dotted" :
"solid" );
992 fprintf( pFile,
"]" );
993 fprintf( pFile,
";\n" );
996 fprintf( pFile,
"}" );
997 fprintf( pFile,
"\n" );
998 fprintf( pFile,
"\n" );
1006 Vec_IntFreeP( &
p->vLevels );
1022 Vec_Bit_t * vIsBold = Vec_BitStart( Gia_ManObjNum(
p) );
1023 Vec_Int_t * vMapAdds = Vec_IntStartFull( Gia_ManObjNum(
p) );
int i, Entry;
1026 Vec_BitWriteEntry( vIsBold, Entry, 1 );
1027 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
1029 if ( fFadds && Vec_IntEntry(vAdds, 6*i+2) == 0 )
1031 if ( Vec_BitEntry(vIsBold, Vec_IntEntry(vAdds, 6*i+3)) || Vec_BitEntry(vIsBold, Vec_IntEntry(vAdds, 6*i+4)) )
1033 Vec_IntWriteEntry( vMapAdds, Vec_IntEntry(vAdds, 6*i+3), i );
1034 Vec_IntWriteEntry( vMapAdds, Vec_IntEntry(vAdds, 6*i+4), i );
1036 Vec_BitFree( vIsBold );
1048 int Level0, Level1, Level2 = 0, Level = 0;
1049 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
1050 return Gia_ObjLevel(
p, pObj);
1051 Gia_ObjSetTravIdCurrent(
p, pObj);
1052 if ( Gia_ObjIsCi(pObj) )
1054 if ( Vec_IntEntry(vMapAdds, Gia_ObjId(
p, pObj)) >= 0 )
1056 int iBox = Vec_IntEntry(vMapAdds, Gia_ObjId(
p, pObj));
1057 Gia_ObjSetTravIdCurrentId(
p, Vec_IntEntry(vAdds, 6*iBox+3) );
1058 Gia_ObjSetTravIdCurrentId(
p, Vec_IntEntry(vAdds, 6*iBox+4) );
1059 Level0 =
Gia_ShowCollectObjs_rec(
p, Gia_ManObj(
p, Vec_IntEntry(vAdds, 6*iBox+0) ), vAdds, vXors, vMapAdds, vMapXors, vOrder );
1060 Level1 =
Gia_ShowCollectObjs_rec(
p, Gia_ManObj(
p, Vec_IntEntry(vAdds, 6*iBox+1) ), vAdds, vXors, vMapAdds, vMapXors, vOrder );
1061 if ( Vec_IntEntry(vAdds, 6*iBox+2) )
1062 Level2 =
Gia_ShowCollectObjs_rec(
p, Gia_ManObj(
p, Vec_IntEntry(vAdds, 6*iBox+2) ), vAdds, vXors, vMapAdds, vMapXors, vOrder );
1063 Level = 1 + Abc_MaxInt( Abc_MaxInt(Level0, Level1), Level2 );
1064 Gia_ObjSetLevelId(
p, Vec_IntEntry(vAdds, 6*iBox+3), Level );
1065 Gia_ObjSetLevelId(
p, Vec_IntEntry(vAdds, 6*iBox+4), Level );
1066 pObj = Gia_ManObj(
p, Vec_IntEntry(vAdds, 6*iBox+4) );
1068 else if ( Vec_IntEntry(vMapXors, Gia_ObjId(
p, pObj)) >= 0 )
1070 int iXor = Vec_IntEntry(vMapXors, Gia_ObjId(
p, pObj));
1071 Level0 =
Gia_ShowCollectObjs_rec(
p, Gia_ManObj(
p, Vec_IntEntry(vXors, 4*iXor+1) ), vAdds, vXors, vMapAdds, vMapXors, vOrder );
1072 Level1 =
Gia_ShowCollectObjs_rec(
p, Gia_ManObj(
p, Vec_IntEntry(vXors, 4*iXor+2) ), vAdds, vXors, vMapAdds, vMapXors, vOrder );
1073 if ( Vec_IntEntry(vXors, 4*iXor+3) )
1074 Level2 =
Gia_ShowCollectObjs_rec(
p, Gia_ManObj(
p, Vec_IntEntry(vXors, 4*iXor+3) ), vAdds, vXors, vMapAdds, vMapXors, vOrder );
1075 Level = 1 + Abc_MaxInt( Abc_MaxInt(Level0, Level1), Level2 );
1076 Gia_ObjSetLevel(
p, pObj, Level );
1080 assert( !Gia_ObjIsMux(
p, pObj) );
1083 Level = 1 + Abc_MaxInt(Level0, Level1);
1084 Gia_ObjSetLevel(
p, pObj, Level );
1086 Vec_IntPush( vOrder, Gia_ObjId(
p, pObj) );
1087 p->nLevels = Abc_MaxInt(
p->nLevels, Level );