fix num_bin in custom design

This commit is contained in:
liulixinkerry 2024-04-29 11:09:24 +08:00
parent 33fe4bebfe
commit 21209686c5
7 changed files with 58 additions and 29 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 KiB

View File

@ -5,17 +5,8 @@ import math
from utils import * from utils import *
def load_dataset(args, logger, placement=None): def load_dataset(args, logger, params):
rawdb, gpdb = None, None 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() parser = IOParser()
if args.load_from_raw: if args.load_from_raw:
logger.info("loading from original benchmark...") logger.info("loading from original benchmark...")
@ -116,14 +107,13 @@ class PlaceData(object):
self.region_boxes = region_boxes self.region_boxes = region_boxes
self.region_boxes_end = region_boxes_end 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) 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):
for node_id, celltype_name in enumerate(node_id2celltype_name): if celltype_name.startswith("CORE/BUF"):
if celltype_name.startswith("CORE/BUF"): self.node_special_type[node_id] = 1
self.node_special_type[node_id] = 1 if celltype_name.startswith("CORE/DFF"):
if celltype_name.startswith("CORE/DFF"): self.node_special_type[node_id] = 2
self.node_special_type[node_id] = 2
dataset_format = "" dataset_format = ""
if "aux" in dataset_path.keys(): if "aux" in dataset_path.keys():
@ -452,6 +442,7 @@ class PlaceData(object):
:obj:`*keys`. :obj:`*keys`.
If :obj:`*keys` is not given, the conversion is applied to all present If :obj:`*keys` is not given, the conversion is applied to all present
attributes.""" attributes."""
self.device = device
return self.apply(lambda x: x.to(device, **kwargs), *keys) return self.apply(lambda x: x.to(device, **kwargs), *keys)
def cpu(self, *keys): def cpu(self, *keys):
@ -539,14 +530,15 @@ class PlaceData(object):
def prescale_by_site_width(self): def prescale_by_site_width(self):
# inplace scaling # inplace scaling
self.die_info /= self.site_width scalar_at = torch.tensor([self.site_width], dtype=torch.float32, device=self.die_info.device)
self.region_boxes /= self.site_width self.die_info /= scalar_at
self.node_pos /= self.site_width self.region_boxes /= scalar_at
self.node_lpos /= self.site_width self.node_pos /= scalar_at
self.node_size /= self.site_width self.node_lpos /= scalar_at
self.pin_rel_cpos /= self.site_width self.node_size /= scalar_at
self.pin_rel_lpos /= self.site_width self.pin_rel_cpos /= scalar_at
self.pin_size /= self.site_width self.pin_rel_lpos /= scalar_at
self.pin_size /= scalar_at
self.__die_scale__ *= self.site_width self.__die_scale__ *= self.site_width
return self return self

View File

@ -12,8 +12,8 @@ def get_trunc_node_pos_fn(mov_node_size, data):
def run_placement_main_nesterov(args, logger): def run_placement_main_nesterov(args, logger):
total_start = time.time() total_start = time.time()
setup_dataset_args(args) params = find_design_params(args, logger)
data, rawdb, gpdb = load_dataset(args, logger) data, rawdb, gpdb = load_dataset(args, logger, params)
device = torch.device( device = torch.device(
"cuda:{}".format(args.gpu) if torch.cuda.is_available() else "cpu" "cuda:{}".format(args.gpu) if torch.cuda.is_available() else "cpu"
) )

View File

@ -3,4 +3,4 @@ from .logger import setup_logger
from .visualization import * from .visualization import *
from .tools 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 .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

View File

@ -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"]: if args.design_name in ["adaptec1", "bigblue1"]:
args.num_bin_x = args.num_bin_y = 512 args.num_bin_x = args.num_bin_y = 512
args.target_density = 1.0 args.target_density = 1.0