Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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
        }
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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()