mirror of https://github.com/openXC7/prjxray.git
160 lines
4.3 KiB
Python
160 lines
4.3 KiB
Python
#!/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 os
|
|
from enum import Enum
|
|
|
|
from prjxray.segmaker import Segmaker
|
|
#from icecream import ic
|
|
|
|
INT = "INT"
|
|
BIN = "BIN"
|
|
|
|
|
|
def bitfilter_gtx_common_mid(frame, bit):
|
|
# Filter out non interesting bits.
|
|
word = int(bit / 32)
|
|
|
|
if word < 44 or word > 56:
|
|
return False
|
|
|
|
if frame not in [0, 1]:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def bitfilter_gtx_common(frame, bit):
|
|
# Filter out non interesting bits.
|
|
word = int(bit / 32)
|
|
|
|
if word < 44 or word > 56:
|
|
return False
|
|
|
|
# let ENABLE_DRP come through
|
|
if (frame == 24 or frame or frame == 25) and bit == 1613:
|
|
return True
|
|
|
|
if frame < 30 or frame > 31:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def main():
|
|
segmk = Segmaker("design.bits")
|
|
|
|
fuz_dir = os.getenv("FUZDIR", None)
|
|
assert fuz_dir
|
|
with open(os.path.join(fuz_dir, "attrs.json"), "r") as attr_file:
|
|
attrs = json.load(attr_file)
|
|
|
|
print("Loading tags")
|
|
with open("params.json") as f:
|
|
params_dict = json.load(f)
|
|
tile_type = params_dict["tile_type"]
|
|
params_list = params_dict["params"]
|
|
|
|
sites_in_tile = dict()
|
|
|
|
for params in params_list:
|
|
site = params["site"]
|
|
tile = params["tile"]
|
|
|
|
if "GTXE2_COMMON" not in site:
|
|
continue
|
|
|
|
sites_in_tile[tile] = site
|
|
|
|
in_use = params["IN_USE"]
|
|
|
|
segmk.add_site_tag(site, "IN_USE", in_use)
|
|
|
|
if in_use:
|
|
for param, param_info in attrs.items():
|
|
value = params[param]
|
|
param_type = param_info["type"]
|
|
param_digits = param_info["digits"]
|
|
param_values = param_info["values"]
|
|
|
|
if param_type == INT:
|
|
param_encodings = param_info["encoding"]
|
|
param_encoding = param_encodings[param_values.index(value)]
|
|
bitstr = [
|
|
int(x) for x in "{value:0{digits}b}".format(
|
|
value=param_encoding, digits=param_digits)[::-1]
|
|
]
|
|
|
|
for i in range(param_digits):
|
|
segmk.add_site_tag(
|
|
site, '%s[%u]' % (param, i), bitstr[i])
|
|
else:
|
|
assert param_type == BIN
|
|
bitstr = [
|
|
int(x) for x in "{value:0{digits}b}".format(
|
|
value=value, digits=param_digits)[::-1]
|
|
]
|
|
|
|
for i in range(param_digits):
|
|
segmk.add_site_tag(
|
|
site, "%s[%u]" % (param, i), bitstr[i])
|
|
|
|
for param in ["QPLLLOCKDETCLK", "DRPCLK"]:
|
|
segmk.add_site_tag(site, "INV_" + param, params[param])
|
|
|
|
for param in ["GTREFCLK0_USED", "GTREFCLK1_USED",
|
|
"BOTH_GTREFCLK_USED"]:
|
|
segmk.add_site_tag(site, param, params[param])
|
|
|
|
segmk.add_site_tag(site, "ENABLE_DRP", params["ENABLE_DRP"])
|
|
|
|
for params in params_list:
|
|
site = params["site"]
|
|
|
|
if "IBUFDS_GTE2" not in site:
|
|
continue
|
|
|
|
in_use = params["IN_USE"]
|
|
segmk.add_site_tag(site, "IN_USE", in_use)
|
|
|
|
if in_use:
|
|
tile = params["tile"]
|
|
|
|
for param in ["CLKRCV_TRST", "CLKCM_CFG"]:
|
|
value = params[param]
|
|
segmk.add_site_tag(site, param, "TRUE" in value)
|
|
|
|
bitstr = [
|
|
int(x) for x in "{value:0{digits}b}".format(
|
|
value=params["CLKSWING_CFG"], digits=2)[::-1]
|
|
]
|
|
|
|
gtx_common_site = sites_in_tile[tile]
|
|
for i in range(2):
|
|
segmk.add_site_tag(
|
|
gtx_common_site, "IBUFDS_GTE2.CLKSWING_CFG[%u]" % (i),
|
|
bitstr[i])
|
|
|
|
if tile_type.startswith("GTX_COMMON_MID"):
|
|
bitfilter = bitfilter_gtx_common_mid
|
|
elif tile_type == "GTX_COMMON":
|
|
bitfilter = bitfilter_gtx_common
|
|
else:
|
|
assert False, tile_type
|
|
|
|
segmk.compile(bitfilter=bitfilter)
|
|
segmk.write()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|