| /* { dg-do compile } */ |
| /* { dg-options "-O2" } */ |
| |
| extern double log10 (double __x); |
| extern double ceil (double __x); |
| extern double floor (double __x); |
| extern void free (void *__ptr); |
| extern void *my_malloc (unsigned int); |
| extern int num_rr_nodes; |
| static float get_cblock_trans (int *num_inputs_to_cblock, |
| int max_inputs_to_cblock, |
| float trans_cblock_to_lblock_buf, |
| float trans_sram_bit); |
| static float trans_per_mux (int num_inputs, float trans_sram_bit); |
| void |
| count_routing_transistors (int num_switch, float R_minW_nmos, |
| float R_minW_pmos) |
| { |
| int *num_inputs_to_cblock; |
| int iswitch, i, j, iseg, max_inputs_to_cblock; |
| float input_cblock_trans; |
| const float trans_sram_bit = 6.; |
| float trans_cblock_to_lblock_buf; |
| input_cblock_trans = |
| get_cblock_trans (num_inputs_to_cblock, max_inputs_to_cblock, |
| trans_cblock_to_lblock_buf, trans_sram_bit); |
| } |
| |
| static float |
| get_cblock_trans (int *num_inputs_to_cblock, int max_inputs_to_cblock, |
| float trans_cblock_to_lblock_buf, float trans_sram_bit) |
| { |
| float *trans_per_cblock; |
| float trans_count; |
| int i, num_inputs; |
| |
| trans_per_cblock = |
| (float *) my_malloc ((max_inputs_to_cblock + 1) * sizeof (float)); |
| for (i = 1; i <= max_inputs_to_cblock; i++) |
| trans_per_cblock[i] = |
| trans_per_mux (i, trans_sram_bit) + trans_cblock_to_lblock_buf; |
| for (i = 0; i < num_rr_nodes; i++) |
| { |
| num_inputs = num_inputs_to_cblock[i]; |
| trans_count += trans_per_cblock[num_inputs]; |
| } |
| free (trans_per_cblock); |
| return (trans_count); |
| } |
| |
| static float |
| trans_per_mux (int num_inputs, float trans_sram_bit) |
| { |
| int nlevels, ilevel, current_inps; |
| float ntrans = 0; |
| |
| if (num_inputs <= 1) |
| return (0); |
| nlevels = ceil (log10 (num_inputs) / log10 (2.) - 0.00001); |
| current_inps = num_inputs; |
| for (ilevel = 1; ilevel <= nlevels; ilevel++) |
| { |
| ntrans += 2 * floor (current_inps / 2.); |
| current_inps = ceil (current_inps / 2.); |
| } |
| ntrans += trans_sram_bit * nlevels; |
| return (ntrans); |
| } |