From 3924efba2ea252fde9324775bed6af648a698de1 Mon Sep 17 00:00:00 2001 From: liulixinkerry Date: Tue, 21 May 2024 12:04:51 +0800 Subject: [PATCH] update drawer --- README.md | 2 +- src/detail_placement.py | 19 +++++------ src/run_placement_nesterov.py | 2 +- utils/visualization.py | 60 ++++------------------------------- 4 files changed, 18 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 6e312ef..aff5fb5 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ We are happy to announce that [Xplace 2.0](https://ieeexplore.ieee.org/abstract/ - Support deterministic mode with only 5~25% extra GP runtime overhead. - Implement an extremely fast GPU-accelerated detailed-routability-driven placement algorithm Xplace-Route. - Integrate with a GPU-accelerated detailed placer and a GPU-accelerated global router [GGR](cpp_to_py/gpugr/README.md). -- Support a superfast **GPU-accelerated place and global route flow**! Input your LEF/DEF, the flow will output the **placement DEF** and the **global routing guide**! +- Support a superfast **GPU-accelerated place and global route flow**! Input your LEF/DEF, the flow will output the **placement DEF** and the **global routing guide**! [xplace_route_flow.png](img/xplace_route_overview.png) - Provide benchmark download and preprocess scripts, and three routability evaluation scripts. - Code refactoring. diff --git a/src/detail_placement.py b/src/detail_placement.py index 7bbf370..efe1920 100644 --- a/src/detail_placement.py +++ b/src/detail_placement.py @@ -649,33 +649,34 @@ def external_detail_placement(input_file, data: PlaceData, args, logger, eval_mo def default_detail_placement(node_pos, gpdb, rawdb, ps, data: PlaceData, args, logger): - dp_start_time = None - dp_end_time = None - dp_hpwl = -1 - torch.cuda.synchronize(node_pos.device) - dp_start_time = time.time() + lg_start_time = time.time() if args.legalization: node_pos = run_lg(node_pos, data, args, logger) torch.cuda.synchronize(node_pos.device) lg_end_time = time.time() + if args.draw_placement: + info = ("%d_lg" % ps.iter, None, data.design_name) + draw_fig_with_cairo_cpp(node_pos, data.node_size, data, info, args) + torch.cuda.synchronize(node_pos.device) + dp_start_time = time.time() if args.detail_placement: node_pos = run_dp(node_pos, data, args, logger) torch.cuda.synchronize(node_pos.device) node_pos = run_dp_route_opt(node_pos, gpdb, rawdb, ps, data, args, logger) dp_end_time = time.time() logger.info("Finish detailed placement. LG Time: %.4f DP Time: %.4f LG+DP Time: %.4f" % ( - lg_end_time - dp_start_time, dp_end_time - lg_end_time, dp_end_time - dp_start_time + lg_end_time - lg_start_time, dp_end_time - dp_start_time, dp_end_time - lg_start_time )) # Evaluate dp_hpwl = get_obj_hpwl(node_pos, data, args).item() - info = (ps.iter + 1, dp_hpwl, data.design_name) + info = ("%d_dp" % (ps.iter + 1), dp_hpwl, data.design_name) if args.draw_placement: draw_fig_with_cairo_cpp(node_pos, data.node_size, data, info, args) logger.info("After DP, HPWL: %.4E" % dp_hpwl) - lg_time = lg_end_time - dp_start_time - dp_time = dp_end_time - lg_end_time + lg_time = lg_end_time - lg_start_time + dp_time = dp_end_time - dp_start_time return node_pos, dp_hpwl, lg_time, dp_time diff --git a/src/run_placement_nesterov.py b/src/run_placement_nesterov.py index 484bd8d..fdf6a5e 100644 --- a/src/run_placement_nesterov.py +++ b/src/run_placement_nesterov.py @@ -318,7 +318,7 @@ def run_placement_main_nesterov(args, logger): node_pos, density_map_layer, init_density_map, data, args ) hpwl, overflow = hpwl.item(), overflow.item() - info = (iteration + 1, hpwl, data.design_name) + 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("After GP, best solution eval, exact HPWL: %.4E exact Overflow: %.4f" % (hpwl, overflow)) diff --git a/utils/visualization.py b/utils/visualization.py index 140f0fd..ab45932 100644 --- a/utils/visualization.py +++ b/utils/visualization.py @@ -10,54 +10,6 @@ matplotlib_logger = logging.getLogger("matplotlib") matplotlib_logger.setLevel(logging.INFO) -def scatter_drawer(pos: torch.Tensor, fix_mask: torch.Tensor, filename, title, args): - res_root = os.path.join(args.result_dir, args.exp_id) - png_path = os.path.join(res_root, args.eval_dir, filename) - if not os.path.exists(os.path.dirname(png_path)): - os.makedirs(os.path.dirname(png_path)) - - # pos = pos.cpu().numpy() - # pos = pos.T - # plt.scatter(pos[0], pos[1]) - mov_pos = pos[fix_mask.squeeze(1) < 0.5].T.cpu().numpy() - fix_pos = pos[fix_mask.squeeze(1) > 0.5].T.cpu().numpy() - plt.scatter(mov_pos[0], mov_pos[1], label="mov") - plt.scatter(fix_pos[0], fix_pos[1], label="fix") - plt.legend() - plt.title(title) - plt.savefig(png_path) - plt.close() - - -def draw_fig(batch, pos, fix_mask, info, args): - epoch, idx, iteration, hpwl = info - filename = "epoch%d_id%d_iter%d.png" % (epoch, idx, iteration) - title = "hpwl %.4f" % hpwl - num_items = batch.num_of_graph_nodes[0] - scatter_drawer(pos[:num_items], fix_mask[:num_items], filename, title, args) - - -def scatter_drawer_new(pos: torch.Tensor, filename, title, args): - res_root = os.path.join(args.result_dir, args.exp_id) - png_path = os.path.join(res_root, args.eval_dir, filename) - if not os.path.exists(os.path.dirname(png_path)): - os.makedirs(os.path.dirname(png_path)) - - pos = pos.cpu().numpy() - pos = pos.T - plt.scatter(pos[0], pos[1]) - plt.title(title) - plt.savefig(png_path) - plt.close() - - -def draw_fig_new(pos, info, args): - iteration, hpwl, design_name = info - filename = "%s_iter%d.png" % (design_name, iteration) - title = "hpwl %.4f" % hpwl - scatter_drawer_new(pos, filename, title, args) - - def draw_fig_with_cairo( mov_node_pos, mov_node_size, @@ -73,7 +25,7 @@ def draw_fig_with_cairo( import cairocffi as cairo iteration, hpwl, design_name = info - filename = "%s_iter%d.png" % (design_name, iteration) + filename = "%s_iter%s.png" % (design_name, iteration) res_root = os.path.join(args.result_dir, args.exp_id) png_path = os.path.join(res_root, args.eval_dir, filename) if not os.path.exists(os.path.dirname(png_path)): @@ -159,7 +111,7 @@ def draw_fig_with_cairo_cpp(node_pos, node_size, data, info, args, base_size=204 node_name: List[str] = ["%d" % i for i in range(node_pos.shape[0])] iteration, hpwl, design_name = info - filename = "%s_iter%d.png" % (design_name, iteration) + filename = "%s_iter%s.png" % (design_name, iteration) res_root = os.path.join(args.result_dir, args.exp_id) png_path: str = os.path.join(res_root, args.eval_dir, filename) if not os.path.exists(os.path.dirname(png_path)): @@ -216,7 +168,7 @@ def visualize_electronic_variables(density_map, potential_map, force_map, info, return png_path # 1) Visualize density_map - filename = "%s_iter%d_density.png" % (design_name, iteration) + filename = "%s_iter%s_density.png" % (design_name, iteration) png_path = get_png_path(filename) fig, ax = plt.subplots(figsize=(12, 10)) im = ax.imshow(density_map.cpu().numpy(), cmap="YlGnBu") @@ -226,7 +178,7 @@ def visualize_electronic_variables(density_map, potential_map, force_map, info, plt.close() # 2) Visualize potential_map - filename = "%s_iter%d_potential.png" % (design_name, iteration) + filename = "%s_iter%s_potential.png" % (design_name, iteration) png_path = get_png_path(filename) fig, ax = plt.subplots(figsize=(12, 10)) im = ax.imshow(potential_map.cpu().numpy(), cmap="YlGnBu") @@ -236,7 +188,7 @@ def visualize_electronic_variables(density_map, potential_map, force_map, info, plt.close() # 3) Visualize force_map - filename = "%s_iter%d_force.png" % (design_name, iteration) + filename = "%s_iter%s_force.png" % (design_name, iteration) png_path = get_png_path(filename) # 3.1) Init background image GRID_SIZE = 100 @@ -279,7 +231,7 @@ def draw_grad_abs_mean( wl_grads, density_grads, iterations, info, args, ): iteration, design_name = info - filename = "%s_iter%d_grad_magnitude_mean.png" % (design_name, iteration) + filename = "%s_iter%s_grad_magnitude_mean.png" % (design_name, iteration) res_root = os.path.join(args.result_dir, args.exp_id) png_path = os.path.join(res_root, args.eval_dir, filename) if not os.path.exists(os.path.dirname(png_path)):