Source code for run_gpg

#!/usr/bin/env python

"""
configure and run gpg on uut
run_gpg.py [opts] uut

usage: run_gpg.py [-h] [--trg TRG] [--clk CLK] [--mode MODE]
                  [--disable DISABLE] [--stl STL] [--waterfall WATERFALL]
                  [--trace TRACE] [--hdmi_master HDMI_MASTER]
                  uut

run_gpg

positional arguments:
  uut                   uut

optional arguments:
  -h, --help            show this help message and exit
  --trg TRG             trigger fp|soft|softloop|softonce
  --clk CLK             clk int|dX|notouch
  --mode MODE           mode
  --disable DISABLE     1: disable
  --stl STL             stl file
  --waterfall WATERFALL
                        d0,d1,d2,d3 waterfall [interval,hitime]
  --trace TRACE         trace wire protocol
  --hdmi_master HDMI_MASTER
                        clk, trg and gpg drive HDMI outputs
"""

from __future__ import division
import acq400_hapi
import argparse
import re
from builtins import input


[docs]def gen_stl(uut, pulse_train, args): stl = "" hi_time = int((int(pulse_train[1]) / int(pulse_train[3])) * 1000) # in us lo_time = int((int(pulse_train[2]) / int(pulse_train[3])) * 1000) # in us dx = str(pulse_train[0]) td = 0 # gpg tick down for line in range(0, int(pulse_train[3])): tu = str(int(td) + lo_time) # tick up after low time td = str(int(tu) + hi_time) # tick down after high time stl = stl + tu + "," + dx + "\n" + td + ",0" + "\n" if args.verbose: print("STL generated: ") print(stl) uut.load_gpg(stl, uut.s0.trace)
[docs]def load_stl(uut, stl): with open(stl, 'r') as fp: uut.load_gpg(fp.read(), uut.s0.trace)
[docs]def make_waterfall(uut, interval, hitime, states): stl = '' on = True cursor = interval for s in states: if on: stl += '%d,%d\n' % (cursor, s) on = False else: stl += '%d,%d\n' % (cursor+hitime, s) cursor += interval on = True uut.load_gpg(stl, uut.s0.trace)
[docs]def soft_trigger_loop(uut): while True: key = input("trigger>") if key == '': uut.s0.soft_trigger = 1 else: break
[docs]def set_hdmi_master(uut): uut.s0.SIG_SYNC_OUT_CLK = 'CLK' # CLK d0 output uut.s0.SIG_SYNC_OUT_CLK_DX = 'd0' # uut.s0.SIG_SYNC_OUT_TRG = 'TRG' # SOFT TRIGGER d1 uut.s0.SIG_SYNC_OUT_TRG_DX = 'd1' # uut.s0.SIG_SYNC_OUT_TRG = 'GPG' # trigger from gpg OUT # uut.s0.SIG_SYNC_OUT_TRG_DX = 'd0' uut.s0.SIG_SYNC_OUT_SYNC = 'GPG' # GPG d1 uut.s0.SIG_SYNC_OUT_SYNC_DX = 'd1' # GPG 0x2 uut.s0.SIG_SYNC_OUT_GPIO = 'GPG' uut.s0.SIG_SYNC_OUT_GPIO_DX = 'd2' # GPG 0x4
[docs]def run_gpg(args): uut = acq400_hapi.Acq400(args.uut[0]) uut.s0.trace = args.trace uut.s0.GPG_ENABLE = '0' if args.clk == 'notouch': print("leave clk untouched") elif args.clk == 'int': uut.s0.gpg_clk=0,0,0 elif args.clk == 'fp': uut.s0.SYS_CLK_FPMUX = 'FPCLK' uut.s0.gpg_clk='1,0,0' else: # clk=dX uut.s0.gpg_clk='1,{},1'.format(args.clk[1:]) if args.stl != 'none': load_stl(uut, args.stl) elif args.waterfall != 'none': (interval, hitime) = [int(s) for s in re.findall(r'\d+', args.waterfall)] make_waterfall(uut, interval, hitime, [1, 0, 2, 0, 4, 0, 8, 0]) elif args.pulse_train != 'none': args.pulse_train = args.pulse_train.split(",") gen_stl(uut, args.pulse_train, args) # assume GPG drives 4 lines.. for dx in [0, 1, 2, 3]: uut.s0.set_knob('SIG_EVENT_SRC_{}'.format(dx), 'GPG') if args.hdmi_master == 1: set_hdmi_master(uut) uut.s0.gpg_trg='1,{},1'.format(1 if args.trg.startswith('soft') else 0) uut.s0.GPG_MODE=args.mode if args.disable != 1: uut.s0.GPG_ENABLE = '1' if args.trg == 'softloop': soft_trigger_loop(uut) if args.trg == 'softonce': uut.s0.soft_trigger = '1'
[docs]def run_main(): parser = argparse.ArgumentParser(description='run_gpg') parser.add_argument('--trg', default='soft', type=str, help="trigger fp|soft|softloop|softonce") parser.add_argument('--clk', default='int', type=str, help='clk int|dX|notouch') parser.add_argument('--mode', default='LOOPWAIT', type=str, help='mode') parser.add_argument('--disable', default=0, type=int, help='1: disable') parser.add_argument('--stl', default='none', type=str, help='stl file') parser.add_argument('--waterfall', default='none', help='d0,d1,d2,d3 waterfall [interval,hitime]') parser.add_argument('--pulse_train', default='none', help='0,10,10,50 | dx,on-msec,off-msec,count') parser.add_argument('--trace', type=int, default=0, help='trace wire protocol') parser.add_argument('--hdmi_master', type=int, default=0, help='clk, trg and gpg drive HDMI outputs') parser.add_argument('--verbose', type=int, default=0, help='Print extra debug info.') parser.add_argument('uut', nargs=1, help="uut") run_gpg(parser.parse_args())
# execution starts here if __name__ == '__main__': run_main()