def run_capture(args): uuts = [acq400_hapi.Acq2106(u, has_dsp=True) for u in args.uuts] shot = set_next_shot(args, even, "Cap") for u in uuts: u.s0.transient = "POST={} SOFT_TRIGGER=0".format(args.post) if args.trg == "ext rising" or args.trg == "ext": u.s1.trg = "1,0,1" elif args.trg == "ext falling": u.s1.trg = "1,0,0" for u in uuts: u.s0.set_arm = '1' for u in uuts: u.statmon.wait_armed() if args.trg == "int": # again, not really parallel for u in uuts: print("trigger") u.s0.soft_trigger = '1' for u in uuts: u.statmon.wait_stopped() for u in uuts: u.s14.DSP_RESET = 1 time.sleep(0.1) u.s14.DSP_RESET = 0
def run_main(parser): uuts = [ acq400_hapi.Acq2106(addr) for addr in parser.uuts ] role = "master" for uut in uuts: if parser.trace: uut.s0.trace = 1 uut.s1.trace = 1 if role == "master": trg = "1,%d,%d" % (1 if parser.master_trg=="int" else 0, rf(parser.trg_edge)) uut.set_sync_routing_master() # ensure there are two values to unpack, provide a default for the 2nd value.. mtrg, edge = (parser.master_trg.split(',') + [ "rising" ])[:2] uut.set_master_trg(mtrg, edge, \ enabled = True if parser.master_trg=="int" else False) set_mb_clk(uut, parser.master_clk.split(',')) role = "slave" else: trg = "1,%d,%d" % (0, rf(parser.trg_edge)) uut.set_sync_routing_slave() uut.s0.SIG_TRG_EXT_RESET = '1' # self-clears uut.s1.trg = trg uut.s1.clk = '1,1,1' uut.s1.clkdiv = parser.clkdiv if parser.master_trg != "int": raw_input("say when") uuts[0].set_master_trg(mtrg, edge, enabled=True)
def wrpg_clkout_demo(args): uut = acq400_hapi.Acq2106(args.uut[0]) uut.s0.SIG_SYNC_OUT_CLK = 'CLK' uut.s0.SIG_SYNC_OUT_CLK_DX = 'd6' uut.s5.CLK = 'external' uut.s5.CLK_DX = 'd1' uut.s5.CLKDIV = args.clkdiv fset = freq(uut.s0.SIG_CLK_MB_FREQ)/args.clkdiv converged = False while not converged: fout = freq(uut.s0.SIG_CLK_S5_FREQ) converged = (fset/fout if fset < fout else fout/fset) > 0.95 print("set {:.0f} fout {:.0f} {}".\ format(fset, fout, "OK" if converged else "waiting..")) if args.loopback: uut.s0.SIG_SRC_CLK_0 = 'HDMI' if not uut.s0.SIG_SYNC_BUS_OUT_CABLE_DET: print("ERROR cable not connected") return converged = False while not converged: fin = freq(uut.s0.SIG_CLK_EXT_FREQ) converged = (fin/fout if fin < fout else fout/fin) > 0.95 print("out {:.0f} back {:.0f} {}".\ format(fout, fin, "OK" if converged else "waiting.."))
def reset_counters_serial(args): uuts = [acq400_hapi.Acq2106(u) for u in args.uuts] sites = args.sites.split(',') print sites for uut in uuts: for s in sites: reset1(uut, s)
def run_main(args): uuts = [ acq400_hapi.Acq2106(addr) for addr in args.uuts ] uut = uuts[0] print("llc-test-harness-ai4-dio32.py uut {}".format(uut.uut)) clear_counters(uuts) init_ai(uut) init_do(uut)
def wrtd_test(args): args.uuts = [ acq400_hapi.Acq2106(u, has_comms=False, has_wr=True) for u in args.uut ] args.master = args.uuts[0] args.master.s0.WR_TRG = "OFF" args.master.cC.WRTD_TX = '1' args.master.cC.WRTD_DELTA_NS = args.wrtd_delta_ns args.master.cC.wrtd_commit_tx = '1' for u in args.uuts: if args.wrtd_txi: u.cC.WRTD_TX = '0' u.cC.wrtd_commit_tx = '1' u.cC.WR_TS_RESET = '1' u.cC.WR_WRTT0_RESET = '1' try: time.sleep(1) if not args.wrtd_txi: args.master.s0.WR_TRG = "ON" for tick in range(0, args.sleep * 2): time.sleep(0.5) if args.verbose == 2: for u in args.uuts: print("{} {}".format(u.uut, u.cC.WRTD_REPORT)) args.master.s0.WR_TRG = "OFF" ts_count = int(args.master.cC.WR_TS_COUNT.split(" ")[1]) else: ts_count = 0 for tick in range(0, args.sleep): args.master.cC.wrtd_txi = args.wrtd_txi if args.verbose == 1: print( "{}".format('|' if (tick + 1) % 10 == 0 else '.'), end='\n' if (tick + 1) % 50 == 0 or tick == args.sleep - 1 else '', flush=True) ts_count += 1 time.sleep(1) if args.verbose == 2: for u in args.uuts: print("{} {}".format(u.uut, u.cC.WRTD_REPORT)) except KeyboardInterrupt: if not args.wrtd_txi: args.master.s0.WR_TRG = "OFF" ts_count = int(args.master.cC.WR_TS_COUNT.split(" ")[1]) print("aborted by user") for u in args.uuts: wrtt0_count = int(u.cC.WR_WRTT0_COUNT.split(" ")[1]) print("{} WRTT0 {}/{} {}".format( u.uut, wrtt0_count, ts_count, "GOOD" if wrtt0_count == ts_count else "FAIL"))
def run_main(args): uuts = [acq400_hapi.Acq2106(addr) for addr in args.uuts] role = "master" for uut in uuts: sr = '{} {} {}'.format(role, args.fs, args.fclk) # print("ustc {} sync_role {} sr {}".format(uut, role, sr)) uut.s0.sync_role = sr role = "slave"
def run_main(args): uuts = [acq400_hapi.Acq2106(addr) for addr in args.uuts] print("initialise {} uuts {}".format(len(uuts), args.uuts)) clear_counters(uuts) init_clks(uuts[0]) for uut in uuts[0:]: init_ai(uut)
def run_shots(args): uut = acq400_hapi.Acq2106(args.uut[0], has_mgtdram=True) uut.s14.mgt_taskset = '1' for ii in range(0, args.loop): print("shot: %d" % (ii)) run_shot(uut, args) if args.wait_user: raw_input("hit return to continue")
def run_main(args): uuts = [acq400_hapi.Acq2106(addr) for addr in args.uuts] print("initialise {} uuts {}".format(len(uuts), args.uuts)) clear_counters(uuts) init_ai(uuts[0]) # if two boxes ASSUME second box AO if len(uuts) > 1: init_ao(uuts[1], slave=True) elif CONFIGAO != "0": print("init_ao {}".format(uuts[0].uut)) init_ao(uuts[0], slave=True)
def run_main(args): uuts = [acq400_hapi.Acq2106(addr) for addr in args.uuts] print("configure DAC route {} uuts {}".format(len(uuts), args.uuts)) # clear_counters(uuts) # init_ai(uuts[0]) # if two boxes ASSUME second box AO # if len(uuts) > 1: # init_ao(uuts[1], slave=True) # elif CONFIGAO != "0": # print("init_ao {}".format(uuts[0].uut)) # init_ao(uuts[0], slave=True) route_ao(uuts[0])
def reset_counters_threaded(args): uuts = [acq400_hapi.Acq2106(u) for u in args.uuts] sites = args.sites.split(',') print sites threads = [] for uut in uuts: for s in sites: t = threading.Thread(target=reset1, args=(uut, s)) threads.append(t) t.start() for t in threads: t.join()
def run_main(args): uuts = [acq400_hapi.Acq2106(addr) for addr in args.uuts] uutm = uuts[0] print("initialise {} uuts {}".format(len(uuts), args.uuts)) if args.clear_counters: clear_counters(uuts) else: print("clear_counters() commented out (slow)") init_clks(uuts) set_delay(uutm, args) for uut in uuts: init_ai(uut)
def run_shot(args): uut = acq400_hapi.Acq2106(args.uut[0]) config_shot(uut, args) init_comms(uut, args) init_work(uut, args) try: start_shot(uut, args) for ts in range(0, int(args.secs)): sys.stdout.write("Time ... %8d / %8d\r" % (ts, int(args.secs))) sys.stdout.flush() time.sleep(1) except KeyboardInterrupt: pass stop_shot(uut)
def run_main(parser): uuts = [ acq400_hapi.Acq2106(addr) for addr in parser.uuts ] role = "master" for uut in uuts: uut.s0.trace = parser.trace uut.s1.trace = parser.trace if role == "master": # ensure there are two values to unpack, provide a default for the 2nd value.. mtrg, edge = (parser.master_trg.split(',') + [ "rising" ])[:2] parser.trg_edge = edge set_mb_clk(uut, parser.master_clk.split(',')) # use Si5326 direct output where possible (almost always!) _clk_dx = "d2" if uut.s1.CLKDIV != 'CLKDIV 1' else "d1" uut.set_sync_routing_master( trg_dx="d2", clk_dx=_clk_dx) uut.set_master_trg(mtrg, edge) role = "slave" trg = "1,%d,%d" % (1 if mtrg=="soft" else 0, rf(edge)) clkdiv = parser.clkdiv uut.s1.CLKDIV = clkdiv # TODO: check if this works for thomson sync_trg_to_clk(uut) uut.s0.SIG_SYNC_OUT_CLK = "CLK" uut.s0.SIG_SYNC_OUT_CLK_DX = "d2" uut.s0.SIG_SYNC_OUT_TRG = "TRG" uut.s0.SIG_SYNC_OUT_TRG_DX = "d1" else: trg = "1,%d,%d" % (0, rf(parser.trg_edge)) clkdiv = 1 #clkdiv = parser.clkdiv # TODO: check if this works for thomson uut.set_sync_routing_slave() uut.s1.CLKDIV = clkdiv sync_trg_to_clk(uut, parser.slave_sync_trg_to_clk) #uut.s0.SIG_SRC_TRG_0 = "HDMI" uut.s0.SIG_TRG_EXT_RESET = '1' # self-clears. clear trigger count for easy ref uut.s1.trg = trg uut.s1.clk = '1,1,1' if parser.test: run_link_test(parser, uuts[0], uuts[1]) if not parser.master_trg.startswith("soft"): #input("say when") uuts[0].set_master_trg(mtrg, edge, enabled=True)
def run_main(): parser = argparse.ArgumentParser(description='host demux, host side data handling') parser.add_argument('--nchan', type=int, default=80) parser.add_argument('--nblks', type=int, default=-1) parser.add_argument('--save', type=str, default=None, help='save channelized data to dir') parser.add_argument('--src', type=str, default='/data', help='data source root') parser.add_argument('--cycle', type=str, default=None, help='cycle from rtm-t-stream-disk') parser.add_argument('--pchan', type=str, default=':', help='channels to plot') parser.add_argument('--egu', type=int, default=0, help='plot egu (V vs s)') parser.add_argument('--xdt', type=float, default=0, help='0: use interval from UUT, else specify interval ') parser.add_argument('--data_type', type=int, default=16, help='Use int16 or int32 for data demux.') parser.add_argument('--double_up', type=int, default=0, help='Use for ACQ480 two lines per channel mode') parser.add_argument('--plot_mpl', type=str, default="1:1000:1", help='Use MatPlotLib to plot subrate data args: start:stop[:step]') parser.add_argument('--stack_480', type=str, default=None, help='Stack : 2x4, 2x8, 4x8, 6x8') parser.add_argument('--drive_letter', type=str, default="D", help="Which drive letter to use when on windows.") parser.add_argument('uut', nargs=1, help='uut') args = parser.parse_args() calc_stack_480(args) args.WSIZE = 2 args.NSAM = 0 if args.data_type == 16: args.np_data_type = np.int16 args.WSIZE = 2 else: args.np_data_type = np.int32 args.WSIZE = 4 if os.name == "nt": # do this if windows system. args.uutroot = r"{}:\{}\{}".format(args.drive_letter, args.src, args.uut[0]) elif os.path.isdir(args.src): args.uutroot = r"{}/{}".format(args.src, args.uut[0]) print("uutroot {}".format(args.uutroot)) elif os.path.isfile(args.src): args.uutroot = "{}".format(os.path.dirname(args.src)) if args.save != None: if args.save.startswith("/"): args.saveroot = args.save else: if os.name != "nt": args.saveroot = r"{}/{}".format(args.uutroot, args.save) # ch 0.. (comp) args.pc_list = [ int(i)-1 for i in make_pc_list(args)] print("args.pc_list {}".format(args.pc_list)) if args.egu and args.uut: args.the_uut = acq400_hapi.Acq2106(args.uut[0]) process_data(args)
def run_mr(args): args.uuts = [ acq400_hapi.Acq2106(u, has_comms=False, has_wr=True) for u in args.uut ] tune_up_mt(args) shot_controller = acq400_hapi.ShotControllerWithDataHandler( args.uuts, args) if args.set_arm != 0: tee_up(args) shot_controller.run_shot(remote_trigger=args.rt) else: shot_controller.handle_data(args) if args.get_epics4: run_postprocess_command(args.get_epics4, args.uut) if args.get_mdsplus: run_postprocess_command(args.get_mdsplus, args.uut)
def config_auto(args, uut_def, dev_num): comms = check_link(uut_def, dev_num) uut_name = uut_def['name'] uut = acq400_hapi.Acq2106(uut_name) enum_sites(uut, uut_def) sod = True if 'sod' in uut_def['type'] else False matchup_json_file(uut, uut_def, uut_name) if len(uut.AISITES) != 0 or len(uut.DISITES) != 0: config_VI(args, uut, sod, comms) if len(uut.DOSITES) != 0 or len(uut.AOSITES) != 0 or len( uut.PWMSITES) != 0: config_VO(args, uut, uut.AISITES, comms) return None
def run_mr(args): args.uuts = [ acq400_hapi.Acq2106(u, has_comms=False, has_wr=True) for u in args.uut ] tune_up_mt(args) shot_controller = acq400_hapi.ShotControllerWithDataHandler( args.uuts, args) if args.set_arm != 0: tee_up(args) run_shot(args, shot_controller) else: shot_controller.handle_data(args) post_shot_checks(args) if args.get_epics4: run_epics_offload(args) if args.get_mdsplus: run_mdsplus_offload(args)
def run_main(parser): uuts = [acq400_hapi.Acq2106(addr) for addr in parser.uuts] role = "master" for uut in uuts: uut.s0.trace = parser.trace uut.s1.trace = parser.trace if role == "master": # ensure there are two values to unpack, provide a default for the 2nd value.. mtrg, edge = (parser.master_trg.split(',') + ["rising"])[:2] parser.trg_edge = edge uut.set_sync_routing_master( trg_dx="d1" if mtrg == "soft" else "d0", clk_dx="d2") uut.set_master_trg(mtrg, edge, enabled=True if mtrg == "soft" else False) set_mb_clk(uut, parser.master_clk.split(',')) role = "slave" trg = "1,%d,%d" % (1 if mtrg == "soft" else 0, rf(edge)) clkdiv = parser.clkdiv else: trg = "1,%d,%d" % (0, rf(parser.trg_edge)) clkdiv = 1 uut.set_sync_routing_slave() uut.s0.SIG_TRG_EXT_RESET = '1' # self-clears uut.s1.trg = trg uut.s1.clk = '1,1,1' uut.s1.clkdiv = clkdiv uut.s1.CLKDIV = clkdiv if parser.test: run_link_test(parser, uuts[0], uuts[1]) if not parser.master_trg.startswith("soft"): raw_input("say when") uuts[0].set_master_trg(mtrg, edge, enabled=True)
def run_shots(args): global LOG LOG = open("mgtdramshot-{}.log".format(args.uut[0]), "w") uut = acq400_hapi.Acq2106(args.uut[0], has_mgtdram=True) acq400_hapi.Acq400UI.exec_args(uut, args) uut.s14.mgt_taskset = '1' try: for ii in range(0, args.loop): t1 = datetime.datetime.now() print("shot: {} {}".format(ii, t1.strftime("%Y%m%d %H:%M:%S"))) run_shot(uut, args) t2 = datetime.datetime.now() print("shot: {} done in {} seconds\n\n".format(ii, (t2-t1).seconds)) if args.wait_user: input("hit return to continue") except KeyboardInterrupt: print("Keyboard Interrupt, take it all down NOW") os._exit(1) os._exit(0)
def run_shot(args): uut = acq400_hapi.Acq2106(args.uut[0]) if args.datahandler != None: cmd = args.datahandler.format(args.lport, args.nbuffers) print("datahandler command {}".format(cmd)) os.system(cmd) pollcat = 0 pid = get_data_pid(args) while pid == 0: time.sleep(1) pollcat += 1 if pollcat > 2: print("polling for datahandler active") pid = get_data_pid(args) print("datahandler pid {}".format(pid)) config_shot(uut, args) init_comms(uut, args) init_work(uut, args) start_shot(uut, args) if args.nowait == 0: wait_completion(uut, args)
def getUUT(self): import acq400_hapi uut = acq400_hapi.Acq2106(self.node.data(), has_wr=True) return uut
def acq2106_wr_reset(args): args.uuts = [ acq400_hapi.Acq2106(u, has_comms=False, has_wr=True) for u in args.uut ] for uut in args.uuts: uut.cC.WR_WRTT0_RESET = 1
def connect(args): args.uuts = [ acq400_hapi.Acq2106(u, has_comms=False, has_wr=True) for u in args.uutnames ]
#!/usr/bin/python -i import acq400_hapi import os import argparse import sys parser = argparse.ArgumentParser(description='configure acq400_abort') parser.add_argument('--sys', default=0, help="run in interpreter loop N times") parser.add_argument('uut', nargs='+', help="uut") args = parser.parse_args() #uuts = [ acq400_hapi.Acq400(u) for u in args.uut ] uuts = [acq400_hapi.Acq2106(u) for u in args.uut] uut = uuts[0] def sys1(cmd): if cmd.find("=") > 0: for u in uuts: exec('u.{}'.format(cmd)) else: for u in uuts: print("%s" % (eval('u.{}'.format(cmd)))) def sys(loop=1): while loop: sys1(raw_input(">")) loop -= 1
def config_auto(args, uut): # vector_len = AISITES = [] AOSITES = [] DIOSITES = [] uut = acq400_hapi.Acq2106(uut) for site in [1, 2, 3, 4, 5, 6]: try: module_name = eval('uut.s{}.module_name'.format(site)) if module_name.startswith('acq'): AISITES.append(site) elif module_name.startswith('ao'): AOSITES.append(site) elif module_name.startswith('dio'): DIOSITES.append(site) except Exception: continue if len(AISITES) != 0: config_aggregator(args, uut, AISITES, DIOSITES) # if len(AOSITES) != 0: # config_distributor(args, uut, AOSITES, DIO) if len(DIOSITES) != 0 or len(AOSITES) != 0: config_distributor(args, uut, DIOSITES, AOSITES, AISITES) config_sync_clk(uut) if args.us == 1: trg = uut.s1.trg.split(" ")[0].split("=")[1] uut.s0.spad1_us = trg # set the usec counter to the same as trg. if args.lat == 1: uut.s0.LLC_instrument_latency = 1 if args.cmd == 1: # Create and print a representitive cpucopy command. # We need to iterate over the sites as s0 NCHAN now includes the spad. TOTAL_SITES = AISITES + DIOSITES if args.include_dio_in_aggregator else AISITES print("DEBUG = ", TOTAL_SITES) aichan = sum([ int(getattr(getattr(uut, "s{}".format(site)), "NCHAN")) for site in AISITES ]) aochan = sum([ int(getattr(getattr(uut, "s{}".format(site)), "NCHAN")) for site in AOSITES ]) nshorts = (aichan) + (2 * len(DIOSITES)) DO32 = 1 if DIOSITES else 0 spad_longs = uut.s0.spad.split(",")[1] tcan_longs = uut.s0.distributor.split(" ")[3].split("=")[1] devnum = get_devnum(args, uut) command = "DUP1=0 NCHAN={} AOCHAN={} DO32={} SPADLONGS={} DEVNUM={}" \ " LLCONTROL/afhba-llcontrol-cpucopy" \ .format(nshorts, aochan, DO32, spad_longs, devnum) print("Outbound vector composition: {} short words of AI, " "{} longword(s) of DI, and {} longwords of SPAD.".format( aichan, DO32, spad_longs)) print("Inbound vector composition: {} short words of AO, " "{} longword(s) of DO, and {} longwords of TCAN.".format( aochan, DO32, tcan_longs)) print("The scratchpad will start at position {} in the vector. \n". format(int(nshorts / 2))) # print("\n", command, sep="") print("\n", command) return None
def reset2(uutname, sites): uut = acq400_hapi.Acq2106(uutname) for s in sites: reset1(uut, s)