예제 #1
0
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
예제 #2
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)       
예제 #3
0
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.."))
예제 #4
0
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)
예제 #6
0
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"))
예제 #7
0
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"
예제 #8
0
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)
예제 #9
0
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")
예제 #10
0
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)
예제 #11
0
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])
예제 #12
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()
예제 #13
0
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)
예제 #14
0
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)
예제 #15
0
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)       
예제 #16
0
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)
예제 #17
0
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)
예제 #18
0
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
예제 #19
0
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)
예제 #20
0
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)
예제 #21
0
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)
예제 #22
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)
예제 #23
0
 def getUUT(self):
     import acq400_hapi
     uut = acq400_hapi.Acq2106(self.node.data(), has_wr=True)
     return uut
예제 #24
0
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
예제 #25
0
def connect(args):
    args.uuts = [ acq400_hapi.Acq2106(u, has_comms=False, has_wr=True) for u in args.uutnames ]
예제 #26
0
#!/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
예제 #27
0
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
예제 #28
0
def reset2(uutname, sites):
    uut = acq400_hapi.Acq2106(uutname)
    for s in sites:
        reset1(uut, s)