update drawer
This commit is contained in:
parent
d685421a2f
commit
3924efba2e
@ -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.
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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)):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user