| #!/usr/bin/env python3 |
| |
| import hashlib |
| import os |
| import pprint |
| import subprocess |
| import sys |
| import time |
| import traceback |
| |
| |
| def update_image(imagename, srcfilename): |
| |
| tags = { |
| 'Author': 'SkyWater PDK Authors', |
| 'Copyright': 'SPDX-License-Identifier: Apache-2.0', |
| } |
| if os.path.exists(srcfilename): |
| sha1sum = hashlib.sha1(open(srcfilename, 'rb').read()).hexdigest() |
| source_cmt = "{1} {0}".format(os.path.basename(srcfilename), sha1sum) |
| tags['Source'] = source_cmt |
| |
| tmpfile = imagename+'.tmp.png' |
| if os.path.exists(tmpfile): |
| os.unlink(tmpfile) |
| |
| cmd = ['exiftool'] |
| cmd.append('-o') |
| cmd.append(tmpfile) |
| for tag, v in tags.items(): |
| cmd.append('-{}="{}"'.format(tag, v)) |
| cmd.append(imagename) |
| success = False |
| for i in range(0, 10): |
| p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
| output, _ = p.communicate() |
| output = output.decode('utf-8') |
| if p.returncode != 0: |
| if 'Temporary file already exists' in output: |
| print(time.now(), "Temporary file collision (trying again):", imagename, flush=True) |
| time.sleep(1) |
| continue |
| msg = 'Failed to update metadata for {}'.format(imagename) |
| sys.stderr.write(msg) |
| sys.stderr.write('\n') |
| sys.stderr.write('-'*75) |
| sys.stderr.write('\n') |
| sys.stderr.write(output) |
| sys.stderr.write('-'*75) |
| sys.stderr.write('\n') |
| sys.stderr.flush() |
| raise IOError(msg) |
| success = True |
| break |
| if not success: |
| msg = 'Unknown error, failed to update metadata for {}'.format(imagename) |
| sys.stderr.write(msg) |
| sys.stderr.write('\n') |
| sys.stderr.flush() |
| raise IOError(msg) |
| os.rename(tmpfile, imagename) |
| |
| |
| def update_schematic(pathname): |
| assert pathname.endswith("sch.png"), pathname |
| # sky130_fd_sc_hs__clkbuf.sch.png |
| # sky130_fd_sc_hs__clkbuf.simple.v |
| vsrc = pathname.replace('.sch.png', '.full.v') |
| update_image(pathname, vsrc) |
| |
| |
| def update_module(pathname): |
| # sky130_fd_sc_hs__clkbuf.module.png |
| # sky130_fd_sc_hs__clkbuf.blackbox.v |
| vsrc = pathname.replace('.module.png', '.full.v') |
| update_image(pathname, vsrc) |
| |
| |
| def main(argv): |
| errors = [] |
| for f in argv: |
| pathname = os.path.abspath(f) |
| assert os.path.exists(pathname), pathname |
| try: |
| if pathname.endswith("sch.png"): |
| update_schematic(pathname) |
| elif pathname.endswith("module.png"): |
| update_module(pathname) |
| else: |
| raise ValueError("Can't process {}".format(pathname)) |
| print("Added image metadata to", pathname, flush=True) |
| except Exception as e: |
| msg = traceback.format_exc() |
| print('Failure while processing:', pathname, file=sys.stderr) |
| sys.stderr.write(msg) |
| sys.stderr.flush() |
| errors.append(msg) |
| if errors: |
| return len(errors) |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| try: |
| sys.exit(main(sys.argv[1:])) |
| except Exception as e: |
| import traceback |
| traceback.print_exc() |
| sys.exit(1) |