update to include gp cmd option

This commit is contained in:
liulixinkerry 2024-06-06 14:48:55 +08:00
parent ce0794d300
commit fcc9d0922c
4 changed files with 64 additions and 18 deletions

View File

@ -9,6 +9,7 @@ def get_option():
parser.add_argument('--design_name', type=str, default='mgc_superblue12', help='design name')
parser.add_argument('--custom_path', type=str, default='', help='custom design path, set it as token1:path1,token2:path2 e.g. lef:data/test.lef,def:data/test.def,design_name:mydesign,benchmark:mybenchmark')
parser.add_argument('--custom_json', type=str, default='', help='custom json path, support multi-lefs.')
parser.add_argument('--given_solution', type=str, default='', help='Given placement solution. Will overwrite other given .pl and .def.')
parser.add_argument('--load_from_raw', type=str2bool, default=True, help='If True, parse and load from benchmark files. If False, load from pt')
parser.add_argument('--run_all', type=str2bool, default=False, help='If True, run all designs in the given dataset. If False, run the given design_name only.')
parser.add_argument('--seed', type=int, default=0, help='seed to initialize all the random modules')
@ -17,6 +18,7 @@ def get_option():
parser.add_argument('--deterministic', type=str2bool, default=True, help='use deterministic mode')
# global placement params
parser.add_argument('--global_placement', type=str2bool, default=True, help='perform gp')
parser.add_argument('--lr', type=float, default=0.01, help='learning rate')
parser.add_argument('--inner_iter', type=int, default=10000, help='#inner iters')
parser.add_argument('--wa_coeff', type=float, default=4.0, help='wa coeff')

View File

@ -10,24 +10,22 @@ def get_trunc_node_pos_fn(mov_node_size, data):
return x
return trunc_node_pos_fn
def run_placement_main_nesterov(args, logger):
total_start = time.time()
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"
)
assert args.use_eplace_nesterov
logger.info("Start place %s/%s" % (args.dataset , args.design_name))
logger.info("Use Nesterov optimizer!")
data = data.to(device)
data = data.preprocess()
logger.info(data)
logger.info(data.node_type_indices)
# args.num_bin_x = args.num_bin_y = 2 ** math.ceil(math.log2(max(data.die_info).item() // 25))
def global_placement_main(gpdb, rawdb, ps: ParamScheduler, data: PlaceData, args, logger):
init_density_map = data.init_density_map
if not args.global_placement:
logger.info("Global placement is switched off. Please make sure the input "
"placement solution is already placed globally.")
node_pos, iteration = data.node_pos, 0
hpwl, overflow = evaluate_placement(node_pos, init_density_map, ps, data, args)
hpwl, overflow = hpwl.item(), overflow.item()
info = ("%d_gp" % (iteration + 1), hpwl, data.design_name)
if args.draw_placement:
draw_fig_with_cairo_cpp(node_pos, data.node_size, data, info, args)
logger.info("Input solution, exact HPWL: %.6E exact Overflow: %.4f" % (hpwl, overflow))
gp_hpwl, overflow, gp_time, gp_per_iter = hpwl, overflow, 0, -1
return node_pos, iteration, gp_hpwl, overflow, gp_time, gp_per_iter
init_density_map = get_init_density_map(rawdb, gpdb, data, args, logger)
data.init_filler()
device = data.device
mov_lhs, mov_rhs = data.movable_index
mov_node_pos, mov_node_size, expand_ratio = data.get_mov_node_info()
mov_node_pos = mov_node_pos.requires_grad_(True)
@ -45,7 +43,6 @@ def run_placement_main_nesterov(args, logger):
return overflow_sum / data.total_mov_area_without_filler
overflow_helper = (mov_lhs, mov_rhs, overflow_fn)
ps = ParamScheduler(data, args, logger)
density_map_layer = ElectronicDensityLayer(
unit_len=data.unit_len,
num_bin_x=data.num_bin_x,
@ -391,6 +388,33 @@ def run_placement_main_nesterov(args, logger):
gp_time = gp_end_time - gp_start_time
iteration += 1 # increase 1 For DP drawing
return node_pos, iteration, gp_hpwl, overflow, gp_time, gp_per_iter
def run_placement_main_nesterov(args, logger):
total_start = time.time()
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"
)
assert args.use_eplace_nesterov
logger.info("Start place %s/%s" % (args.dataset , args.design_name))
logger.info("Use Nesterov optimizer!")
data = data.to(device)
data = data.preprocess()
logger.info(data)
logger.info(data.node_type_indices)
# args.num_bin_x = args.num_bin_y = 2 ** math.ceil(math.log2(max(data.die_info).item() // 25))
get_init_density_map(rawdb, gpdb, data, args, logger)
data.init_filler()
ps = ParamScheduler(data, args, logger)
# global placement
node_pos, iteration, gp_hpwl, overflow, gp_time, gp_per_iter = global_placement_main(
gpdb, rawdb, ps, data, args, logger
)
# detail placement
node_pos, dp_hpwl, top5overflow, lg_time, dp_time = detail_placement_main(
node_pos, gpdb, rawdb, ps, data, args, logger

View File

@ -77,6 +77,9 @@ class IOParser(object):
if "pl" in params.keys() and not os.path.exists(params["pl"]):
print("pl %s not exists." % params["pl"])
return False
if "bookshelf_variety" not in params.keys():
print("Not specify bookshelf_variety. Set to ispd2005.")
params["bookshelf_variety"] = "ispd2005"
if "output" in params.keys():
if "pl" != params["output"].split(".")[-1]:
print("output format should be .pl")

View File

@ -10,11 +10,28 @@ def find_design_params(args, logger, placement=None):
params = get_single_design_params(
args.dataset_root, args.dataset, args.design_name, placement
)
setup_given_solution(args, logger, params, placement)
log_design_params(logger, params)
setup_design_args(args)
return params
def setup_given_solution(args, logger, params, placement=None):
if placement is not None:
args.given_solution = placement
if args.given_solution != "":
placement = args.given_solution
logger.info("Find given placement solution: %s" % placement)
if ".pl" in placement:
if "pl" in params.keys():
logger.info("Overwrite pl file %s by %s" % (params["pl"], placement))
params["pl"] = placement
elif ".def" in placement:
if "def" in params.keys():
logger.info("Overwrite def file %s by %s" % (params["def"], placement))
params["def"] = placement
def log_design_params(logger, params: dict):
content = "Design Info:\n"
num_items = 0