def group_tags(lines, tag_groups, bit_groups): """ Implements tag grouping. If a tag belongs to a group then the common bits of that group are added to is as zeros. >>> tg = [{"A", "B"}] >>> bg = [{(1, 2), (3, 4)}] >>> res = group_tags({"A 1_2", "B 3_4"}, tg, bg) >>> (res[0], sorted(list(res[1]))) (2, ['A 01_02 !03_04', 'B !01_02 03_04']) >>> tg = [{"A", "B"}] >>> bg = [{(1, 2), (3, 4)}] >>> res = group_tags({"A 1_2", "B 3_4", "C 1_2"}, tg, bg) >>> (res[0], sorted(list(res[1]))) (2, ['A 01_02 !03_04', 'B !01_02 03_04', 'C 01_02']) """ changes = 0 new_lines = set() # Process lines for line in lines: line = line.strip() if not len(line): continue # Parse the line tag, bits, mode, _ = util.parse_db_line(line) if not bits: bits = set() else: bits = set([util.parse_tagbit(b) for b in bits]) # Check if the tag belongs to a group for tag_group, bit_group in zip(tag_groups, bit_groups): if tag in tag_group: # Add zero bits to the tag if not already there bit_coords = set([b[1] for b in bits]) for zero_bit in bit_group: if zero_bit not in bit_coords: bits.add((False, zero_bit)) # Format the line new_line = format_bits(tag, bits) # Add the line new_lines.add(new_line) changes += 1 break # It does not, pass it through unchanged else: new_lines.add(format_bits(tag, bits)) return changes, new_lines
def process(l): # l like: CLBLL_L.SLICEL_X0.AMUX.CY !30_07 !30_11 30_06 30_08 # Parse tags to do math when multiple tiles share an address space parts = l.split() name = parts[0] if parts[1] == 'always' or parts[1] == 'hint': tagbits = [] else: tagbits = [util.parse_tagbit(x) for x in parts[1:]] tags.append(list([name] + tagbits))
def find_common_bits_for_tag_groups(lines, tag_groups): """ For each tag group finds a common set of bits that have value of one. """ bit_groups = [] for tag_group in tag_groups: bit_group = set() for line in lines: tag, bits, mode, _ = util.parse_db_line(line) if not bits: continue bits = set([util.parse_tagbit(b) for b in bits]) if tag in tag_group and len(bits): ones = set([b[1] for b in bits if b[0]]) bit_group |= ones bit_groups.append(bit_group) return bit_groups
def group_tags(lines, tag_groups, bit_groups): """ Implements tag grouping. If a tag belongs to a group then the common bits of that group are added to is as zeros. >>> tg = [{"A", "B"}] >>> bg = [{(1, 2), (3, 4)}] >>> res = group_tags({"A 1_2", "B 3_4"}, tg, bg) >>> (res[0], sorted(list(res[1]))) (2, ['A 1_2 !3_4', 'B !1_2 3_4']) >>> tg = [{"A", "B"}] >>> bg = [{(1, 2), (3, 4)}] >>> res = group_tags({"A 1_2", "B 3_4", "C 1_2"}, tg, bg) >>> (res[0], sorted(list(res[1]))) (2, ['A 1_2 !3_4', 'B !1_2 3_4', 'C 1_2']) """ changes = 0 new_lines = set() # Process lines for line in lines: line = line.strip() if not len(line): continue # Parse the line tag, bits, mode, _ = util.parse_db_line(line) if not bits: bits = set() else: bits = set([util.parse_tagbit(b) for b in bits]) # Check if the tag belongs to a group for tag_group, bit_group in zip(tag_groups, bit_groups): if tag in tag_group: # Add zero bits to the tag if not already there bit_coords = set([b[1] for b in bits]) for zero_bit in bit_group: if zero_bit not in bit_coords: bits.add((False, zero_bit)) # Format the line bit_strs = [] for bit in sorted(list(bits), key=lambda b: b[1]): s = "!" if not bit[0] else "" s += "{}_{}".format(bit[1][0], bit[1][1]) bit_strs.append(s) new_line = " ".join([tag] + bit_strs) # Add the line new_lines.add(new_line) changes += 1 break # It does not, pass it through unchanged else: new_lines.add(line) return changes, new_lines