00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "prdb.h"
00044 #include "DaVinci.h"
00045 #include "glob.h"
00046 #include "mempool.h"
00047
00048 #define COLORPOOL_NUM 8
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 class COLORPOOL{
00067 private:
00068 char *_color_array[COLORPOOL_NUM];
00069 INT32 _index;
00070
00071 public:
00072 COLORPOOL() {
00073 _index = 0;
00074 _color_array[0]= "black";
00075 _color_array[1]= "palegreen";
00076 _color_array[2]= "yellow";
00077 _color_array[3]= "red";
00078 _color_array[4]= "blue";
00079 _color_array[5]= "orange";
00080 _color_array[6]= "pink";
00081 _color_array[7]= "gray";
00082 }
00083 ~COLORPOOL() {}
00084
00085 const char* GetColor(){
00086 return _color_array[ (_index ++) % COLORPOOL_NUM ];
00087 }
00088 };
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 class PARTITION_GRAPH_NODE_SET
00107 {
00108 private:
00109 PG_CONTAINER _pnodes;
00110 INT32 _index;
00111 public:
00112 PARTITION_GRAPH_NODE_SET() {
00113 _pnodes.clear();
00114 _index=0;
00115
00116 }
00117 ~PARTITION_GRAPH_NODE_SET() {}
00118
00119 BOOL Is_In(PARTITION_GRAPH_NODE *pnode);
00120 BOOL Empty();
00121 void Push_Back(PARTITION_GRAPH_NODE *pnode);
00122 PARTITION_GRAPH_NODE* Pop_Front();
00123 };
00124
00125 BOOL
00126 PARTITION_GRAPH_NODE_SET::Is_In(PARTITION_GRAPH_NODE *pnode)
00127 {
00128 for (INT32 i=0; i< _pnodes.size() ; i++)
00129 if ( pnode == _pnodes[i]) return TRUE;
00130 return FALSE;
00131 }
00132
00133 BOOL
00134 PARTITION_GRAPH_NODE_SET::Empty()
00135 {
00136 return ( _index >= _pnodes.size() );
00137 }
00138
00139 void
00140 PARTITION_GRAPH_NODE_SET::Push_Back(PARTITION_GRAPH_NODE *pnode)
00141 {
00142 _pnodes.push_back(pnode);
00143 }
00144
00145 PARTITION_GRAPH_NODE*
00146 PARTITION_GRAPH_NODE_SET::Pop_Front()
00147 {
00148 PARTITION_GRAPH_NODE* pnode = _pnodes[_index];
00149 _index ++;
00150 return pnode;
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 void draw_partition_graph (PARTITION_GRAPH *pg, const char *mes = NULL)
00163 {
00164 if (! DaVinci::enabled(TRUE)) return;
00165
00166 MEM_POOL dv_pool;
00167 dv_pool.magic_num = 0;
00168 MEM_POOL_Constructor pool( &dv_pool, "DaVinci", FALSE);
00169
00170 DaVinci dv (&dv_pool, NULL);
00171
00172 char window_title[128];
00173 if ( NULL == mes)
00174 sprintf(window_title,"Partition Graph - %s", Cur_PU_Name);
00175 else
00176 sprintf(window_title,"Partition Graph - %s - %s ",Cur_PU_Name,mes);
00177 Is_True(strlen(window_title) < 128, ("Window Title buf overflowed"));
00178 dv.Title(window_title);
00179
00180
00181 char nlabel[64];
00182 NODE_TYPE nt, nt_plain, nt_root, nt_dummy;
00183
00184 EDGE_TYPE et;
00185 COLORPOOL edge_colorpool;
00186 INT32 edge_id_number =0;
00187
00188 BOOL dummy_in_graph = FALSE;
00189 PARTITION_GRAPH_NODE *being_drawn_pnode, *child_pnode;
00190 PARTITION_GRAPH_NODE_SET drawn_pnodes;
00191
00192 nt_plain.Color("white");
00193 nt_root.Color ("pink");
00194 nt_dummy.Color("gray");
00195
00196 drawn_pnodes.Push_Back( pg -> Root() );
00197 dv.Graph_Begin();
00198
00199
00200 while ( ! drawn_pnodes.Empty() )
00201 {
00202 being_drawn_pnode = drawn_pnodes.Pop_Front();
00203
00204 if (pg -> Dummy() == being_drawn_pnode) {
00205 nt = nt_dummy;
00206 dummy_in_graph = TRUE;
00207 }
00208 else if (pg -> Root() == being_drawn_pnode) nt = nt_root;
00209 else nt = nt_plain;
00210 sprintf( nlabel, "%d", being_drawn_pnode -> Index() );
00211 Is_True(strlen(nlabel) < 64, ("Node Label buf overflowed"));
00212 dv.Node_Begin (NODE_ID (being_drawn_pnode), nlabel, nt);
00213
00214
00215 PT_CONTAINER &parent_partition=being_drawn_pnode->Parent_Partitions();
00216 for (INT32 i=0; i<parent_partition.size() ; i++ )
00217 {
00218 et.Color ( edge_colorpool.GetColor() );
00219 PG_CONTAINER &child_pnodes = parent_partition[i] -> Child();
00220 for (INT32 j=0; j<child_pnodes.size() ; j++ )
00221 {
00222 child_pnode = child_pnodes[j];
00223
00224
00225 if (! drawn_pnodes.Is_In(child_pnode))
00226 drawn_pnodes.Push_Back(child_pnode);
00227
00228 dv.Out_Edge ( EDGE_ID ( NODE_ID((void*)(INTPTR)edge_id_number++),
00229 NODE_ID((void*)(INTPTR)edge_id_number++) ),
00230 et, NODE_ID (child_pnode));
00231 }
00232 }
00233 dv.Node_End();
00234 }
00235
00236
00237
00238 if (! dummy_in_graph)
00239 {
00240 being_drawn_pnode = pg -> Dummy();
00241 sprintf( nlabel, "%d", being_drawn_pnode -> Index() );
00242 dv.Node_Begin (NODE_ID (being_drawn_pnode), nlabel, nt_dummy);
00243 dv.Node_End();
00244 }
00245
00246 dv.Graph_End();
00247 dv.Event_Loop(NULL);
00248 }
00249
00250