mirror of https://github.com/openXC7/prjxray.git
151 lines
4.5 KiB
Python
151 lines
4.5 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 os, json, re
|
|
|
|
#################################################
|
|
# Loading Raw Source Data
|
|
|
|
grid = None
|
|
bits = dict()
|
|
luts = dict()
|
|
carry = dict()
|
|
|
|
print("Loading grid.")
|
|
with open("../../../gridinfo/grid-%s-db.json" % os.getenv("XRAY_PART"),
|
|
"r") as f:
|
|
grid = json.load(f)
|
|
|
|
print("Loading bits.")
|
|
with open("design.bits", "r") as f:
|
|
for line in f:
|
|
line = line.split("_")
|
|
bit_frame = int(line[1], 16)
|
|
bit_wordidx = int(line[2], 16)
|
|
bit_bitidx = int(line[3], 16)
|
|
base_frame = bit_frame & ~0x7f
|
|
|
|
if base_frame not in bits:
|
|
bits[base_frame] = dict()
|
|
|
|
if bit_wordidx not in bits[base_frame]:
|
|
bits[base_frame][bit_wordidx] = set()
|
|
|
|
bits[base_frame][bit_wordidx].add((bit_frame, bit_wordidx, bit_bitidx))
|
|
|
|
print("Loading lut data.")
|
|
with open("lutdata.txt", "r") as f:
|
|
for line in f:
|
|
line = line.split()
|
|
site = line[0]
|
|
bel = line[1]
|
|
init = int(line[2][4:], 16)
|
|
|
|
if site not in luts:
|
|
luts[site] = dict()
|
|
|
|
for i in range(64):
|
|
bitname = "%s.INIT[%02d]" % (bel, i)
|
|
luts[site][bitname] = ((init >> i) & 1) != 0
|
|
|
|
print("Loading carry data.")
|
|
with open("carrydata.txt", "r") as f:
|
|
for line in f:
|
|
line = line.split()
|
|
assert line[0] not in carry
|
|
carry[line[0]] = dict()
|
|
for i, n in enumerate(
|
|
"CYINIT:ZRO:ONE:AX:CIN DI0:AX:O5 DI1:AX:O5 DI2:AX:O5 DI3:AX:O5"
|
|
.split()):
|
|
n = n.split(":")
|
|
for k in n[1:]:
|
|
carry[line[0]]["CARRY_%s_MUX_%s" %
|
|
(n[0], k)] = line[1 + i].upper() == k
|
|
|
|
#################################################
|
|
# Group per Segment
|
|
|
|
print("Compile segment data.")
|
|
|
|
segments = dict()
|
|
|
|
for tilename, tiledata in grid["tiles"].items():
|
|
found_data = False
|
|
for site in tiledata["sites"]:
|
|
if site in luts:
|
|
found_data = True
|
|
|
|
if not found_data:
|
|
continue
|
|
|
|
segname = "%s_%02x" % (
|
|
tiledata["cfgcol"]["BASE_FRAMEID"][2:], min(
|
|
tiledata["cfgcol"]["WORDS"]))
|
|
|
|
if not segname in segments:
|
|
segments[segname] = {"bits": list(), "tags": dict()}
|
|
|
|
for site in tiledata["sites"]:
|
|
if site not in luts and site not in carry:
|
|
continue
|
|
|
|
if re.match(r"SLICE_X[0-9]*[02468]Y", site):
|
|
sitekey = "SLICE_X0"
|
|
elif re.match(r"SLICE_X[0-9]*[13579]Y", site):
|
|
sitekey = "SLICE_X1"
|
|
else:
|
|
assert 0
|
|
|
|
if site in luts:
|
|
for name, value in luts[site].items():
|
|
tile_type = tiledata["props"]["TYPE"]
|
|
|
|
# LUT init bits are in the same position for all CLBL[LM]_[LR] tiles
|
|
if re.match("^CLBL[LM]_[LR]",
|
|
tile_type) and "LUT.INIT" in name:
|
|
tile_type = "CLBLX_X"
|
|
|
|
segments[segname]["tags"]["%s.%s.%s" %
|
|
(tile_type, sitekey, name)] = value
|
|
|
|
if site in carry:
|
|
for name, value in carry[site].items():
|
|
tile_type = tiledata["props"]["TYPE"]
|
|
segments[segname]["tags"]["%s.%s.%s" %
|
|
(tile_type, sitekey, name)] = value
|
|
|
|
base_frame = int(tiledata["cfgcol"]["BASE_FRAMEID"][2:], 16)
|
|
for wordidx in tiledata["cfgcol"]["WORDS"]:
|
|
if base_frame not in bits:
|
|
continue
|
|
if wordidx not in bits[base_frame]:
|
|
continue
|
|
for bit_frame, bit_wordidx, bit_bitidx in bits[base_frame][wordidx]:
|
|
segments[segname]["bits"].append(
|
|
"%02x_%02x_%02x" % (
|
|
bit_frame - base_frame, bit_wordidx - min(
|
|
tiledata["cfgcol"]["WORDS"]), bit_bitidx))
|
|
|
|
segments[segname]["bits"].sort()
|
|
|
|
#################################################
|
|
# Print
|
|
|
|
print("Write segment data.")
|
|
|
|
with open("segdata.txt", "w") as f:
|
|
for segname, segdata in sorted(segments.items()):
|
|
print("seg %s" % segname, file=f)
|
|
for bitname in sorted(segdata["bits"]):
|
|
print("bit %s" % bitname, file=f)
|
|
for tagname, tagval in sorted(segdata["tags"].items()):
|
|
print("tag %s %d" % (tagname, tagval), file=f)
|