00019 {
00020
00021
00022
00023
00024 #ifdef PRINT_REL_POS_DISTR
00025 FILE *out_bin_file;
00026 relapos_rec_t rp_rec;
00027 #endif
00028
00029 int inet, len, rp, src_x, src_y, dst_x, dst_y, del_x, del_y, min_del,
00030 sink_pin, sum;
00031 int *total_conn;
00032 int **relapos;
00033 double **relapos_distr;
00034
00035 total_conn = (int *)my_malloc((nx + ny + 1) * sizeof(int));
00036 relapos = (int **)my_malloc((nx + ny + 1) * sizeof(int *));
00037 relapos_distr = (double **)my_malloc((nx + ny + 1) * sizeof(double *));
00038 for(len = 0; len <= nx + ny; len++)
00039 {
00040 relapos[len] = (int *)my_calloc(len / 2 + 1, sizeof(int));
00041 relapos_distr[len] =
00042 (double *)my_calloc((len / 2 + 1), sizeof(double));
00043 }
00044
00045
00046 for(inet = 0; inet < num_nets; inet++)
00047 {
00048 if(net[inet].is_global == FALSE)
00049 {
00050
00051 src_x = block[net[inet].node_block[0]].x;
00052 src_y = block[net[inet].node_block[0]].y;
00053
00054 for(sink_pin = 1; sink_pin <= net[inet].num_sinks;
00055 sink_pin++)
00056 {
00057 dst_x = block[net[inet].node_block[sink_pin]].x;
00058 dst_y = block[net[inet].node_block[sink_pin]].y;
00059
00060 del_x = ABS_DIFF(dst_x, src_x);
00061 del_y = ABS_DIFF(dst_y, src_y);
00062
00063 len = del_x + del_y;
00064
00065 min_del = (del_x < del_y) ? del_x : del_y;
00066
00067 if(!(min_del <= (len / 2)))
00068 {
00069 printf
00070 ("Error in calculating relative location min_del = %d, len = %d\n",
00071 min_del, len);
00072 exit(1);
00073 }
00074 else
00075 {
00076 relapos[len][min_del]++;
00077 }
00078 }
00079 }
00080 }
00081
00082 #ifdef PRINT_REL_POS_DISTR
00083 out_bin_file =
00084 fopen("/jayar/b/b5/fang/vpr_test/wirelength/relapos2.bin", "rb+");
00085 #endif
00086
00087 for(len = 0; len <= nx + ny; len++)
00088 {
00089 sum = 0;
00090 for(rp = 0; rp <= len / 2; rp++)
00091 {
00092 sum += relapos[len][rp];
00093 }
00094 if(sum != 0)
00095 {
00096 #ifdef PRINT_REL_POS_DISTR
00097 fseek(out_bin_file, sizeof(relapos_rec_t) * len,
00098 SEEK_SET);
00099 fread(&rp_rec, sizeof(relapos_rec_t), 1, out_bin_file);
00100 #endif
00101
00102 for(rp = 0; rp <= len / 2; rp++)
00103 {
00104
00105 relapos_distr[len][rp] =
00106 (double)relapos[len][rp] / (double)sum;
00107
00108
00109 #ifdef PRINT_REL_POS_DISTR
00110 fprintf(stderr, "old %d increase by %d\n",
00111 rp_rec.num_rp[rp], relapos[len][rp]);
00112 rp_rec.num_rp[rp] += relapos[len][rp];
00113 fprintf(stderr, "becomes %d\n",
00114 rp_rec.num_rp[rp]);
00115 #endif
00116 }
00117 #ifdef PRINT_REL_POS_DISTR
00118
00119 fseek(out_bin_file, sizeof(relapos_rec_t) * len,
00120 SEEK_SET);
00121 fwrite(&rp_rec, sizeof(relapos_rec_t), 1, out_bin_file);
00122 #endif
00123
00124 }
00125 total_conn[len] = sum;
00126 }
00127
00128 fprintf(stdout, "Source to sink relative positions:\n");
00129 for(len = 1; len <= nx + ny; len++)
00130 {
00131 if(total_conn[len] != 0)
00132 {
00133 fprintf(stdout, "Of 2-pin distance %d exists %d\n\n", len,
00134 total_conn[len]);
00135 for(rp = 0; rp <= len / 2; rp++)
00136 {
00137 fprintf(stdout, "\trp%d\t%d\t\t(%.5f)\n", rp,
00138 relapos[len][rp], relapos_distr[len][rp]);
00139 }
00140 fprintf(stdout, "----------------\n");
00141 }
00142 }
00143
00144 free((void *)total_conn);
00145 for(len = 0; len <= nx + ny; len++)
00146 {
00147 free((void *)relapos[len]);
00148 free((void *)relapos_distr[len]);
00149 }
00150 free((void *)relapos);
00151 free((void *)relapos_distr);
00152
00153 #ifdef PRINT_REL_POS_DISTR
00154 fclose(out_bin_file);
00155 #endif
00156 }