@@ -376,6 +376,121 @@ bool hasOneSiteMaster(dbDatabase* db)
376376 return false ;
377377}
378378
379+ void blockMetrics (dbBlock* block, utl::Logger* logger)
380+ {
381+ if (block == nullptr ) {
382+ return ;
383+ }
384+
385+ const double dbu_per_uu = block->getDbUnitsPerMicron ();
386+
387+ const odb::Rect die_bbox = block->getDieArea ();
388+ const auto die_area = die_bbox.area ();
389+
390+ const odb::Rect core_bbox = block->getCoreArea ();
391+ const auto core_area = core_bbox.area ();
392+
393+ const int num_ios = block->getBTerms ().size ();
394+
395+ const int num_insts = block->getInsts ().size ();
396+ int num_stdcells = 0 ;
397+ int num_macros = 0 ;
398+ int num_padcells = 0 ;
399+ int num_cover = 0 ;
400+
401+ double stdcell_area = 0.0 ;
402+ double macro_area = 0.0 ;
403+ double padcell_area = 0.0 ;
404+ double cover_area = 0.0 ;
405+
406+ for (odb::dbInst* inst : block->getInsts ()) {
407+ odb::dbMaster* inst_master = inst->getMaster ();
408+ if (inst_master->isFiller ()) {
409+ continue ;
410+ }
411+
412+ const int wid = inst_master->getWidth ();
413+ const int ht = inst_master->getHeight ();
414+ const double inst_area = static_cast <double >(wid) * ht;
415+
416+ if (inst_master->isBlock ()) {
417+ num_macros++;
418+ macro_area += inst_area;
419+ } else if (inst_master->isCover ()) {
420+ num_cover++;
421+ cover_area += inst_area;
422+ } else if (inst_master->isPad ()) {
423+ num_padcells++;
424+ padcell_area += inst_area;
425+ } else {
426+ num_stdcells++;
427+ stdcell_area += inst_area;
428+ }
429+ }
430+
431+ const double die_area_um = die_area / (dbu_per_uu * dbu_per_uu);
432+ const double core_area_um = core_area / (dbu_per_uu * dbu_per_uu);
433+ stdcell_area /= (dbu_per_uu * dbu_per_uu);
434+ macro_area /= (dbu_per_uu * dbu_per_uu);
435+ padcell_area /= (dbu_per_uu * dbu_per_uu);
436+ cover_area /= (dbu_per_uu * dbu_per_uu);
437+
438+ const double total_active_area = stdcell_area + macro_area;
439+
440+ logger->metric (" design__io" , num_ios);
441+ logger->metric (" design__nets" , block->getNets ().size ());
442+ logger->metric (" design__die__area" , die_area_um);
443+ logger->metric (" design__core__area" , core_area_um);
444+ logger->metric (" design__instance__count" , num_insts);
445+ logger->metric (" design__instance__area" , total_active_area);
446+ logger->metric (" design__instance__count__stdcell" , num_stdcells);
447+ logger->metric (" design__instance__area__stdcell" , stdcell_area);
448+ logger->metric (" design__instance__count__macros" , num_macros);
449+ logger->metric (" design__instance__area__macros" , macro_area);
450+ logger->metric (" design__instance__count__padcells" , num_padcells);
451+ logger->metric (" design__instance__area__padcells" , padcell_area);
452+ logger->metric (" design__instance__count__cover" , num_cover);
453+ logger->metric (" design__instance__area__cover" , cover_area);
454+
455+ if (core_area_um > 0 ) {
456+ logger->metric (" design__instance__utilization" ,
457+ total_active_area / core_area_um);
458+ double stdcell_util = 0.0 ;
459+ if (core_area_um > macro_area) {
460+ stdcell_util = stdcell_area / (core_area_um - macro_area);
461+ }
462+ logger->metric (" design__instance__utilization__stdcell" , stdcell_util);
463+ }
464+
465+ int std_rows = 0 ;
466+ int64_t std_sites = 0 ;
467+ std::map<std::string, int > rows;
468+ std::map<std::string, int64_t > sites;
469+
470+ for (odb::dbRow* row : block->getRows ()) {
471+ odb::dbSite* site = row->getSite ();
472+
473+ if (site->getClass () == odb::dbSiteClass::NONE
474+ || site->getClass () == odb::dbSiteClass::CORE ) {
475+ std_rows++;
476+ std_sites += row->getSiteCount ();
477+ }
478+
479+ rows[site->getName ()]++;
480+ sites[site->getName ()] += row->getSiteCount ();
481+ }
482+
483+ logger->metric (" design__rows" , std_rows);
484+ for (const auto & [site_name, count] : rows) {
485+ logger->metric (" design__rows:" + site_name, count);
486+ }
487+
488+ logger->metric (" design__sites" , std_sites);
489+ for (const auto & [site_name, count] : sites) {
490+ logger->metric (" design__sites:" + site_name, count);
491+ }
492+ }
493+
379494int64_t WireLengthEvaluator::hpwl () const
380495{
381496 int64_t hpwl_sum = 0 ;
0 commit comments