676{
677 FILE * pFile;
679 int LevelMax, Prev, Level, i;
680 int fConstIsUsed = 0;
682
684 {
685 fprintf( stdout,
"Cannot visualize AIG with more than %d nodes.\n",
NODE_MAX );
686 return;
687 }
688 if ( (pFile = fopen( pFileName, "w" )) == NULL )
689 {
690 fprintf( stdout, "Cannot open the intermediate file \"%s\".\n", pFileName );
691 return;
692 }
693
694
695 if ( vBold )
698
699
700 LevelMax = 1 +
p->nLevels;
702 Vec_IntWriteEntry(
p->vLevels, Gia_ObjId(
p, pNode), LevelMax );
703
704
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" );
709
710
711 fprintf( pFile, "center = true;\n" );
712
713
714
715 fprintf( pFile, "edge [dir = back];\n" );
716 fprintf( pFile, "\n" );
717
718
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" );
724
725 for ( Level = LevelMax; Level >= 0; Level-- )
726 {
727
728 fprintf( pFile, " Level%d", Level );
729 fprintf( pFile, " [label = " );
730
731 fprintf( pFile, "\"" );
732 fprintf( pFile, "\"" );
733 fprintf( pFile, "];\n" );
734 }
735
736
737 fprintf( pFile, " LevelTitle1 -> LevelTitle2 ->" );
738 for ( Level = LevelMax; Level >= 0; Level-- )
739 {
740
741 fprintf( pFile, " Level%d", Level );
742
743 if ( Level != 0 )
744 fprintf( pFile, " ->" );
745 else
746 fprintf( pFile, ";" );
747 }
748 fprintf( pFile, "\n" );
749 fprintf( pFile, "}" );
750 fprintf( pFile, "\n" );
751 fprintf( pFile, "\n" );
752
753
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" );
764
765 fprintf( pFile, "\"\n" );
766 fprintf( pFile, " ];\n" );
767 fprintf( pFile, "}" );
768 fprintf( pFile, "\n" );
769 fprintf( pFile, "\n" );
770
771
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" );
787
788
789 fprintf( pFile, "{\n" );
790 fprintf( pFile, " rank = same;\n" );
791
792 fprintf( pFile, " Level%d;\n", LevelMax );
793
795 {
796 if ( Gia_ObjFaninId0p(
p, pNode) == 0 )
797 fConstIsUsed = 1;
798 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
799
800 fprintf( pFile, ", shape = %s", "invtriangle" );
801 fprintf( pFile, ", color = coral, fillcolor = coral" );
802 fprintf( pFile, "];\n" );
803 }
804 fprintf( pFile, "}" );
805 fprintf( pFile, "\n" );
806 fprintf( pFile, "\n" );
807
808
809 for ( Level = LevelMax - 1; Level > 0; Level-- )
810 {
811 fprintf( pFile, "{\n" );
812 fprintf( pFile, " rank = same;\n" );
813
814 fprintf( pFile, " Level%d;\n", Level );
816 {
817 int iNode = Gia_ObjId(
p, pNode );
818 if ( (
int)Gia_ObjLevel(
p, pNode) != Level )
819 continue;
820
821
822
823
824
825
826
827
828
829 if ( !pNode->
fMark0 && Vec_IntEntry(vMapAdds, iNode) >= 0 )
830 {
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" );
835 else
836 fprintf( pFile, ", shape = doubleoctagon" );
837 }
838 else if ( Vec_IntEntry(vMapXors, iNode) >= 0 )
839 {
840 fprintf( pFile, " Node%d [label = \"%d\"", iNode, iNode );
841 fprintf( pFile, ", shape = doublecircle" );
842 }
843 else if ( Gia_ObjIsXor(pNode) )
844 {
845 fprintf( pFile, " Node%d [label = \"%d\"", iNode, iNode );
846 fprintf( pFile, ", shape = doublecircle" );
847 }
848 else if ( Gia_ObjIsMux(
p, pNode) )
849 {
850 fprintf( pFile, " Node%d [label = \"%d\"", iNode, iNode );
851 fprintf( pFile, ", shape = trapezium" );
852 }
853 else
854 {
855 fprintf( pFile, " Node%d [label = \"%d\"", iNode, iNode );
856 fprintf( pFile, ", shape = ellipse" );
857 }
859 fprintf( pFile, ", style = filled" );
860 fprintf( pFile, "];\n" );
861 }
862 fprintf( pFile, "}" );
863 fprintf( pFile, "\n" );
864 fprintf( pFile, "\n" );
865 }
866
867
868 fprintf( pFile, "{\n" );
869 fprintf( pFile, " rank = same;\n" );
870
871 fprintf( pFile, " Level%d;\n", 0 );
872
873 if ( fConstIsUsed )
874 {
875
876 fprintf( pFile, " Node%d [label = \"Const0\"", 0 );
877 fprintf( pFile, ", shape = ellipse" );
878 fprintf( pFile, ", color = coral, fillcolor = coral" );
879 fprintf( pFile, "];\n" );
880 }
881
883 {
884 fprintf( pFile,
" Node%d [label = \"%d\"", Gia_ObjId(
p, pNode), Gia_ObjId(
p, pNode) );
885
886 fprintf( pFile, ", shape = %s", "triangle" );
887 fprintf( pFile, ", color = coral, fillcolor = coral" );
888 fprintf( pFile, "];\n" );
889 }
890 fprintf( pFile, "}" );
891 fprintf( pFile, "\n" );
892 fprintf( pFile, "\n" );
893
894
895 fprintf( pFile, "title1 -> title2 [style = invis];\n" );
897 fprintf( pFile,
"title2 -> Node%d [style = invis];\n", Gia_ObjId(
p, pNode) );
898
899 Prev = -1;
901 {
902 if ( i > 0 )
903 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
904 Prev = Gia_ObjId(
p, pNode);
905 }
906
907 Prev = -1;
909 {
910 if ( i > 0 )
911 fprintf( pFile,
"Node%d -> Node%d [style = invis];\n", Prev, Gia_ObjId(
p, pNode) );
912 Prev = Gia_ObjId(
p, pNode);
913 }
914
915
917 {
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" );
926 }
928 {
929 int iNode = Gia_ObjId(
p, pNode );
930 if ( Vec_IntEntry(vMapAdds, Gia_ObjId(
p, pNode)) >= 0 )
931 {
932 int k, iBox = Vec_IntEntry(vMapAdds, iNode);
933 for ( k = 0; k < 3; k++ )
934 if ( Vec_IntEntry(vAdds, 6*iBox+k) )
935 {
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" );
945 }
946 continue;
947 }
948 if ( Vec_IntEntry(vMapXors, Gia_ObjId(
p, pNode)) >= 0 )
949 {
950 int k, iXor = Vec_IntEntry(vMapXors, iNode);
951 for ( k = 1; k < 4; k++ )
952 if ( Vec_IntEntry(vXors, 4*iXor+k) )
953 {
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" );
962 }
963 continue;
964 }
965
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) )
974 continue;
975
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" );
983
984 if ( !Gia_ObjIsMux(
p, pNode) )
985 continue;
986
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" );
994 }
995
996 fprintf( pFile, "}" );
997 fprintf( pFile, "\n" );
998 fprintf( pFile, "\n" );
999 fclose( pFile );
1000
1001
1002 if ( vBold )
1005
1006 Vec_IntFreeP( &
p->vLevels );
1007}
int Ree_ManCountFadds(Vec_Int_t *vAdds)
int Gia_ShowAddOut(Vec_Int_t *vAdds, Vec_Int_t *vMapAdds, int Node)
#define Gia_ManForEachObjVec(vVec, p, pObj, i)