Skip to content

Commit

Permalink
update to include gp cmd option
Browse files Browse the repository at this point in the history
liulixinkerry committed Jun 6, 2024
1 parent ce0794d commit fcc9d09
Showing 4 changed files with 64 additions and 18 deletions.
2 changes: 2 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -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')
60 changes: 42 additions & 18 deletions src/run_placement_nesterov.py
Original file line number Diff line number Diff line change
@@ -10,24 +10,22 @@ def trunc_node_pos_fn(x):
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 overflow_fn(mov_density_map):
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 calc_route_force(mov_node_pos, mov_node_size, expand_ratio, constraint_fn):
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
3 changes: 3 additions & 0 deletions utils/io_parser.py
Original file line number Diff line number Diff line change
@@ -77,6 +77,9 @@ def check_params(
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")
17 changes: 17 additions & 0 deletions utils/setup_dataset.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit fcc9d09

Please sign in to comment.