| import lxml.etree as ET | |
| import argparse | |
| from lib.pb_type import get_pb_type_chain | |
| def specialized_chain_name(pat): | |
| return '.'.join(get_pb_type_chain(pat)[:2]) | |
| def specialize_chain(pat): | |
| pat.attrib['name'] = '{}.{}'.format( | |
| specialized_chain_name(pat), pat.attrib['name'] | |
| ) | |
| def main(): | |
| parser = argparse.ArgumentParser( | |
| description="Converts site local carry chains to fabric global." | |
| ) | |
| parser.add_argument( | |
| '--input_arch_xml', | |
| required=True, | |
| help="Input arch.xml to specialized." | |
| ) | |
| args = parser.parse_args() | |
| arch_xml = ET.ElementTree() | |
| root_element = arch_xml.parse(args.input_arch_xml) | |
| tiles = {} | |
| for pat in root_element.iter('pack_pattern'): | |
| if 'CARRY' in pat.attrib['name']: | |
| pb_types = get_pb_type_chain(pat) | |
| if pb_types[0] not in tiles: | |
| tiles[pb_types[0]] = [] | |
| tiles[pb_types[0]].append(pat) | |
| # Specialize first chain in each tile, and delete the rest. | |
| for tile, pats in tiles.items(): | |
| patterns = [] | |
| for idx, pat in enumerate(pats): | |
| parts = get_pb_type_chain(pat) | |
| if len(parts) > 1: | |
| patterns.append((idx, parts[1])) | |
| else: | |
| patterns.append((idx, '')) | |
| pat_indices, _ = zip(*sorted(patterns, key=lambda x: x[1])) | |
| chain_to_keep = specialized_chain_name(pats[pat_indices[0]]) | |
| for pat_idx in pat_indices: | |
| pat = pats[pat_idx] | |
| if specialized_chain_name(pat) == chain_to_keep: | |
| specialize_chain(pat) | |
| else: | |
| pat.getparent().remove(pat) | |
| print(ET.tostring(arch_xml, pretty_print=True).decode('utf-8')) | |
| if __name__ == '__main__': | |
| main() |