MaskTransPlace/maskplace/comp_res.py
2023-08-14 14:52:16 +08:00

52 lines
2.2 KiB
Python

from place_db import PlaceDB
from prim import prim_real
import pickle
def comp_res(placedb, node_pos, ratio):
hpwl = 0.0
cost = 0.0
for net_name in placedb.net_info:
max_x = 0.0
min_x = placedb.max_height * 1.1
max_y = 0.0
min_y = placedb.max_height * 1.1
for node_name in placedb.net_info[net_name]["nodes"]:
if node_name not in node_pos:
continue
h = placedb.node_info[node_name]['x']
w = placedb.node_info[node_name]['y']
pin_x = node_pos[node_name][0] * ratio + h / 2.0 + placedb.net_info[net_name]["nodes"][node_name]["x_offset"]
pin_y = node_pos[node_name][1] * ratio + w / 2.0 + placedb.net_info[net_name]["nodes"][node_name]["y_offset"]
max_x = max(pin_x, max_x)
min_x = min(pin_x, min_x)
max_y = max(pin_y, max_y)
min_y = min(pin_y, min_y)
for port_name in placedb.net_info[net_name]["ports"]:
h = placedb.port_info[port_name]['x']
w = placedb.port_info[port_name]['y']
pin_x = h
pin_y = w
max_x = max(pin_x, max_x)
min_x = min(pin_x, min_x)
max_y = max(pin_y, max_y)
min_y = min(pin_y, min_y)
if min_x <= placedb.max_height:
hpwl_tmp = (max_x - min_x) + (max_y - min_y)
else:
hpwl_tmp = 0
if "weight" in placedb.net_info[net_name]:
hpwl_tmp *= placedb.net_info[net_name]["weight"]
hpwl += hpwl_tmp
net_node_set = set.union(set(placedb.net_info[net_name]["nodes"]),
set(placedb.net_info[net_name]["ports"]))
for net_node in list(net_node_set):
if net_node not in node_pos and net_node not in placedb.port_info:
net_node_set.discard(net_node)
prim_cost = prim_real(net_node_set, node_pos, placedb.net_info[net_name]["nodes"], ratio, placedb.node_info, placedb.port_info)
if "weight" in placedb.net_info[net_name]:
prim_cost *= placedb.net_info[net_name]["weight"]
assert hpwl_tmp <= prim_cost +1e-5
cost += prim_cost
return hpwl, cost