update drawer

This commit is contained in:
liulixinkerry 2024-05-21 12:04:51 +08:00
parent d685421a2f
commit 3924efba2e
4 changed files with 18 additions and 65 deletions

View File

@ -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. - Support deterministic mode with only 5~25% extra GP runtime overhead.
- Implement an extremely fast GPU-accelerated detailed-routability-driven placement algorithm Xplace-Route. - 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). - 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. - Provide benchmark download and preprocess scripts, and three routability evaluation scripts.
- Code refactoring. - Code refactoring.

View File

@ -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): 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) torch.cuda.synchronize(node_pos.device)
dp_start_time = time.time() lg_start_time = time.time()
if args.legalization: if args.legalization:
node_pos = run_lg(node_pos, data, args, logger) node_pos = run_lg(node_pos, data, args, logger)
torch.cuda.synchronize(node_pos.device) torch.cuda.synchronize(node_pos.device)
lg_end_time = time.time() 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: if args.detail_placement:
node_pos = run_dp(node_pos, data, args, logger) node_pos = run_dp(node_pos, data, args, logger)
torch.cuda.synchronize(node_pos.device) torch.cuda.synchronize(node_pos.device)
node_pos = run_dp_route_opt(node_pos, gpdb, rawdb, ps, data, args, logger) node_pos = run_dp_route_opt(node_pos, gpdb, rawdb, ps, data, args, logger)
dp_end_time = time.time() dp_end_time = time.time()
logger.info("Finish detailed placement. LG Time: %.4f DP Time: %.4f LG+DP Time: %.4f" % ( 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 # Evaluate
dp_hpwl = get_obj_hpwl(node_pos, data, args).item() 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: if args.draw_placement:
draw_fig_with_cairo_cpp(node_pos, data.node_size, data, info, args) draw_fig_with_cairo_cpp(node_pos, data.node_size, data, info, args)
logger.info("After DP, HPWL: %.4E" % dp_hpwl) logger.info("After DP, HPWL: %.4E" % dp_hpwl)
lg_time = lg_end_time - dp_start_time lg_time = lg_end_time - lg_start_time
dp_time = dp_end_time - lg_end_time dp_time = dp_end_time - dp_start_time
return node_pos, dp_hpwl, lg_time, dp_time return node_pos, dp_hpwl, lg_time, dp_time

View File

@ -318,7 +318,7 @@ def run_placement_main_nesterov(args, logger):
node_pos, density_map_layer, init_density_map, data, args node_pos, density_map_layer, init_density_map, data, args
) )
hpwl, overflow = hpwl.item(), overflow.item() 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: if args.draw_placement:
draw_fig_with_cairo_cpp(node_pos, data.node_size, data, info, args) 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)) logger.info("After GP, best solution eval, exact HPWL: %.4E exact Overflow: %.4f" % (hpwl, overflow))

View File

@ -10,54 +10,6 @@ matplotlib_logger = logging.getLogger("matplotlib")
matplotlib_logger.setLevel(logging.INFO) 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( def draw_fig_with_cairo(
mov_node_pos, mov_node_pos,
mov_node_size, mov_node_size,
@ -73,7 +25,7 @@ def draw_fig_with_cairo(
import cairocffi as cairo import cairocffi as cairo
iteration, hpwl, design_name = info 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) res_root = os.path.join(args.result_dir, args.exp_id)
png_path = os.path.join(res_root, args.eval_dir, filename) png_path = os.path.join(res_root, args.eval_dir, filename)
if not os.path.exists(os.path.dirname(png_path)): 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])] node_name: List[str] = ["%d" % i for i in range(node_pos.shape[0])]
iteration, hpwl, design_name = info 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) res_root = os.path.join(args.result_dir, args.exp_id)
png_path: str = os.path.join(res_root, args.eval_dir, filename) png_path: str = os.path.join(res_root, args.eval_dir, filename)
if not os.path.exists(os.path.dirname(png_path)): 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 return png_path
# 1) Visualize density_map # 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) png_path = get_png_path(filename)
fig, ax = plt.subplots(figsize=(12, 10)) fig, ax = plt.subplots(figsize=(12, 10))
im = ax.imshow(density_map.cpu().numpy(), cmap="YlGnBu") 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() plt.close()
# 2) Visualize potential_map # 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) png_path = get_png_path(filename)
fig, ax = plt.subplots(figsize=(12, 10)) fig, ax = plt.subplots(figsize=(12, 10))
im = ax.imshow(potential_map.cpu().numpy(), cmap="YlGnBu") 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() plt.close()
# 3) Visualize force_map # 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) png_path = get_png_path(filename)
# 3.1) Init background image # 3.1) Init background image
GRID_SIZE = 100 GRID_SIZE = 100
@ -279,7 +231,7 @@ def draw_grad_abs_mean(
wl_grads, density_grads, iterations, info, args, wl_grads, density_grads, iterations, info, args,
): ):
iteration, design_name = info 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) res_root = os.path.join(args.result_dir, args.exp_id)
png_path = os.path.join(res_root, args.eval_dir, filename) png_path = os.path.join(res_root, args.eval_dir, filename)
if not os.path.exists(os.path.dirname(png_path)): if not os.path.exists(os.path.dirname(png_path)):