| 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) |