| #!/usr/bin/env python3 |
| # |
| # fix_vddio_lvc_gds.py --- |
| # |
| # Special-purpose script that does the work of what ought to be a simple |
| # binary diff and patch. Except that no such thing exists as a standard |
| # offering on most Linux systems, so instead of adding another OS |
| # package requirement, I'm just writing a binary search-and-replace in |
| # python. |
| # |
| # The purpose of the patch is to add metal3 resistor ID markers to the |
| # sky130_fd_io__hvc_clampv2 cell. Also add label for PADISOL|R |
| # in the isolated metal3 region formed by the resistors, in the |
| # sky130_fd_io__top_power_lvc_wpad cell. |
| # |
| |
| import sys |
| |
| if len(sys.argv) != 2: |
| print('Usage: fix_vddio_pad_gds.py <filename>') |
| sys.exit(1) |
| else: |
| file_name = sys.argv[1] |
| |
| # Metal 3 resistor at (0.505um 61.12um 24.485um 61.56um) |
| add_data_1 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\x01\xf9\x00\x00\xee\xc0\x00\x00\x5f\xa5\x00\x00\xee\xc0\x00\x00\x5f\xa5\x00\x00\xf0\x78\x00\x00\x01\xf9\x00\x00\xf0\x78\x00\x00\x01\xf9\x00\x00\xee\xc0\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (50.40um 61.12um 74.64um 61.56um) |
| add_data_2 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\xc4\xe0\x00\x00\xee\xc0\x00\x01\x23\x90\x00\x00\xee\xc0\x00\x01\x23\x90\x00\x00\xf0\x78\x00\x00\xc4\xe0\x00\x00\xf0\x78\x00\x00\xc4\xe0\x00\x00\xee\xc0\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (24.475um 61.56um 24.485um 67.07um) |
| add_data_3 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\x5f\x9b\x00\x00\xf0\x78\x00\x00\x5f\xa5\x00\x00\xf0\x78\x00\x00\x5f\xa5\x00\x01\x05\xfe\x00\x00\x5f\x9b\x00\x01\x05\xfe\x00\x00\x5f\x9b\x00\x00\xf0\x78\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (0.505um 61.56um 0.515um 67.07um) |
| add_data_4 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\x01\xf9\x00\x00\xf0\x78\x00\x00\x02\x03\x00\x00\xf0\x78\x00\x00\x02\x03\x00\x01\x05\xfe\x00\x00\x01\xf9\x00\x01\x05\xfe\x00\x00\x01\xf9\x00\x00\xf0\x78\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (0.505um 67.07um 24.485um 67.51um) |
| add_data_5 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\x01\xf9\x00\x01\x05\xfe\x00\x00\x5f\xa5\x00\x01\x05\xfe\x00\x00\x5f\xa5\x00\x01\x07\x66\x00\x00\x01\xf9\x00\x01\x07\x66\x00\x00\x01\xf9\x00\x01\x05\xfe\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (50.76um 67.07um 74.64um 67.51um) |
| add_data_6 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\xc6\x48\x00\x01\x05\xfe\x00\x01\x23\x90\x00\x01\x05\xfe\x00\x01\x23\x90\x00\x01\x07\x66\x00\x00\xc6\x48\x00\x01\x07\x66\x00\x00\xc6\x48\x00\x01\x05\xfe\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (50.76um 61.56um 50.77um 67.07um) |
| add_data_7 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x00\xc6\x48\x00\x00\xf0\x78\x00\x00\xc6\x52\x00\x00\xf0\x78\x00\x00\xc6\x52\x00\x01\x05\xfe\x00\x00\xc6\x48\x00\x01\x05\xfe\x00\x00\xc6\x48\x00\x00\xf0\x78\x00\x04\x11\x00' |
| |
| # Metal 3 resistor at (74.63um 61.56um 74.64um 67.07um) |
| add_data_8 = b'\x00\x04\x08\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x0e\x02\x00\x0d\x00\x2c\x10\x03\x00\x01\x23\x86\x00\x00\xf0\x78\x00\x01\x23\x90\x00\x00\xf0\x78\x00\x01\x23\x90\x00\x01\x05\xfe\x00\x01\x23\x86\x00\x01\x05\xfe\x00\x01\x23\x86\x00\x00\xf0\x78\x00\x04\x11\x00' |
| |
| # PADISOR label at (67.45um 64.22um) size 0.3um on MET3PIN |
| add_data_9 = b'\x00\x04\x0c\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x16\x02\x00\x05\x00\x06\x17\x01\x00\x05\x00\x06\x1a\x01\x00\x00\x00\x0c\x1b\x05\x40\x4c\x66\x66\x66\x66\x66\x66\x00\x0c\x10\x03\x00\x01\x07\x7a\x00\x00\xfa\xdc\x00\x0c\x19\x06\x50\x41\x44\x49\x53\x4f\x52\x00\x00\x04\x11\x00' |
| |
| # PADISOL label at (5.05um 64.22um) size 0.3um on MET3PIN |
| add_data_10 = b'\x00\x04\x0c\x00\x00\x06\x0d\x02\x00\x46\x00\x06\x16\x02\x00\x05\x00\x06\x17\x01\x00\x05\x00\x06\x1a\x01\x00\x00\x00\x0c\x1b\x05\x40\x4c\x66\x66\x66\x66\x66\x66\x00\x0c\x10\x03\x00\x00\x13\xba\x00\x00\xfa\xdc\x00\x0c\x19\x06\x50\x41\x44\x49\x53\x4f\x4c\x00\x00\x04\x11\x00' |
| |
| # Append metal resistors after this data (between 69:16 and 69:44) |
| orig_data_1 = b'\x00\x00\x00\x00\x00\x00\xad\x98\x00\x00\x01\x45\x00\x00\x86\x88\x00\x00\x01\x45\x00\x00\x86\x88\x00\x00\x00\x00\x00\x04\x11\x00' |
| |
| # Append port label after this data (after "P_CORE" label) |
| orig_data_2 = b'\x00\x0c\x10\x03\x00\x00\xf5\x0a\x00\x00\x08\x7f\x00\x0a\x19\x06\x50\x5f\x43\x4f\x52\x45\x00\x04\x11\x00' |
| |
| # This is not efficient, but only needs to be done once. |
| |
| with open(file_name, 'rb') as ifile: |
| data = ifile.read() |
| data = data.replace(orig_data_1, orig_data_1 + add_data_1 + add_data_2 + add_data_3 + add_data_4 + add_data_5 + add_data_6 + add_data_7 + add_data_8) |
| data = data.replace(orig_data_2, orig_data_2 + add_data_9 + add_data_10) |
| |
| # Write back into the same file |
| with open(file_name, 'wb') as ofile: |
| ofile.write(data) |
| |
| print("Done!") |