forked from litghost/prjxray
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsegmaker.py
131 lines (107 loc) · 5.3 KB
/
segmaker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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.items():
if "baseaddr" not in tiledata:
continue
if tiledata["type"] not in self.segments_by_type:
self.segments_by_type[tiledata["type"]] = dict()
segments = self.segments_by_type[tiledata["type"]]
tile_type = tiledata["type"]
segname = "%s_%03d" % (
tiledata["baseaddr"][2:], tiledata["offset"])
def add_segbits():
if not segname in segments:
segments[segname] = {"bits": set(), "tags": dict()}
base_frame = int(tiledata["baseaddr"][2:], 16)
for wordidx in range(
tiledata["offset"],
tiledata["offset"] + tiledata["height"]):
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 - tiledata["offset"]) + 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.lower(), suffix)
else:
filename = "segdata_%s.txt" % (segtype.lower())
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)