|  | """ Utility for generating TCL script to launch simulation on Vivado | 
|  | """ | 
|  | import argparse | 
|  |  | 
|  |  | 
|  | def create_sim(f_out, args): | 
|  | print(""" | 
|  | launch_simulation | 
|  | """, file=f_out) | 
|  |  | 
|  | clock_pins = args.clock_pins.split(';') | 
|  | clock_periods = args.clock_periods.split(';') | 
|  | assert len(clock_pins) == len(clock_periods) | 
|  | for clock_pin, clock_period in zip(clock_pins, map(float, clock_periods)): | 
|  | print( | 
|  | """ | 
|  | add_force {{/{top}/{pin}}} -radix hex {{0 0ns}} {{1 {half_period}ns}} -repeat_every {period}ns | 
|  | """.format( | 
|  | top=args.top, | 
|  | pin=clock_pin, | 
|  | half_period=clock_period / 2.0, | 
|  | period=clock_period, | 
|  | ), | 
|  | file=f_out | 
|  | ) | 
|  |  | 
|  | print(""" | 
|  | restart | 
|  | run 1us | 
|  | run 1us | 
|  | """, file=f_out) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser(description=__doc__) | 
|  |  | 
|  | parser.add_argument('--top', help="Top-level module name.", required=True) | 
|  | parser.add_argument( | 
|  | '--clock_pins', | 
|  | help="Semi-colon seperated list of clock pins.", | 
|  | required=True | 
|  | ) | 
|  | parser.add_argument( | 
|  | '--clock_periods', | 
|  | help="Semi-colon seperated list of clock periods (in ns).", | 
|  | required=True | 
|  | ) | 
|  | parser.add_argument( | 
|  | '--output_tcl', help="Filename of output TCL file.", required=True | 
|  | ) | 
|  |  | 
|  | args = parser.parse_args() | 
|  | with open(args.output_tcl, 'w') as f: | 
|  | create_sim(f, args) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |