# Reverse PCAD-2004 ECO file for unnamed network split # Converts ECO commands: # # NetSplit "NET00351" "NET00362" "T617-3" "T614-2" "T618-2" "T618-1" # NetDelete "NET00351" # # into NetRename "NET00362" "NET00351" and reverses the order # import argparse import sys import re import os RE_SPLIT = re.compile(r'NetSplit(\s\"[.\-_~a-zA-Z0-9]*\")(\s\"[.\-_~a-zA-Z0-9]*\").*') RE_DELETE = re.compile(r'NetDelete(\s\"[.\-_~a-zA-Z0-9]*\")') def load_eco(name): # # Add the default file name extension if needed # if not os.path.splitext(name)[1]: name += '.eco' try: f = open(name, 'r', -1, None, None) except OSError as err: raise RuntimeError(err) ls = f.readlines() # read lines from input file f.close() net = None for line in ls: if line[0] == ';': continue match = RE_SPLIT.match(line) if match is not None: net = match.group(1) continue match = RE_DELETE.match(line) if match is not None: if match.group(1) != net: print("Non consistent NetDelete: %s" % line) exit(-1) continue print("Unrecognized ECO action: %s" % line) exit(-1) return ls def save_eco(name, ls): f = open(name, 'w') # # Comment the current ECO content # for line in ls: if line[0] != ';': line = '; ' + line; f.write(line) f.write('; *** ECO Reversing script ***\n') # # reverse line order # ls.reverse() for line in ls: if line[0] == ';': continue match = RE_SPLIT.match(line) if match is not None: line = "NetRename" + match.group(2) + match.group(1) print(line) f.write(line + '\n') f.close() def createParser(): p = argparse.ArgumentParser( description='PCAD4 ECO-file reverting script, Version 24.12a, (c) 1801BM1') p.add_argument('eco', nargs=1, help='input eco file', metavar='file') return p def main(): parser = createParser() params = parser.parse_args() name = params.eco[0] if not os.path.splitext(name)[1]: name += '.eco' ls = load_eco(name) save_eco(name, ls) if __name__ == '__main__': main()