def quadrants(): mod = codegen.Module() cst = codegen.Constraints() ibuf(mod, cst, true_pins[2], clk="myclk") pnr = tiled_fuzzer.run_pnr(mod, cst, {}) modules = [] constrs = [] idxes = [] for i in range(2, db.cols): for j in [2, db.rows - 3]: # avoid bram if "DFF0" not in db.grid[j - 1][i - 1].bels: print(i, j) continue mod = codegen.Module() cst = codegen.Constraints() ibuf(mod, cst, true_pins[0], clk="myclk") dff(mod, cst, j, i, clk="myclk") modules.append(mod) constrs.append(cst) idxes.append((j, i)) for i in [2, db.cols - 2]: for j in range(2, db.rows): if "DFF0" not in db.grid[j - 1][i - 1].bels: print(i, j) continue mod = codegen.Module() cst = codegen.Constraints() ibuf(mod, cst, true_pins[0], clk="myclk") dff(mod, cst, j, i, clk="myclk") modules.append(mod) constrs.append(cst) idxes.append((j, i)) pnr_res = pool.map(lambda param: tiled_fuzzer.run_pnr(*param, {}), zip(modules, constrs)) res = {} for (row, col), (mybs, *_) in zip(idxes, pnr_res): sweep_tiles = fuse_h4x.tile_bitmap(fse, mybs ^ pnr.bitmap) # find which tap was used taps = [ r for (r, c, typ), t in sweep_tiles.items() if typ in {13, 14, 15, 16, 18, 19} ] # find which center tile was used t8x = [(r, c) for (r, c, typ), t in sweep_tiles.items() if typ >= 80 and typ < 90] rows, cols, _ = res.setdefault(t8x[0], (set(), set(), taps[0])) rows.add(row - 1) cols.add(col - 1) return res
type_re = re.compile(r"inst\d+_([A-Z]+)_([A-Z]+)") empty, hdr, ftr, posp, config = run_pnr(codegen.Module(), codegen.Constraints(), {}) db.cmd_hdr = hdr db.cmd_ftr = ftr db.template = empty p = Pool() pnr_res = p.map(lambda param: run_pnr(*param), zip(modules, constrs, configs)) for bitmap, hdr, ftr, posp, config in pnr_res: seen = {} diff = bitmap ^ empty bm = fuse_h4x.tile_bitmap(fse, diff) for cst_type, name, *info in posp: bel_type, cell_type = type_re.match(name).groups() if cst_type == "cst": row, col, cls, lut = info print(name, row, col, cls, lut) row = row - 1 col = col - 1 elif cst_type == "place": side, num, pin = info if side == 'T': row = 0 col = num - 1 elif side == 'B': row = len(fse['header']['grid'][61]) - 1 col = num - 1