import os import random import itertools random.seed(int(os.getenv("SEED"), 16)) from prjxray import util from prjxray.db import Database def gen_dsps(): 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) sites = [] for site_name, site_type in gridinfo.sites.items(): if site_type in ['DSP48E1']: sites.append(site_name) sites.sort() if len(sites) == 0: continue 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), (int_grid_x, loc.grid_y - 1), (int_grid_x, loc.grid_y - 2), (int_grid_x, loc.grid_y - 3), (int_grid_x, loc.grid_y - 4), ] 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, sites, int_tiles def write_params(params): pinstr = 'tile,val\n' for tile, (val, ) in sorted(params.items()): pinstr += '%s,%s\n' % (tile, val) open('params.csv', 'w').write(pinstr) def run(): print(''' module top(); ''') params = {} sites = list(gen_dsps()) fuzz_iter = iter(util.gen_fuzz_states(len(sites) * 5)) for tile_name, dsp_sites, int_tiles in sites: int_tiles.reverse() # Each DSP tile has 5 INT tiles. # The following feature is used to toggle a one PIP in each INT tile # # For a DSP, there are the following INT tiles and the feature # to toggle # # INT_L_X34Y89/INT_L.GFAN1->>IMUX_L30 :: D1.C36 = 0 # INT_L_X34Y89/INT_L.GFAN1->>IMUX_L28 :: D1.CARRYINSEL1 = toggle # # INT_L_X34Y88/INT_L.GFAN1->>IMUX_L30 :: D0.CARRYINSEL0 = toggle # # INT_L_X34Y87/INT_L.GFAN1->>IMUX_L5 :: D1.A29 = 0 # INT_L_X34Y87/INT_L.GFAN1->>IMUX_L14 :: D1.B8 = toggle # # INT_L_X34Y86/INT_L.GFAN1->>IMUX_L30 :: D1.B4 = 0 # INT_L_X34Y86/INT_L.GFAN1->>IMUX_L28 :: D1.B6 = toggle # # INT_L_X34Y85/INT_L.GFAN1->>IMUX_L30 :: Dark Green :: D1.C20 = 0 # INT_L_X34Y85/INT_L.GFAN1->>IMUX_L28 :: Color 10 :: D1.B2 = toggle (d1_carryinsel1, d0_carryinsel0, d1_b8, d1_b6, d1_b2) = itertools.islice(fuzz_iter, 5) params[int_tiles[0]] = (d1_carryinsel1, ) params[int_tiles[1]] = (d0_carryinsel0, ) params[int_tiles[2]] = (d1_b8, ) params[int_tiles[3]] = (d1_b6, ) params[int_tiles[4]] = (d1_b2, ) print( ''' wire [6:0] {dsp_site0}_opmode; wire [2:0] {dsp_site0}_carryinsel; wire [29:0] {dsp_site1}_a; wire [17:0] {dsp_site1}_b; wire [47:0] {dsp_site1}_c; wire [6:0] {dsp_site1}_opmode; wire [2:0] {dsp_site1}_carryinsel; // INT 0, {int0} assign {dsp_site1}_c[36] = 0; assign {dsp_site1}_carryinsel[1] = {d1_carryinsel1}; // INT 1, {int1} assign {dsp_site0}_carryinsel[0] = {d0_carryinsel0}; // INT 2, {int2} assign {dsp_site1}_a[29] = 0; assign {dsp_site1}_b[8] = {d1_b8}; // INT 3, {int3} assign {dsp_site1}_b[4] = 0; assign {dsp_site1}_b[6] = {d1_b6}; // INT 4, {int4} assign {dsp_site1}_c[20] = 0; assign {dsp_site1}_b[2] = {d1_b2}; (* KEEP, DONT_TOUCH, LOC = "{dsp_site0}" *) DSP48E1 #( .OPMODEREG(0), .CREG(0) ) dsp_{dsp_site0} ( .OPMODE({dsp_site0}_opmode), .CARRYINSEL({dsp_site0}_carryinsel) ); (* KEEP, DONT_TOUCH, LOC = "{dsp_site1}" *) DSP48E1 #( .OPMODEREG(0), .CREG(0) ) dsp_{dsp_site1} ( .OPMODE({dsp_site1}_opmode), .CARRYINSEL({dsp_site1}_carryinsel), .A({dsp_site1}_a), .B({dsp_site1}_b), .C({dsp_site1}_c) ); '''.format( dsp_site0=dsp_sites[0], dsp_site1=dsp_sites[1], d1_carryinsel1=d1_carryinsel1, d0_carryinsel0=d0_carryinsel0, d1_b8=d1_b8, d1_b6=d1_b6, d1_b2=d1_b2, int0=int_tiles[0], int1=int_tiles[1], int2=int_tiles[2], int3=int_tiles[3], int4=int_tiles[4], )) print("endmodule") write_params(params) if __name__ == '__main__': run()