| #!/usr/bin/env python3 |
| |
| from utils import xjson |
| |
| |
| def load_tiles(tiles_fn): |
| ''' |
| "$type $tile $grid_x $grid_y $typed_sites" |
| typed_sites: foreach t $site_types s $sites |
| ''' |
| tiles = list() |
| |
| with open(tiles_fn) as f: |
| for line in f: |
| # CLBLM_L CLBLM_L_X10Y98 30 106 SLICEL SLICE_X13Y98 SLICEM SLICE_X12Y98 |
| record = line.split() |
| tile_type, tile_name, grid_x, grid_y = record[0:4] |
| grid_x, grid_y = int(grid_x), int(grid_y) |
| sites = {} |
| clock_region = None |
| if len(record) >= 5: |
| clock_region = record[4] |
| if clock_region == "NA": |
| clock_region = None |
| for i in range(5, len(record), 2): |
| site_type, site_name = record[i:i + 2] |
| sites[site_name] = site_type |
| |
| tile = { |
| 'type': tile_type, |
| 'name': tile_name, |
| 'grid_x': grid_x, |
| 'grid_y': grid_y, |
| 'sites': sites, |
| 'clock_region': clock_region, |
| } |
| tiles.append(tile) |
| |
| return tiles |
| |
| |
| def load_pin_functions(pin_func_fn): |
| pin_functions = {} |
| |
| with open(pin_func_fn) as f: |
| for line in f: |
| site, pin_func = line.split() |
| assert site not in pin_functions, site |
| pin_functions[site] = pin_func |
| |
| return pin_functions |
| |
| |
| def make_database(tiles, pin_func): |
| # tile database with X, Y, and list of sites |
| # tile name as keys |
| database = dict() |
| |
| for tile in tiles: |
| database[tile["name"]] = { |
| "type": tile["type"], |
| "sites": tile["sites"], |
| "grid_x": tile["grid_x"], |
| "grid_y": tile["grid_y"], |
| "bits": {}, |
| "pin_functions": {}, |
| } |
| |
| if tile["clock_region"]: |
| database[tile["name"]]["clock_region"] = tile["clock_region"] |
| |
| for site in database[tile["name"]]["sites"]: |
| if site in pin_func: |
| database[tile["name"]]["pin_functions"][site] = pin_func[site] |
| |
| return database |
| |
| |
| def run(tiles_fn, pin_func_fn, json_fn, verbose=False): |
| # Load input files |
| tiles = load_tiles(tiles_fn) |
| |
| # Read site map |
| pin_func = load_pin_functions(pin_func_fn) |
| |
| # Index input |
| database = make_database(tiles, pin_func) |
| |
| # Save |
| xjson.pprint(open(json_fn, 'w'), database) |
| |
| |
| def main(): |
| import argparse |
| |
| parser = argparse.ArgumentParser( |
| description='Generate tilegrid.json from bitstream deltas') |
| |
| parser.add_argument('--verbose', action='store_true', help='') |
| parser.add_argument('--out', default='/dev/stdout', help='Output JSON') |
| parser.add_argument( |
| '--tiles', |
| default='tiles.txt', |
| help='Input tiles.txt tcl output', |
| required=True) |
| parser.add_argument( |
| '--pin_func', help='List of sites with pin functions', required=True) |
| args = parser.parse_args() |
| |
| run(args.tiles, args.pin_func, args.out, verbose=args.verbose) |
| |
| |
| if __name__ == '__main__': |
| main() |