blob: f891775c4d3b5443e3bf131b07c633655515a088 [file] [log] [blame]
#!/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 json
import io
import os
import random
random.seed(int(os.getenv("SEED"), 16))
from prjxray import util
from prjxray import lut_maker
from prjxray import verilog
from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
if not 'CFG_CENTER_MID' in tile_name:
continue
print("// tile: " + str(tile_name))
loc = grid.loc_of_tilename(tile_name)
gridinfo = grid.gridinfo_at_loc(loc)
sites = {}
print("// " + str(gridinfo.sites.items()))
for site_name, site_type in gridinfo.sites.items():
if site_type == 'STARTUP':
print("// got site: " + str(site_name))
sites[site_type] = site_name
if sites:
yield tile_name, sites
def run():
params = {
"tiles": [],
}
for tile, sites in gen_sites():
for site_type, site in sites.items():
p = {}
p['tile'] = tile
p['site'] = site
p['CONNECTION'] = random.choice(
(
'HARD_ZERO',
# hard zero or hard one does not make a difference
# it only seems to matter if it is connected to a clock net or not
#'HARD_ONE',
'CLOCK',
))
params['tiles'].append(p)
print(
'''
module top (input wire clk);
(* KEEP, DONT_TOUCH *)
STARTUPE2 STARTUPE2 (
.CLK(1'b0),
.GSR(1'b0),
.GTS(1'b0),
.KEYCLEARB(1'b1),
.PACK(1'b0),
.PREQ(),
// Drive clock.''')
connection = p['CONNECTION']
if connection == "HARD_ZERO":
print(" .USRCCLKO (1'b0),")
elif connection == "HARD_ONE":
print(" .USRCCLKO (1'b1),")
else:
print(" .USRCCLKO (clk),")
print(
'''
.USRCCLKTS(1'b0),
.USRDONEO (1'b0),
.USRDONETS(1'b1),
.CFGCLK(),
.CFGMCLK(),
.EOS()
);
endmodule
''')
with open('params.json', 'w') as f:
json.dump(params, f, indent=2)
if __name__ == '__main__':
run()