summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/pr42250.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr42250.c')
-rw-r--r--gcc/testsuite/gcc.dg/pr42250.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr42250.c b/gcc/testsuite/gcc.dg/pr42250.c
new file mode 100644
index 000000000..3ba8e8413
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42250.c
@@ -0,0 +1,68 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fipa-struct-reorg" } */
+
+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);
+}