def gen_sites(): ''' Return dict of ISERDES/OSERDES locations. ''' db = Database(util.get_db_root()) grid = db.grid() xy_fun = util.create_xy_fun('\S+') tiles = grid.tiles() for tile_name in sorted(tiles): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) tile_type = gridinfo.tile_type tile = {'tile': tile_name, 'tile_type': tile_type, 'ioi_sites': {}} for site_name, site_type in gridinfo.sites.items(): if site_type in SITE_TYPES: xy = xy_fun(site_name) if xy not in tile['ioi_sites']: tile['ioi_sites'][xy] = {} tile['ioi_sites'][xy][site_type] = site_name yield tile
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() tile_list = [] for tile_name in sorted(grid.tiles()): if "IOB33" not in tile_name or "SING" in tile_name: continue tile_list.append(tile_name) get_xy = util.create_xy_fun('[LR]IOB33_') tile_list.sort(key=get_xy) for iob_tile_name in tile_list: iob_gridinfo = grid.gridinfo_at_loc( grid.loc_of_tilename(iob_tile_name)) iob33s = [k for k, v in iob_gridinfo.sites.items() if v == "IOB33S"][0] iob33m = [k for k, v in iob_gridinfo.sites.items() if v == "IOB33M"][0] top_sites = { "IOB": iob33m, "ILOGIC": iob33m.replace("IOB", "ILOGIC"), "IDELAY": iob33m.replace("IOB", "IDELAY"), } bot_sites = { "IOB": iob33s, "ILOGIC": iob33s.replace("IOB", "ILOGIC"), "IDELAY": iob33s.replace("IOB", "IDELAY"), } yield iob_tile_name, top_sites, bot_sites
def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) found_xadc = False for site_name, site_type in gridinfo.sites.items(): if site_type in ['XADC']: found_xadc = True break if not found_xadc: continue int_grid_x = loc.grid_x + 3 int_tile_type = 'INT_L' int_tile_locs = [] for dy in range(-1, 1): int_tile_locs.append((int_grid_x, loc.grid_y + dy), ) int_tiles = [] for int_tile_loc in int_tile_locs: int_gridinfo = grid.gridinfo_at_loc(int_tile_loc) assert int_gridinfo.tile_type == int_tile_type, ( int_gridinfo.tile_type, int_tile_type) int_tiles.append(grid.tilename_at_loc(int_tile_loc)) yield tile_name, int_tiles
def main(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() luts = LutMaker() def gen_sites(desired_site_type): for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site, site_type in gridinfo.sites.items(): if site_type == desired_site_type: yield tile_name, site print(''' module top(); (* KEEP, DONT_TOUCH *) LUT6 dummy(); ''') for site_type in ["PCIE_2_1"]: for _, site in gen_sites(site_type): print_site(ports[site_type], luts, site, site_type) for l in luts.create_wires_and_luts(): print(l) print('endmodule')
def __init__(self, db_root): db = Database(db_root) grid = db.grid() tiles_in_gclk_columns = [] self.gclk_columns = {} for tile in grid.tiles(): gridinfo = grid.gridinfo_at_tilename(tile) if gridinfo.tile_type != 'CLK_BUFG_REBUF': continue loc = grid.loc_of_tilename(tile) tiles_in_gclk_columns.append((loc.grid_y, tile)) _, self.tiles_in_gclk_columns = zip( *sorted(tiles_in_gclk_columns, key=lambda x: x[0])) # Initially all GCLK lines are idle. GCLK lines only exist between #CLK_BUFG_REBUF tiles, hence len-1. for gclk in range(GCLKS): self.gclk_columns[gclk] = [ False for _ in range(len(self.tiles_in_gclk_columns) - 1) ]
def gen_fifos(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['IN_FIFO']: if gridinfo.tile_type[-1] == 'L': int_grid_x = loc.grid_x + 2 int_tile_type = 'INT_L' else: int_grid_x = loc.grid_x - 2 int_tile_type = 'INT_R' int_tile_locs = [(int_grid_x, loc.grid_y + idx - 5) for idx in range(12)] int_tiles = [] for int_tile_loc in int_tile_locs: int_gridinfo = grid.gridinfo_at_loc(int_tile_loc) assert int_gridinfo.tile_type == int_tile_type, ( int_tile_loc, int_gridinfo.tile_type, int_tile_type) int_tiles.append(grid.tilename_at_loc(int_tile_loc)) yield site_name, int_tiles
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() tile_list = [] for tile_name in sorted(grid.tiles()): if "IOB33" not in tile_name or "SING" in tile_name: continue tile_list.append(tile_name) get_xy = util.create_xy_fun('[LR]IOB33_') tile_list.sort(key=get_xy) for iob_tile_name in tile_list: iob_gridinfo = grid.gridinfo_at_loc( grid.loc_of_tilename(iob_tile_name)) # Find IOI tile adjacent to IOB for suffix in ["IOI3", "IOI3_TBYTESRC", "IOI3_TBYTETERM"]: try: ioi_tile_name = iob_tile_name.replace("IOB33", suffix) ioi_gridinfo = grid.gridinfo_at_loc( grid.loc_of_tilename(ioi_tile_name)) break except KeyError: pass iob33s = [k for k, v in iob_gridinfo.sites.items() if v == "IOB33S"][0] iob33m = [k for k, v in iob_gridinfo.sites.items() if v == "IOB33M"][0] idelay_s = iob33s.replace("IOB", "IDELAY") idelay_m = iob33m.replace("IOB", "IDELAY") yield iob33m, idelay_m, iob33s, idelay_s
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): gridinfo = grid.gridinfo_at_tilename(tile_name) for site_name, site_type in gridinfo.sites.items(): if site_type in ['MMCME2_ADV']: yield tile_name, site_name
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type in ['DSP_L', 'DSP_R']: site_name = sorted(gridinfo.sites.keys())[0] yield tile_name, site_name
def gen_sites(desired_site_type): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site, site_type in gridinfo.sites.items(): if site_type == desired_site_type: yield site
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type in ['CFG_CENTER_MID']: for site_name in sorted(gridinfo.sites.keys()): if site_name.startswith("BSCAN_X0Y0"): yield tile_name, site_name
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['GTPE2_CHANNEL']: yield tile_name, site_name
def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type in ['DSP_L', 'DSP_R']: for site in sorted(gridinfo.sites.keys()): if gridinfo.sites[site] == 'DSP48E1': yield tile_name, site
def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile_name in grid.tiles(): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['RAMBFIFO36E1']: yield tile_name, site_name
def main(): parser = argparse.ArgumentParser( description= "Creates design.json from output of ROI generation tcl script.") parser.add_argument('--design_txt', required=True) parser.add_argument('--design_info_txt', required=True) parser.add_argument('--pad_wires', required=True) args = parser.parse_args() j = {} j['ports'] = [] j['info'] = {} with open(args.design_txt) as f: for d in csv.DictReader(f, delimiter=' '): j['ports'].append(d) with open(args.design_info_txt) as f: for l in f: name, value = l.strip().split(' = ') j['info'][name] = int(value) db = Database(get_db_root()) grid = db.grid() roi = Roi( db=db, x1=j['info']['GRID_X_MIN'], y1=j['info']['GRID_Y_MIN'], x2=j['info']['GRID_X_MAX'], y2=j['info']['GRID_Y_MAX'], ) with open(args.pad_wires) as f: for l in f: parts = l.strip().split(' ') name = parts[0] pin = parts[1] wires = parts[2:] wires_outside_roi = [] for wire in wires: tile = wire.split('/')[0] loc = grid.loc_of_tilename(tile) if not roi.tile_in_roi(loc): wires_outside_roi.append(wire) set_port_wires(j['ports'], name, pin, wires_outside_roi) json.dump(j, sys.stdout, indent=2, sort_keys=True)
def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['PLLE2_ADV']: phasers = find_phasers_for_pll(grid, loc) yield site_name, phasers
def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['BSCAN', 'CAPTURE', 'ICAP', 'USR_ACCESS', 'STARTUP', 'FRAME_ECC', 'DCIRESET']: if site_name not in 'ICAP_X0Y0': yield site_name, site_type
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) tile_type = tile_name.rsplit("_", 1)[0] for site_name, site_type in gridinfo.sites.items(): if site_type in ['PLLE2_ADV']: yield tile_name, tile_type, site_name
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['PCIE_2_1']: pcie_int_tiles = get_pcie_int_tiles(grid, loc) yield pcie_int_tiles, site_name
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['GTPE2_COMMON']: gtp_int_tile = get_gtp_int_tile(gridinfo.clock_region, grid) yield gtp_int_tile, site_name
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['MMCME2_ADV']: phasers = find_phasers_for_mmcm(grid, loc) hclk_wires = find_hclk_ref_wires_for_mmcm(grid, loc) yield tile_name, site_name, phasers, hclk_wires
def merge_tuples(cleared_tups, mem_tups): db_path = os.getenv("XRAY_DATABASE_DIR") db_type = os.getenv("XRAY_DATABASE") db_path = os.path.join(db_path, db_type) db = Database(db_path, os.getenv("XRAY_PART")) grid = db.grid() if type(cleared_tups) is not list: cleared_tups = list(cleared_tups) if type(mem_tups) is not list: mem_tups = list(mem_tups) all_tups = fasmutil.chain_tuples(cleared_tups, mem_tups) merged = fasm.output.merge_and_sort(all_tups, sort_key=grid.tile_key) return merged
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) sites = [] for site, site_type in gridinfo.sites.items(): if site_type == 'BUFMRCE': sites.append(site) if sites: yield tile_name, sorted(sites)
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type not in ["PCIE_BOT"]: continue for site_name, site_type in gridinfo.sites.items(): return site_name, site_type
def bram_count(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() count = 0 for tile_name in grid.tiles(): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['RAMBFIFO36E1']: count += 1 return count
def gen_sites(): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type not in ['BRAM_L', 'BRAM_R']: continue sites = {} for site_name, site_type in gridinfo.sites.items(): sites[site_type] = site_name yield tile_name, sites
def bits_to_fasm(db_root, bits_file, verbose, canonical): db = Database(db_root) grid = db.grid() disassembler = fasm_disassembler.FasmDisassembler(db) with open(bits_file) as f: bitdata = bitstream.load_bitdata(f) model = fasm.output.merge_and_sort( disassembler.find_features_in_bitstream(bitdata, verbose=verbose), zero_function=disassembler.is_zero_feature, sort_key=grid.tile_key, ) print(fasm.fasm_tuple_to_string(model, canonical=canonical), end='')
def run(db_root, filename_in, f_out, sparse=False, roi=None, debug=False): db = Database(db_root) assembler = fasm_assembler.FasmAssembler(db) extra_features = [] if roi: with open(roi) as f: roi_j = json.load(f) x1 = roi_j['info']['GRID_X_MIN'] x2 = roi_j['info']['GRID_X_MAX'] y1 = roi_j['info']['GRID_Y_MIN'] y2 = roi_j['info']['GRID_Y_MAX'] assembler.mark_roi_frames(Roi(db=db, x1=x1, x2=x2, y1=y1, y2=y2)) if 'required_features' in roi_j: extra_features = fasm.parse_fasm_string('\n'.join( roi_j['required_features'])) assembler.parse_fasm_filename(filename_in, extra_features=extra_features) frames = assembler.get_frames(sparse=sparse) if debug: dump_frames_sparse(frames) dump_frm(f_out, frames)
def gen_sites(): ''' IOB33S: main IOB of a diff pair IOB33M: secondary IOB of a diff pair IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?) Focus on IOB33S to start ''' db = Database(util.get_db_root()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) for site_name, site_type in gridinfo.sites.items(): if site_type in ['IOB33S', 'IOB33M']: yield tile_name, site_name
def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type.endswith("_SING"): continue # Y9 tiles have frame address 1 frame higher than the rest # Need to investigate what is so special about them if tile_name.endswith("Y9"): continue sites = [] for site_name, site_type in gridinfo.sites.items(): if site_type == 'IDELAYE2': yield tile_name, site_name