mirror of https://github.com/openXC7/prjxray.git
138 lines
5.5 KiB
Python
138 lines
5.5 KiB
Python
import os, json, re
|
|
|
|
|
|
class segmaker:
|
|
def __init__(self, bitsfile):
|
|
print("Loading %s grid." % os.getenv("XRAY_DATABASE"))
|
|
with open("../../../database/%s/tilegrid.json" %
|
|
os.getenv("XRAY_DATABASE"), "r") as f:
|
|
self.grid = json.load(f)
|
|
|
|
self.bits = dict()
|
|
self.tags = dict()
|
|
|
|
print("Loading bits from %s." % bitsfile)
|
|
with open(bitsfile, "r") as f:
|
|
for line in f:
|
|
line = line.split("_")
|
|
bit_frame = int(line[1], 16)
|
|
bit_wordidx = int(line[2], 10)
|
|
bit_bitidx = int(line[3], 10)
|
|
base_frame = bit_frame & ~0x7f
|
|
|
|
if base_frame not in self.bits:
|
|
self.bits[base_frame] = dict()
|
|
|
|
if bit_wordidx not in self.bits[base_frame]:
|
|
self.bits[base_frame][bit_wordidx] = set()
|
|
|
|
self.bits[base_frame][bit_wordidx].add(
|
|
(bit_frame, bit_wordidx, bit_bitidx))
|
|
|
|
def addtag(self, site, name, value):
|
|
if site not in self.tags:
|
|
self.tags[site] = dict()
|
|
self.tags[site][name] = value
|
|
|
|
def compile(self, bitfilter=None):
|
|
print("Compiling segment data.")
|
|
|
|
self.segments_by_type = dict()
|
|
|
|
for tilename, tiledata in self.grid["tiles"].items():
|
|
if "segment" not in tiledata:
|
|
continue
|
|
|
|
segdata = self.grid["segments"][tiledata["segment"]]
|
|
|
|
if "baseaddr" not in segdata:
|
|
continue
|
|
|
|
if segdata["type"] not in self.segments_by_type:
|
|
self.segments_by_type[segdata["type"]] = dict()
|
|
segments = self.segments_by_type[segdata["type"]]
|
|
|
|
tile_type = tiledata["type"]
|
|
segname = "%s_%03d" % (
|
|
segdata["baseaddr"][0][2:], segdata["baseaddr"][1])
|
|
|
|
def add_segbits():
|
|
if not segname in segments:
|
|
segments[segname] = {"bits": set(), "tags": dict()}
|
|
|
|
base_frame = int(segdata["baseaddr"][0][2:], 16)
|
|
for wordidx in range(
|
|
segdata["baseaddr"][1],
|
|
segdata["baseaddr"][1] + segdata["words"]):
|
|
if base_frame not in self.bits:
|
|
continue
|
|
if wordidx not in self.bits[base_frame]:
|
|
continue
|
|
for bit_frame, bit_wordidx, bit_bitidx in self.bits[
|
|
base_frame][wordidx]:
|
|
bitname_frame = bit_frame - base_frame
|
|
bitname_bit = 32 * (
|
|
bit_wordidx - segdata["baseaddr"][1]
|
|
) + bit_bitidx
|
|
if bitfilter is None or bitfilter(bitname_frame,
|
|
bitname_bit):
|
|
bitname = "%02d_%02d" % (
|
|
bitname_frame, bitname_bit)
|
|
segments[segname]["bits"].add(bitname)
|
|
|
|
if tilename in self.tags:
|
|
add_segbits()
|
|
|
|
for name, value in self.tags[tilename].items():
|
|
tag = "%s.%s" % (
|
|
re.sub("(LL|LM)?_[LR]$", "", tile_type), name)
|
|
segments[segname]["tags"][tag] = value
|
|
|
|
for site in tiledata["sites"]:
|
|
if site not in self.tags:
|
|
continue
|
|
|
|
add_segbits()
|
|
|
|
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
|
|
|
|
for name, value in self.tags[site].items():
|
|
tag = "%s.%s.%s" % (
|
|
re.sub("(LL|LM)?_[LR]$", "", tile_type), sitekey, name)
|
|
tag = tag.replace(".SLICEM.", ".")
|
|
tag = tag.replace(".SLICEL.", ".")
|
|
segments[segname]["tags"][tag] = value
|
|
|
|
def write(self, suffix=None, roi=False):
|
|
for segtype in self.segments_by_type.keys():
|
|
if suffix is not None:
|
|
filename = "segdata_%s_%s.txt" % (segtype, suffix)
|
|
else:
|
|
filename = "segdata_%s.txt" % (segtype)
|
|
|
|
print("Writing %s." % filename)
|
|
|
|
with open(filename, "w") as f:
|
|
segments = self.segments_by_type[segtype]
|
|
if True:
|
|
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)
|
|
else:
|
|
print("seg roi", file=f)
|
|
for segname, segdata in sorted(segments.items()):
|
|
for bitname in sorted(segdata["bits"]):
|
|
print("bit %s_%s" % (segname, bitname), file=f)
|
|
for tagname, tagval in sorted(segdata["tags"].items()):
|
|
print(
|
|
"tag %s_%s %d" % (segname, tagname, tagval),
|
|
file=f)
|