| import os | |
| import random | |
| random.seed(int(os.getenv("SEED"), 16)) | |
| from utils import util | |
| from utils.db import Database | |
| 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 ['CLEL_L', 'CLEL_R', 'CLEM']: | |
| site_name = sorted(gridinfo.sites.keys())[0] | |
| yield tile_name, site_name | |
| def write_params(params): | |
| pinstr = 'tile,val,site\n' | |
| for tile, (site, val) in sorted(params.items()): | |
| pinstr += '%s,%s,%s\n' % (tile, val, site) | |
| open('params.csv', 'w').write(pinstr) | |
| def run(): | |
| print( | |
| ''' | |
| module top(input clk, stb, di, output do); | |
| localparam integer DIN_N = 8; | |
| localparam integer DOUT_N = 8; | |
| reg [DIN_N-1:0] din; | |
| wire [DOUT_N-1:0] dout; | |
| reg [DIN_N-1:0] din_shr; | |
| reg [DOUT_N-1:0] dout_shr; | |
| always @(posedge clk) begin | |
| din_shr <= {din_shr, di}; | |
| dout_shr <= {dout_shr, din_shr[DIN_N-1]}; | |
| if (stb) begin | |
| din <= din_shr; | |
| dout_shr <= dout; | |
| end | |
| end | |
| assign do = dout_shr[DOUT_N-1]; | |
| ''') | |
| carry_params = ("SINGLE_CY8", "DUAL_CY4") | |
| params = {} | |
| sites = list(gen_sites()) | |
| for (tile_name, site_name), isone in zip(sites, | |
| util.gen_fuzz_states(len(sites))): | |
| params[tile_name] = (site_name, isone) | |
| print( | |
| ''' | |
| (* KEEP, DONT_TOUCH, LOC = "%s" *) | |
| CARRY8 #(.CARRY_TYPE("%s") ) carry8_%s ( | |
| .CI(0)); | |
| ''' % (site_name, carry_params[isone], site_name)) | |
| print("endmodule") | |
| write_params(params) | |
| if __name__ == '__main__': | |
| run() |