/* power analyzer stats register */ void panalyzer_reg_stats( char *name, /* fu name */ fu_pdissipation_t *pdissipation, /* fu pdissipation statistics db ptr */ struct stat_sdb_t *sdb /* stats db ptr */) { char buf[512], buf1[512], buf2[512]; /* get a name for this cache */ if (!name || !name[0]) name = "<unknown>"; sprintf(buf, "%s.switching", name); sprintf(buf1, "%s total in switching power dissipation", name); stat_reg_double(sdb, buf, buf1, &pdissipation->switching, 0.0, "%12.4f"); sprintf(buf, "%s.avgswitching", name); sprintf(buf1, "%s.switching / sim_cycle", name); sprintf(buf2, "%s avg in switching power dissipation", name); stat_reg_formula(sdb, buf, buf2, buf1, "%12.4f"); sprintf(buf, "%s.internal", name); sprintf(buf1, "%s total internal power dissipation", name); stat_reg_double(sdb, buf, buf1, &pdissipation->internal, 0.0, "%12.4f"); sprintf(buf, "%s.avginternal", name); sprintf(buf1, "%s.internal / sim_cycle", name); sprintf(buf2, "%s avg internal power dissipation", name); stat_reg_formula(sdb, buf, buf2, buf1, "%12.4f"); sprintf(buf, "%s.leakage", name); sprintf(buf1, "%s total leakage power dissipation", name); stat_reg_double(sdb, buf, buf1, &pdissipation->leakage, 0.0, "%12.4f"); sprintf(buf, "%s.avgleakage", name); sprintf(buf1, "%s.leakage / sim_cycle", name); sprintf(buf2, "%s avg leakage power dissipation", name); stat_reg_formula(sdb, buf, buf2, buf1, "%12.4f"); sprintf(buf, "%s.pdissipation", name); sprintf(buf1, "%s total power dissipation", name); stat_reg_double(sdb, buf, buf1, &pdissipation->pdissipation, 0.0, "%12.4f"); sprintf(buf, "%s.avgpdissipation", name); sprintf(buf1, "%s.pdissipation / sim_cycle", name); sprintf(buf2, "%s avg power dissipation", name); stat_reg_formula(sdb, buf, buf2, buf1, "%12.4f"); sprintf(buf, "%s.peak", name); sprintf(buf1, "%s peak power dissipation", name); stat_reg_double(sdb, buf, buf1, &pdissipation->peak, 0.0, "%12.4f"); }
/* register level 1 power analayzer stats */ void lv1_panalyzer_reg_stats( struct stat_sdb_t *sdb /* stats db ptr */) { stat_reg_int(sdb, "alu access", "number of times alu is accessed", &(lv1_alu_panal.alu_access), 0, NULL); stat_reg_double(sdb, "alu max power", "Maximum power for alu", &(lv1_alu_panal.max_power), 0, NULL); stat_reg_int(sdb, "fpu access", "number of times fpu is accessed", &(lv1_fpu_panal.fpu_access), 0, NULL); stat_reg_double(sdb, "fpu max power", "Maximum power for fpu", &(lv1_fpu_panal.max_power), 0, NULL); stat_reg_int(sdb, "mult access", "number of times mult is accessed", &(lv1_mult_panal.mult_access), 0, NULL); stat_reg_double(sdb, "mult max power", "Maximum power for mult", &(lv1_mult_panal.max_power), 0, NULL); stat_reg_int(sdb, "rf access", "number of times rf is accessed", &(lv1_rf_panal.rf_access), 0, NULL); stat_reg_double(sdb, "rf max power", "Maximum power for rf", &(lv1_rf_panal.max_power), 0, NULL); stat_reg_int(sdb, "bpred access", "number of times bpred is accessed", &(lv1_bpred_panal.bpred_access), 0, NULL); stat_reg_double(sdb, "bpred max power", "Maximum power for bpred", &(lv1_bpred_panal.max_power), 0, NULL); stat_reg_int(sdb, "il1 access", "number of times il1 access is accessed", &(lv1_il1_panal.cache_access), 0, NULL); stat_reg_double(sdb, "il1 max power", "Maximum power for il1", &(lv1_il1_panal.max_power), 0, NULL); stat_reg_int(sdb, "il2 access", "number of times il2 access is accessed", &(lv1_il2_panal.cache_access), 0, NULL); stat_reg_double(sdb, "il2 max power", "Maximum power for il2", &(lv1_il2_panal.max_power), 0, NULL); stat_reg_int(sdb, "dl1 access", "number of times dl1 access is accessed", &(lv1_dl1_panal.cache_access), 0, NULL); stat_reg_double(sdb, "dl1 max power", "Maximum power for dl1", &(lv1_dl1_panal.max_power), 0, NULL); stat_reg_int(sdb, "dl2 access", "number of times dl2 access is accessed", &(lv1_dl2_panal.cache_access), 0, NULL); stat_reg_double(sdb, "dl2 max power", "Maximum power for dl2", &(lv1_dl2_panal.max_power), 0, NULL); stat_reg_int(sdb, "itlb access", "number of times itlb access is accessed", &(lv1_itlb_panal.cache_access), 0, NULL); stat_reg_double(sdb, "itlb max power", "Maximum power for itlb", &(lv1_itlb_panal.max_power), 0, NULL); stat_reg_int(sdb, "dtlb access", "number of times dtlb access is accessed", &(lv1_dtlb_panal.cache_access), 0, NULL); stat_reg_double(sdb, "dtlb max power", "Maximum power for dtlb", &(lv1_dtlb_panal.max_power), 0, NULL); stat_reg_int(sdb, "io access", "number of times io access is accessed", &(lv1_io_panal->io_access), 0, NULL); stat_reg_double(sdb, "aio max power", "Maximum power for aio", &(lv1_io_panal->max_aio_power), 0, NULL); stat_reg_double(sdb, "dio max power", "Maximum power for dio", &(lv1_io_panal->max_dio_power), 0, NULL); stat_reg_double(sdb, "clock max power", "Maximum power for clock", &(lv1_clock_panal->max_power), 0, NULL); stat_reg_double(sdb, "uarch max power", "Maximum power for uarch", &(lv1_uarch_panal->max_power), 0, NULL); }
void main(void) { struct stat_sdb_t *sdb; struct stat_stat_t *stat, *stat1, *stat2, *stat3, *stat4, *stat5; int an_int; unsigned int a_uint; float a_float; double a_double; static char *my_imap[8] = { "foo", "bar", "uxxe", "blah", "gaga", "dada", "mama", "googoo" }; /* make stats database */ sdb = stat_new(); /* register stat variables */ stat_reg_int(sdb, "stat.an_int", "An integer stat variable.", &an_int, 1, NULL); stat_reg_uint(sdb, "stat.a_uint", "An unsigned integer stat variable.", &a_uint, 2, "%u (unsigned)"); stat_reg_float(sdb, "stat.a_float", "A float stat variable.", &a_float, 3, NULL); stat_reg_double(sdb, "stat.a_double", "A double stat variable.", &a_double, 4, NULL); stat_reg_formula(sdb, "stat.a_formula", "A double stat formula.", "stat.a_float / stat.a_uint", NULL); stat_reg_formula(sdb, "stat.a_formula1", "A double stat formula #1.", "2 * (stat.a_formula / (1.5 * stat.an_int))", NULL); stat_reg_formula(sdb, "stat.a_bad_formula", "A double stat formula w/error.", "stat.a_float / (stat.a_uint - 2)", NULL); stat = stat_reg_dist(sdb, "stat.a_dist", "An array distribution.", 0, 8, 1, PF_ALL, NULL, NULL, NULL); stat1 = stat_reg_dist(sdb, "stat.a_dist1", "An array distribution #1.", 0, 8, 4, PF_ALL, NULL, NULL, NULL); stat2 = stat_reg_dist(sdb, "stat.a_dist2", "An array distribution #2.", 0, 8, 1, (PF_PDF|PF_CDF), NULL, NULL, NULL); stat3 = stat_reg_dist(sdb, "stat.a_dist3", "An array distribution #3.", 0, 8, 1, PF_ALL, NULL, my_imap, NULL); stat4 = stat_reg_sdist(sdb, "stat.a_sdist", "A sparse array distribution.", 0, PF_ALL, NULL, NULL); stat5 = stat_reg_sdist(sdb, "stat.a_sdist1", "A sparse array distribution #1.", 0, PF_ALL, "0x%08lx %10lu %6.2f %6.2f", NULL); /* print initial stats */ fprintf(stdout, "** Initial stats...\n"); stat_print_stats(sdb, stdout); /* adjust stats */ an_int++; a_uint++; a_float *= 2; a_double *= 4; stat_add_sample(stat, 8); stat_add_sample(stat, 8); stat_add_sample(stat, 1); stat_add_sample(stat, 3); stat_add_sample(stat, 4); stat_add_sample(stat, 4); stat_add_sample(stat, 7); stat_add_sample(stat1, 32); stat_add_sample(stat1, 32); stat_add_sample(stat1, 1); stat_add_sample(stat1, 12); stat_add_sample(stat1, 17); stat_add_sample(stat1, 18); stat_add_sample(stat1, 30); stat_add_sample(stat2, 8); stat_add_sample(stat2, 8); stat_add_sample(stat2, 1); stat_add_sample(stat2, 3); stat_add_sample(stat2, 4); stat_add_sample(stat2, 4); stat_add_sample(stat2, 7); stat_add_sample(stat3, 8); stat_add_sample(stat3, 8); stat_add_sample(stat3, 1); stat_add_sample(stat3, 3); stat_add_sample(stat3, 4); stat_add_sample(stat3, 4); stat_add_sample(stat3, 7); stat_add_sample(stat4, 800); stat_add_sample(stat4, 800); stat_add_sample(stat4, 1123); stat_add_sample(stat4, 3332); stat_add_sample(stat4, 4000); stat_add_samples(stat4, 4001, 18); stat_add_sample(stat4, 7); stat_add_sample(stat5, 800); stat_add_sample(stat5, 800); stat_add_sample(stat5, 1123); stat_add_sample(stat5, 3332); stat_add_sample(stat5, 4000); stat_add_samples(stat5, 4001, 18); stat_add_sample(stat5, 7); /* print final stats */ fprintf(stdout, "** Final stats...\n"); stat_print_stats(sdb, stdout); /* all done */ stat_delete(sdb); exit(0); }