| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| import os |
| import random |
| import itertools |
| from prjxray import util |
| from prjxray.db import Database |
| random.seed(int(os.getenv("SEED"), 16)) |
| |
| |
| def gen_sites(lr): |
| db = Database(util.get_db_root(), util.get_part()) |
| grid = db.grid() |
| |
| for tile_name in grid.tiles(): |
| loc = grid.loc_of_tilename(tile_name) |
| gridinfo = grid.gridinfo_at_loc(loc) |
| |
| if gridinfo.tile_type[-1] != lr: |
| continue |
| |
| sites = [] |
| for site_name, site_type in gridinfo.sites.items(): |
| if site_type in ['SLICEL', 'SLICEM']: |
| sites.append(site_name) |
| |
| if not sites: |
| continue |
| |
| print('// ', gridinfo.tile_type) |
| |
| yield sorted(sites) |
| |
| |
| def yield_bits(bits, nvals): |
| for i in range(nvals): |
| mask = (1 << i) |
| yield int(bool(bits & mask)) |
| |
| |
| NUM_IMUX_INPUTS = 2 * 6 * 4 |
| NUM_TILES = 20 |
| |
| |
| def emit_luts(choices, spec_idx, lr): |
| for idx, sites in enumerate(itertools.islice(gen_sites(lr), 0, NUM_TILES)): |
| |
| cidx = idx + spec_idx * NUM_TILES |
| if cidx < len(choices): |
| bits = choices[cidx] |
| else: |
| bits = random.randint(0, 2**NUM_IMUX_INPUTS - 1) |
| |
| itr = yield_bits(bits, nvals=NUM_IMUX_INPUTS) |
| |
| for site in sites: |
| for lut in range(4): |
| print( |
| ''' |
| (* KEEP, DONT_TOUCH, LOC = "{site}" *) |
| LUT6 {site}_lut{lut} ( |
| .I0({I0}), |
| .I1({I1}), |
| .I2({I2}), |
| .I3({I3}), |
| .I4({I4}), |
| .I5({I5}) |
| );'''.format( |
| site=site, |
| lut=lut, |
| I0=next(itr), |
| I1=next(itr), |
| I2=next(itr), |
| I3=next(itr), |
| I4=next(itr), |
| I5=next(itr), |
| )) |
| |
| |
| def run(): |
| |
| print(''' |
| module top(); |
| ''') |
| |
| choices = util.gen_fuzz_choices(nvals=NUM_IMUX_INPUTS) |
| spec_idx = util.specn() - 1 |
| |
| emit_luts(choices, spec_idx, 'L') |
| emit_luts(choices, spec_idx, 'R') |
| |
| print("endmodule") |
| |
| |
| if __name__ == '__main__': |
| run() |