DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
align.py
Go to the documentation of this file.
1from __future__ import print_function
2import click
3import time
4from io import StringIO
5import traceback
6
7# PDT imports
8import timing.cli.toolbox as toolbox
9import timing.common.definitions as defs
10
11from click import echo, style, secho
12from timing.common.definitions import kBoardSim, kBoardFMC, kBoardPC059, kBoardMicrozed, kBoardTLU, kBoardFIB, kBoardMIB
13from timing.common.definitions import kCarrierEnclustraA35, kCarrierKC705, kCarrierMicrozed
14from timing.common.definitions import kDesignMaster, kDesignOuroboros, kDesignOuroborosSim, kDesignEndpoint, kDesignFanout
15from timing.common.definitions import kBoardNameMap, kCarrierNameMap, kDesignNameMap
16from timing.common.definitions import kLibrarySupportedBoards
17
18from .master import master
19
20# ------------------------------------------------------------------------------
21@master.group('align', short_help='Endpoint alignment command group.')
22@click.pass_obj
23def align(obj):
24 lDevice = obj.mDevice
25 lMaster = obj.mMaster
26 obj.mGlobal = lMaster.getNode('global')
27 #obj.mACmd = lMaster.getNode('acmd')
28 #obj.mEcho = lMaster.getNode('echo')
29 #bj.mIO = lDevice.getNode('io')
30# ------------------------------------------------------------------------------
31
32
33# ------------------------------------------------------------------------------
34@align.command('apply-delay', short_help="Send delay adjust command endpoint")
35@click.argument('addr', type=toolbox.IntRange(0x0,0xffff))
36@click.argument('cdelay', type=toolbox.IntRange(0x0,0xf))
37@click.argument('fdelay', type=toolbox.IntRange(0x0,0xfff))
38@click.option('--mux', '-m', type=click.IntRange(0,12), help='Mux select')
39@click.option('--force', '-f', is_flag=True, default=False, help='Skip RTT measurement')
40@click.pass_obj
41@click.pass_context
42def applydelay(ctx, obj, addr, cdelay, fdelay, mux, force):
43
44 lDevice = obj.mDevice
45 lBoardType = obj.mBoardType
46 lTopDesign = obj.mTopDesign
47
48 # Are we working with a board with a return path mux (i.e. a fanout board)?
49 if lBoardType in [kBoardPC059, kBoardFIB]:
50 if mux is None:
51 if force == True:
52 lTopDesign.apply_endpoint_delay(addr, cdelay, fdelay, 0, not force, True, 0)
53 else:
54 raise RuntimeError('MUX board: please supply an SFP mux channel')
55 else:
56 lTopDesign.apply_endpoint_delay(addr, cdelay, fdelay, 0, not force, True, mux)
57
58 else:
59 lTopDesign.apply_endpoint_delay(addr, cdelay, fdelay, 0, not force, True)
60# ------------------------------------------------------------------------------
61
62
63# ------------------------------------------------------------------------------
64@align.command('measure-delay', short_help="Measure endpoint round trip time")
65@click.argument('addr', type=toolbox.IntRange(0x0,0xffff))
66@click.option('--mux', '-m', type=click.IntRange(0,12), help='Mux select (fanout only)')
67@click.option('--sfp-control/--no-sfp-control', default=True, help='Control SFP or not')
68@click.pass_obj
69@click.pass_context
70def measuredelay(ctx, obj, addr, mux, sfp_control):
71
72 lDevice = obj.mDevice
73 lBoardType = obj.mBoardType
74 lTopDesign = obj.mTopDesign
75
76 # or a different type of fanout board
77 if lBoardType in [kBoardPC059, kBoardFIB] and sfp_control == True:
78 if mux is not None:
79 echo("Endpoint (adr: {}, mux: {}) RTT: {}".format(addr,mux,lTopDesign.measure_endpoint_rtt(addr, sfp_control, mux)))
80 else:
81 raise RuntimeError('MUX board: please supply an SFP mux channel')
82 else:
83 echo("Endpoint (adr: {}) RTT: {}".format(addr,lTopDesign.measure_endpoint_rtt(addr, sfp_control)))
84# ------------------------------------------------------------------------------
85
86
87# ------------------------------------------------------------------------------
88@align.command('toggle-tx', short_help="Control the endpoint SFP Tx laser")
89@click.argument('addr', type=toolbox.IntRange(0x0,0xffff))
90@click.option('--on/--off', default=True, help='enable/disable tx')
91@click.pass_obj
92def toggletx(obj, addr, on):
93
94 lMaster = obj.mMaster
95 lMaster.switch_endpoint_sfp(addr, on)
96# ------------------------------------------------------------------------------
97
98
99# ------------------------------------------------------------------------------
100@align.command('scan-mux', short_help="Scan SFP mux for transmitting SFPs")
101@click.pass_obj
102def scanmux(obj):
103
104 lDevice = obj.mDevice
105 lTopDesign = obj.mTopDesign
106 lBoardType = obj.mBoardType
107
108 if lBoardType in [kBoardPC059, kBoardFIB]:
109 lTopDesign.scan_sfp_mux()
110 else:
111 raise RuntimeError('Mux scan is only available on MUX boards')
112# ------------------------------------------------------------------------------
113
114
115# ------------------------------------------------------------------------------
116@align.command('switch-n-lock', short_help="Wait for RTT endpoint to become ready")
117@click.option('--mux', '-m', type=click.IntRange(0,12), help='Mux select (fanout only)')
118@click.pass_obj
119def switchnlock(obj, mux):
120
121 lDevice = obj.mDevice
122 lTopDesign = obj.mTopDesign
123 lBoardType = obj.mBoardType
124 lMaster = obj.mMaster
125
126 # or a different type of fanout board
127 if lBoardType in [kBoardPC059, kBoardFIB]: #TODO: don't include fib v2
128 if mux is not None:
129 lTopDesign.switch_mux(mux)
130 lMaster.enable_upstream_endpoint()
131 else:
132 raise RuntimeError('MUX board: please supply an SFP mux channel')
133 else:
134 lMaster.enable_upstream_endpoint()
135# ------------------------------------------------------------------------------
measuredelay(ctx, obj, addr, mux, sfp_control)
Definition align.py:70
toggletx(obj, addr, on)
Definition align.py:92
switchnlock(obj, mux)
Definition align.py:119
applydelay(ctx, obj, addr, cdelay, fdelay, mux, force)
Definition align.py:42