| """ 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() |