| """ Generate timing summary from Vivado timing.json output. """ | |
| import argparse | |
| import json | |
| def timing_summary(timing_json): | |
| setups = [] | |
| holds = [] | |
| for net in timing_json: | |
| for ipin in net['ipins']: | |
| if 'setup_timing_path' in ipin and ipin['setup_timing_path' | |
| ]['SLACK'] != "": | |
| setups.append(ipin) | |
| if 'hold_timing_path' in ipin and ipin['hold_timing_path']['SLACK' | |
| ] != "": | |
| holds.append(ipin) | |
| worst_setup_slack = min( | |
| setups, key=lambda setup: float(setup['setup_timing_path']['SLACK']) | |
| ) | |
| worst_hold_slack = min( | |
| holds, key=lambda hold: float(hold['hold_timing_path']['SLACK']) | |
| ) | |
| print( | |
| 'Worst setup slack: {} = {}'.format( | |
| worst_setup_slack['setup_timing_path']['NAME'], | |
| worst_setup_slack['setup_timing_path']['SLACK'] | |
| ) | |
| ) | |
| print( | |
| 'Worst hold slack: {} = {}'.format( | |
| worst_hold_slack['hold_timing_path']['NAME'], | |
| worst_hold_slack['hold_timing_path']['SLACK'] | |
| ) | |
| ) | |
| def main(): | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| parser.add_argument('timing_json') | |
| args = parser.parse_args() | |
| with open(args.timing_json) as f: | |
| timing_json = json.load(f) | |
| timing_summary(timing_json) | |
| if __name__ == "__main__": | |
| main() |