diff --git a/img/exp_ispd2005.png b/img/exp_ispd2005.png deleted file mode 100644 index b577d4c..0000000 Binary files a/img/exp_ispd2005.png and /dev/null differ diff --git a/img/exp_ispd2015.png b/img/exp_ispd2015.png deleted file mode 100644 index 2f88e6c..0000000 Binary files a/img/exp_ispd2015.png and /dev/null differ diff --git a/img/exp_ispd2015_route.png b/img/exp_ispd2015_route.png deleted file mode 100644 index d82c673..0000000 Binary files a/img/exp_ispd2015_route.png and /dev/null differ diff --git a/src/database.py b/src/database.py index f97f62e..e657d1b 100644 --- a/src/database.py +++ b/src/database.py @@ -5,17 +5,8 @@ import math from utils import * -def load_dataset(args, logger, placement=None): +def load_dataset(args, logger, params): rawdb, gpdb = None, None - if args.custom_path != "": - params = get_custom_design_params(args) - elif args.custom_json != "": - logger.info("Detect json mode. Please make sure that tech_lef are included first.") - params = get_custom_json_params(args) - else: - params = get_single_design_params( - args.dataset_root, args.dataset, args.design_name, placement - ) parser = IOParser() if args.load_from_raw: logger.info("loading from original benchmark...") @@ -116,14 +107,13 @@ class PlaceData(object): self.region_boxes = region_boxes self.region_boxes_end = region_boxes_end - # TODO: more cases? + # TODO: more cases, hardcode? self.node_special_type = torch.zeros(len(node_id2celltype_name), dtype=torch.int32) - if False: - for node_id, celltype_name in enumerate(node_id2celltype_name): - if celltype_name.startswith("CORE/BUF"): - self.node_special_type[node_id] = 1 - if celltype_name.startswith("CORE/DFF"): - self.node_special_type[node_id] = 2 + for node_id, celltype_name in enumerate(node_id2celltype_name): + if celltype_name.startswith("CORE/BUF"): + self.node_special_type[node_id] = 1 + if celltype_name.startswith("CORE/DFF"): + self.node_special_type[node_id] = 2 dataset_format = "" if "aux" in dataset_path.keys(): @@ -452,6 +442,7 @@ class PlaceData(object): :obj:`*keys`. If :obj:`*keys` is not given, the conversion is applied to all present attributes.""" + self.device = device return self.apply(lambda x: x.to(device, **kwargs), *keys) def cpu(self, *keys): @@ -539,14 +530,15 @@ class PlaceData(object): def prescale_by_site_width(self): # inplace scaling - self.die_info /= self.site_width - self.region_boxes /= self.site_width - self.node_pos /= self.site_width - self.node_lpos /= self.site_width - self.node_size /= self.site_width - self.pin_rel_cpos /= self.site_width - self.pin_rel_lpos /= self.site_width - self.pin_size /= self.site_width + scalar_at = torch.tensor([self.site_width], dtype=torch.float32, device=self.die_info.device) + self.die_info /= scalar_at + self.region_boxes /= scalar_at + self.node_pos /= scalar_at + self.node_lpos /= scalar_at + self.node_size /= scalar_at + self.pin_rel_cpos /= scalar_at + self.pin_rel_lpos /= scalar_at + self.pin_size /= scalar_at self.__die_scale__ *= self.site_width return self diff --git a/src/run_placement_nesterov.py b/src/run_placement_nesterov.py index cc4b541..484bd8d 100644 --- a/src/run_placement_nesterov.py +++ b/src/run_placement_nesterov.py @@ -12,8 +12,8 @@ def get_trunc_node_pos_fn(mov_node_size, data): def run_placement_main_nesterov(args, logger): total_start = time.time() - setup_dataset_args(args) - data, rawdb, gpdb = load_dataset(args, logger) + params = find_design_params(args, logger) + data, rawdb, gpdb = load_dataset(args, logger, params) device = torch.device( "cuda:{}".format(args.gpu) if torch.cuda.is_available() else "cpu" ) diff --git a/utils/__init__.py b/utils/__init__.py index 5dc804d..20a254b 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -3,4 +3,4 @@ from .logger import setup_logger from .visualization import * from .tools import * from .get_design_params import get_single_design_params, get_multiple_design_params, get_custom_design_params, get_custom_json_params -from .setup_dataset import setup_dataset_args +from .setup_dataset import find_design_params diff --git a/utils/setup_dataset.py b/utils/setup_dataset.py index a6a2a77..2fe26bd 100644 --- a/utils/setup_dataset.py +++ b/utils/setup_dataset.py @@ -1,4 +1,41 @@ -def setup_dataset_args(args): +from .get_design_params import get_single_design_params, get_custom_design_params, get_custom_json_params + + +def find_design_params(args, logger, placement=None): + if args.custom_path != "": + params = get_custom_design_params(args) + elif args.custom_json != "": + logger.info("Detect json mode. Please make sure that tech_lef are included first.") + params = get_custom_json_params(args) + else: + params = get_single_design_params( + args.dataset_root, args.dataset, args.design_name, placement + ) + log_design_params(logger, params) + setup_design_args(args) + return params + + +def log_design_params(logger, params: dict): + content = "Design Info:\n" + num_items = 0 + if "benchmark" in params.keys(): + content += f"benchmark: {params['benchmark']}\n" + num_items += 1 + if "design_name" in params.keys(): + content += f"design_name: {params['design_name']}\n" + num_items += 1 + for key, value in params.items(): + if key == "design_name" or key == "benchmark": + continue + content += f"{key}: {value}" + if num_items < len(params) - 1: + content += "\n" + num_items += 1 + logger.info(content) + + +def setup_design_args(args): if args.design_name in ["adaptec1", "bigblue1"]: args.num_bin_x = args.num_bin_y = 512 args.target_density = 1.0