def main(): layout = pythunder.Layout() size = 2 # 3x3 layout layer = pythunder.Layer('p', size, size) for x in range(size): for y in range(size): layer.mark_available(x, y) layout.add_layer(layer) # two nets netlist = {"e0": ["p0", "p1"], "e1": ["p1", "p2", "p3"]} # don't do clustering here clusters = {"x0": {"p0", "p1", "p2", "p3"}} # no fixed position fixed_pos = {} # global placement gp = pythunder.GlobalPlacer(clusters, netlist, fixed_pos, layout) # place in gp gp.solve() gp.anneal() gp_result = gp.realize() dp_result = pythunder.detailed_placement(clusters, netlist, fixed_pos, gp_result, layout) # global refine refine_dp = pythunder.DetailedPlacer(dp_result, netlist, layout.produce_available_pos(), fixed_pos, 'p', True) refine_dp.refine(1000, 0.001, True) result = refine_dp.realize() # print it out for blk_id, (x, y) in result.items(): print(blk_id + ": x", x, "y ", y)
def detailed_placement_thunder(args, context=None): blks = list(args["clusters"]) cells = args["cells"] netlist = args["new_netlist"] blk_pos = args["blk_pos"] fold_reg = args["fold_reg"] # seed = args["seed"] # disallowed_pos = args["disallowed_pos"] clb_type = args["clb_type"] fixed_pos = {} for blk_id in blk_pos: fixed_pos[blk_id] = list(blk_pos[blk_id]) placer = pythunder.DetailedPlacer(blks, netlist, cells, fixed_pos, clb_type, fold_reg) placer.anneal() placer.refine(1000, 0.01, False) placement = placer.realize() keys_to_remove = set() for blk_id in placement: if blk_id[0] == "x": keys_to_remove.add(blk_id) for blk_id in keys_to_remove: placement.pop(blk_id, None) if context is None: return placement else: return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'body': placement }
def refine_global_thunder(layout, pre_placement, netlists, fixed_pos, fold_reg): clb_type = layout.get_clb_type() available_pos = layout.produce_available_pos() global_refine = pythunder.DetailedPlacer(pre_placement, netlists, available_pos, fixed_pos, clb_type, fold_reg) global_refine.refine(int(100 * (len(pre_placement)**1.33)), 0.001, True) return global_refine.realize()
def estimate_placement_time(args): blks = list(args["clusters"]) cells = args["cells"] netlist = args["new_netlist"] blk_pos = args["blk_pos"] fold_reg = args["fold_reg"] clb_type = args["clb_type"] fixed_pos = {} for blk_id in blk_pos: fixed_pos[blk_id] = list(blk_pos[blk_id]) new_cells = {} for blk_type in cells: new_cells[blk_type] = list(cells[blk_type]) placer = pythunder.DetailedPlacer(blks, netlist, new_cells, fixed_pos, clb_type, fold_reg) t = placer.estimate(10000) return t
def refine_global_thunder(board_meta, pre_placement, netlists, fixed_pos, fold_reg): board_layout = board_meta[0] board_info = board_meta[-1] clb_type = board_info["clb_type"] available_pos = {} for y in range(len(board_layout)): for x in range(len(board_layout[y])): blk_type = board_layout[y][x] if blk_type is not None: if blk_type not in available_pos: available_pos[blk_type] = [] available_pos[blk_type].append((x, y)) global_refine = pythunder.DetailedPlacer(pre_placement, netlists, available_pos, fixed_pos, clb_type, fold_reg) if "TRAVIS" not in os.environ: # FIXME: travis hack # remove this after new router global_refine.refine(int(10 * (len(pre_placement)**1.33)), 0.01, True) return global_refine.realize()