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 #include <string.h>
00026 #include <stdio.h>
00027 #include <stdlib.h>
00028 #include "types.h"
00029 #include "globals.h"
00030 #include "netlist_utils.h"
00031 #include "odin_util.h"
00032
00033 void depth_first_traverse_visualize(nnode_t *node, FILE *fp, int traverse_mark_number);
00034 void depth_first_traversal_graph_display(FILE *out, short marker_value, netlist_t *netllist);
00035
00036 void forward_traversal_net_graph_display(FILE *out, short marker_value, nnode_t *node);
00037 void backward_traversal_net_graph_display(FILE *out, short marker_value, nnode_t *node);
00038
00039
00040
00041
00042 void graphVizOutputNetlist(char* path, char* name, short marker_value, netlist_t *netlist)
00043 {
00044 char path_and_file[4096];
00045 FILE *fp;
00046
00047
00048 sprintf(path_and_file, "%s/%s.dot", path, name);
00049 fp = fopen(path_and_file, "w");
00050
00051
00052 fprintf(fp, "digraph G {\n\tranksep=.25;\n");
00053
00054 depth_first_traversal_graph_display(fp, marker_value, netlist);
00055
00056
00057 fprintf(fp, "}\n");
00058 fclose(fp);
00059 }
00060
00061
00062
00063
00064 void depth_first_traversal_graph_display(FILE *out, short marker_value, netlist_t *netlist)
00065 {
00066 int i;
00067
00068
00069 for (i = 0; i < netlist->num_top_input_nodes; i++)
00070 {
00071 if (netlist->top_input_nodes[i] != NULL)
00072 {
00073 depth_first_traverse_visualize(netlist->top_input_nodes[i], out, marker_value);
00074 }
00075 }
00076
00077 if (netlist->gnd_node != NULL)
00078 depth_first_traverse_visualize(netlist->gnd_node, out, marker_value);
00079 if (netlist->vcc_node != NULL)
00080 depth_first_traverse_visualize(netlist->vcc_node, out, marker_value);
00081 }
00082
00083
00084
00085
00086 void depth_first_traverse_visualize(nnode_t *node, FILE *fp, int traverse_mark_number)
00087 {
00088 int i, j;
00089 nnode_t *next_node;
00090 nnet_t *next_net;
00091
00092 if (node->traverse_visited == traverse_mark_number)
00093 {
00094 return;
00095 }
00096 else
00097 {
00098
00099 char *temp_string;
00100 char *temp_string2;
00101
00102
00103 node->traverse_visited = traverse_mark_number;
00104
00105 temp_string = make_simple_name(node->name, "^-+.", '_');
00106 if ((node->type == FF_NODE) || (node->type == BUF_NODE))
00107 {
00108 fprintf(fp, "\t\"%s\" [shape=box];\n", temp_string);
00109 }
00110 else if (node->type == INPUT_NODE)
00111 {
00112 fprintf(fp, "\t\"%s\" [shape=triangle];\n", temp_string);
00113 }
00114 else if (node->type == CLOCK_NODE)
00115 {
00116 fprintf(fp, "\t\"%s\" [shape=triangle];\n", temp_string);
00117 }
00118 else if (node->type == OUTPUT_NODE)
00119 {
00120 fprintf(fp, "\t\"%s_O\" [shape=triangle];\n", temp_string);
00121 }
00122 else
00123 {
00124 fprintf(fp, "\t\"%s\"\n", temp_string);
00125 }
00126 free(temp_string);
00127
00128 for (i = 0; i < node->num_output_pins; i++)
00129 {
00130 if (node->output_pins[i]->net == NULL)
00131 continue;
00132
00133
00134 next_net = node->output_pins[i]->net;
00135 for (j = 0; j < next_net->num_fanout_pins; j++)
00136 {
00137 next_node = next_net->fanout_pins[j]->node;
00138 if (next_node == NULL)
00139 continue;
00140
00141
00142
00143
00144
00145
00146 temp_string = make_simple_name(node->name, "^-+.", '_');
00147 temp_string2 = make_simple_name(next_node->name, "^-+.", '_');
00148
00149 if (node->type == OUTPUT_NODE)
00150 {
00151
00152 temp_string = (char*)realloc(temp_string, sizeof(char)*strlen(temp_string)+1+2);
00153 sprintf(temp_string, "%s_O", temp_string);
00154 }
00155 if (next_node->type == OUTPUT_NODE)
00156 {
00157
00158 temp_string2 = (char*)realloc(temp_string2, sizeof(char)*strlen(temp_string2)+1+2);
00159 sprintf(temp_string2, "%s_O", temp_string2);
00160 }
00161
00162 fprintf(fp, "\t\"%s\" -> \"%s\"", temp_string, temp_string2);
00163 if (next_net->fanout_pins[j]->name)
00164 fprintf(fp, "[label=\"%s\"]", next_net->fanout_pins[j]->name);
00165 fprintf(fp, ";\n");
00166
00167 free(temp_string);
00168 free(temp_string2);
00169
00170
00171 depth_first_traverse_visualize(next_node, fp, traverse_mark_number);
00172 }
00173 }
00174 }
00175 }
00176
00177
00178
00179
00180 void graphVizOutputCombinationalNet(char* path, char* name, short marker_value, nnode_t *current_node)
00181 {
00182 char path_and_file[4096];
00183 FILE *fp;
00184
00185
00186 sprintf(path_and_file, "%s/%s.dot", path, name);
00187 fp = fopen(path_and_file, "w");
00188
00189
00190 fprintf(fp, "digraph G {\n\tranksep=.25;\n");
00191
00192 forward_traversal_net_graph_display(fp, marker_value, current_node);
00193 backward_traversal_net_graph_display(fp, marker_value, current_node);
00194
00195
00196 fprintf(fp, "}\n");
00197 fclose(fp);
00198 }
00199
00200
00201
00202
00203 void forward_traversal_net_graph_display(FILE *fp, short marker_value, nnode_t *node)
00204 {
00205 int j, k;
00206 nnode_t** stack_of_nodes;
00207 int index_in_stack = 0;
00208 int num_stack_of_nodes = 1;
00209 char *temp_string;
00210 char *temp_string2;
00211
00212 stack_of_nodes = (nnode_t**)malloc(sizeof(nnode_t*)*1);
00213 stack_of_nodes[0] = node;
00214
00215 while (index_in_stack != num_stack_of_nodes)
00216 {
00217 nnode_t *current_node = stack_of_nodes[index_in_stack];
00218
00219
00220 current_node->traverse_visited = marker_value;
00221
00222
00223 temp_string = make_simple_name(current_node->name, "^-+.", '_');
00224 if (index_in_stack == 0)
00225 {
00226 fprintf(fp, "\t%s [shape=box,color=red];\n", temp_string);
00227 }
00228 else if ((current_node->type == FF_NODE) || (current_node->type == BUF_NODE))
00229 {
00230 fprintf(fp, "\t%s [shape=box];\n", temp_string);
00231 }
00232 else if (current_node->type == INPUT_NODE)
00233 {
00234 fprintf(fp, "\t%s [shape=triangle];\n", temp_string);
00235 }
00236 else if (current_node->type == CLOCK_NODE)
00237 {
00238 fprintf(fp, "\t%s [shape=triangle];\n", temp_string);
00239 }
00240 else if (current_node->type == OUTPUT_NODE)
00241 {
00242 fprintf(fp, "\t%s_O [shape=triangle];\n", temp_string);
00243 }
00244 else
00245 {
00246 fprintf(fp, "\t%s [label=\"%d:%d\"];\n", temp_string, current_node->forward_level, current_node->backward_level);
00247 }
00248 free(temp_string);
00249
00250
00251 for (j = 0; j < current_node->num_output_pins; j++)
00252 {
00253 if (current_node->output_pins[j] == NULL)
00254 continue;
00255
00256 for (k = 0; k < current_node->output_pins[j]->net->num_fanout_pins; k++)
00257 {
00258 if ((current_node->output_pins[j] == NULL) || (current_node->output_pins[j]->net == NULL) || ( current_node->output_pins[j]->net->fanout_pins[k] == NULL))
00259 continue;
00260
00261
00262 nnode_t *next_node = current_node->output_pins[j]->net->fanout_pins[k]->node;
00263
00264 if (next_node == NULL)
00265 continue;
00266
00267 temp_string = make_simple_name(current_node->name, "^-+.", '_');
00268 temp_string2 = make_simple_name(next_node->name, "^-+.", '_');
00269 if (current_node->type == OUTPUT_NODE)
00270 {
00271
00272 temp_string = (char*)realloc(temp_string, sizeof(char)*strlen(temp_string)+1+2);
00273 sprintf(temp_string, "%s_O", temp_string);
00274 }
00275 if (next_node->type == OUTPUT_NODE)
00276 {
00277
00278 temp_string2 = (char*)realloc(temp_string2, sizeof(char)*strlen(temp_string2)+1+2);
00279 sprintf(temp_string2, "%s_O", temp_string2);
00280 }
00281
00282 fprintf(fp, "\t%s -> %s [label=\"%s\"];\n", temp_string, temp_string2, current_node->output_pins[j]->net->fanout_pins[k]->name);
00283
00284 free(temp_string);
00285 free(temp_string2);
00286
00287 if ((next_node->traverse_visited != marker_value) && (next_node->type != FF_NODE))
00288 {
00289
00290 stack_of_nodes = (nnode_t**)realloc(stack_of_nodes, sizeof(nnode_t*)*(num_stack_of_nodes+1));
00291 stack_of_nodes[num_stack_of_nodes] = next_node;
00292 num_stack_of_nodes ++;
00293 }
00294 }
00295 }
00296
00297
00298 index_in_stack ++;
00299 }
00300 }
00301
00302
00303
00304
00305 void backward_traversal_net_graph_display(FILE *fp, short marker_value, nnode_t *node)
00306 {
00307 int j;
00308 char *temp_string;
00309 char *temp_string2;
00310 nnode_t** stack_of_nodes;
00311 int index_in_stack = 0;
00312 int num_stack_of_nodes = 1;
00313
00314 stack_of_nodes = (nnode_t**)malloc(sizeof(nnode_t*)*1);
00315 stack_of_nodes[0] = node;
00316
00317 while (index_in_stack != num_stack_of_nodes)
00318 {
00319 nnode_t *current_node = stack_of_nodes[index_in_stack];
00320
00321
00322 current_node->traverse_visited = marker_value;
00323
00324
00325 temp_string = make_simple_name(current_node->name, "^-+.", '_');
00326 if (index_in_stack != 0)
00327 {
00328 if ((current_node->type == FF_NODE) || (current_node->type == BUF_NODE))
00329 {
00330 fprintf(fp, "\t%s [shape=box];\n", temp_string);
00331 }
00332 else if (current_node->type == INPUT_NODE)
00333 {
00334 fprintf(fp, "\t%s [shape=triangle];\n", temp_string);
00335 }
00336 else if (current_node->type == CLOCK_NODE)
00337 {
00338 fprintf(fp, "\t%s [shape=triangle];\n", temp_string);
00339 }
00340 else if (current_node->type == OUTPUT_NODE)
00341 {
00342 fprintf(fp, "\t%s_O [shape=triangle];\n", temp_string);
00343 }
00344 else
00345 {
00346 fprintf(fp, "\t%s [label=\"%d:%d\"];\n", temp_string, current_node->forward_level, current_node->backward_level);
00347 }
00348 }
00349 free(temp_string);
00350
00351
00352 for (j = 0; j < current_node->num_input_pins; j++)
00353 {
00354 if (current_node->input_pins[j] == NULL)
00355 continue;
00356
00357 if ((current_node->input_pins[j] == NULL) || (current_node->input_pins[j]->net == NULL) || (current_node->input_pins[j]->net->driver_pin == NULL))
00358 continue;
00359
00360
00361 nnode_t *next_node = current_node->input_pins[j]->net->driver_pin->node;
00362
00363 if (next_node == NULL)
00364 continue;
00365
00366 temp_string = make_simple_name(current_node->name, "^-+.", '_');
00367 temp_string2 = make_simple_name(next_node->name, "^-+.", '_');
00368
00369 fprintf(fp, "\t%s -> %s [label=\"%s\"];\n", temp_string2, temp_string, current_node->input_pins[j]->name);
00370
00371 free(temp_string);
00372 free(temp_string2);
00373
00374 if ((next_node->traverse_visited != marker_value) && (next_node->type != FF_NODE))
00375 {
00376
00377 stack_of_nodes = (nnode_t**)realloc(stack_of_nodes, sizeof(nnode_t*)*(num_stack_of_nodes+1));
00378 stack_of_nodes[num_stack_of_nodes] = next_node;
00379 num_stack_of_nodes ++;
00380 }
00381 }
00382
00383
00384 index_in_stack ++;
00385 }
00386 }