DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
design.py
Go to the documentation of this file.
1from __future__ import print_function
2
3# Python imports
4import uhal
5import click
6import click_didyoumean
7import time
8import collections
9import math
10import timing
11import traceback
12import sys
13import random
14from io import StringIO
15
16# PDT imports
17import timing.cli.toolbox as toolbox
18import timing.common.definitions as defs
19
20from click import echo, style, secho
21from os.path import join, expandvars, basename
22from timing.core import SI534xSlave, I2CExpanderSlave
23
24from timing.common.definitions import kBoardSim, kBoardFMC, kBoardPC059, kBoardMicrozed, kBoardTLU
25from timing.common.definitions import kCarrierEnclustraA35, kCarrierKC705, kCarrierMicrozed
26from timing.common.definitions import kDesignMaster, kDesignOuroboros, kDesignOuroborosSim, kDesignEndpoint, kDesignFanout, kDesignOverlord, kDesignGaia, kDesignBoreas, kDesignKerberos, kDesignChronos, kDesignFanout
27from timing.common.definitions import kBoardNameMap, kCarrierNameMap, kDesignNameMap, IRIGEpoch, TimestampSource, ClockSource, kFreeRun, kInput0, kInput1, kInput2, kInput3, kUpstream, kSoftware
28from timing.common.definitions import kLibrarySupportedBoards, kLibrarySupportedDesigns
29
30from timing.common.toolbox import format_firmware_version
31# ------------------------------------------------------------------------------
32# __ ___ __
33# / |/ /__ ____ / /____ ____
34# / /|_/ / _ `(_-</ __/ -_) __/
35# /_/ /_/\_,_/___/\__/\__/_/
36
37
38@click.group('design', invoke_without_command=True)
39@click.pass_obj
40@click.argument('device', callback=toolbox.validate_device, shell_complete=toolbox.completeDevices)
41def design(obj, device):
42 '''
43 Timing master commands.
44
45 DEVICE: uhal device identifier
46 '''
47 lDevice = obj.mConnectionManager.getDevice(str(device))
48 if obj.mTimeout:
49 lDevice.setTimeoutPeriod(obj.mTimeout)
50
51 echo('Created device ' + click.style(lDevice.id(), fg='blue'))
52
53 lTopDesign = lDevice.getNode('')
54
55 lBoardInfo = toolbox.readSubNodes(lDevice.getNode('io.config'), False)
56 lDevice.dispatch()
57
58 echo("Design '{}' on board '{}' on carrier '{}' with frequency {} MHz".format(
59 style(kDesignNameMap[lBoardInfo['design_type'].value()], fg='blue'),
60 style(kBoardNameMap[lBoardInfo['board_type'].value()], fg='blue'),
61 style(kCarrierNameMap[lBoardInfo['carrier_type'].value()], fg='blue'),
62 style(str(lBoardInfo['clock_frequency'].value()/1e6), fg='blue')
63 ))
64
65 if lBoardInfo['board_type'].value() in kLibrarySupportedBoards and lBoardInfo['design_type'].value() in kLibrarySupportedDesigns:
66 lVersion = lTopDesign.read_firmware_version()
67 lTopDesign.validate_firmware_version()
68
69 try:
70 echo(lDevice.getNode('io').get_hardware_info())
71 except:
72 secho("Failed to retrieve hardware information! I2C issue? Initial board reset needed?", fg='yellow')
73 e = sys.exc_info()[0]
74 secho("Error: {}".format(e), fg='red')
75
76 echo("FW rev: {}".format(
77 style(format_firmware_version(lVersion), fg='cyan'),
78 ))
79
80 obj.mDevice = lDevice
81 obj.mTopDesign = lTopDesign
82
83 obj.mBoardType = lBoardInfo['board_type'].value()
84 obj.mCarrierType = lBoardInfo['carrier_type'].value()
85 obj.mDesignType = lBoardInfo['design_type'].value()
86# ------------------------------------------------------------------------------
87
88# ------------------------------------------------------------------------------
89@design.command('status', short_help="Print master status")
90@click.pass_obj
91def status(obj):
92
93 lTopDesign = obj.mTopDesign
94 echo(lTopDesign.get_status())
95# ------------------------------------------------------------------------------
96
97# ------------------------------------------------------------------------------
98@design.command('cdr-switch', short_help="switch upstream CDR")
99@click.argument('mux', type=int)
100@click.pass_obj
101def cdrswitch(obj, mux):
102
103 lTopDesign = obj.mTopDesign
104 lTopDesign.switch_mux(mux)
105 active_mux=lTopDesign.read_active_mux()
106
107 echo(f"cdr mux set to {active_mux}")
108# ------------------------------------------------------------------------------
109
110# ------------------------------------------------------------------------------
111@design.command('cdr-status', short_help="Print upstream CDR status")
112@click.option('--id', type=int)
113@click.pass_obj
114@click.pass_context
115def cdrstatus(ctx, obj, id):
116
117 if id is None:
118 cdr_node = obj.mDevice.getNode('cdr')
119 else:
120 cdr_node = obj.mDevice.getNode(f"cdr{id}")
121
122 echo(cdr_node.get_status())
123# ------------------------------------------------------------------------------
124
125# ------------------------------------------------------------------------------
126@design.command('cdr-resync', short_help="Resync upstream CDR")
127@click.option('--id', type=int)
128@click.pass_obj
129@click.pass_context
130def cdrresync(ctx, obj, id):
131
132 if id is None:
133 cdr_node = obj.mDevice.getNode('cdr')
134 else:
135 cdr_node = obj.mDevice.getNode(f"cdr{id}")
136
137 cdr_node.resync()
138
139 time.sleep(0.5)
140
141 ctx.forward(cdrstatus)
142# ------------------------------------------------------------------------------
143
144# ------------------------------------------------------------------------------
145@design.command('switch-timing-source', short_help="switch timing source")
146@click.argument('source', type=int)
147@click.pass_obj
148def cdrswitch(obj, source):
149
150 lTopDesign = obj.mTopDesign
151 lTopDesign.switch_timing_source_mux(source)
152 active_source=lTopDesign.read_active_timing_source_mux()
153
154 echo(f"timing source mux set to {active_source}")
155# ------------------------------------------------------------------------------
156
157# ------------------------------------------------------------------------------
158@design.command('configure', short_help="configure a whole design")
159@click.option('--clock-source', type=click.Choice(ClockSource.__members__.keys()))
160@click.option('--ts-source', type=click.Choice(TimestampSource.__members__.keys()))
161@click.option('--epoch', type=click.Choice(IRIGEpoch.__members__.keys()))
162@click.pass_obj
163def configure(obj, clock_source, ts_source, epoch):
164
165 lTopDesign = obj.mTopDesign
166 lDesignType = obj.mDesignType
167 lDesignName=kDesignNameMap[lDesignType]
168
169 # user convenience
170 if clock_source is None:
171 if lDesignType in [kDesignMaster, kDesignBoreas, kDesignOuroboros, kDesignOuroborosSim]:
172 lClockSource=kFreeRun
173 lTimestampSource=kSoftware
174 elif lDesignType in [kDesignEndpoint, kDesignChronos, kDesignFanout]:
175 lClockSource=kInput1
176 elif lDesignType in [kDesignGaia, kDesignKerberos]:
177 lClockSource=kInput0
178 lTimestampSource=kUpstream
179 else:
180 secho("Unable to match a default clock source for design {}.\nConfigure failed!".format(lDesignName), fg='red')
181 return
182 else:
183 lClockSource=ClockSource.__members__[clock_source]
184
185 if ts_source is None:
186 if lDesignType in [kDesignMaster, kDesignBoreas, kDesignOuroboros, kDesignOuroborosSim]:
187 lTimestampSource=kSoftware
188 elif lDesignType in [kDesignGaia, kDesignKerberos]:
189 lTimestampSource=kUpstream
190 elif lDesignType not in [kDesignEndpoint, kDesignChronos, kDesignFanout]:
191 secho("Unable to match a default timestamp source for design {}.\nConfigure failed!".format(lDesignName), fg='red')
192 return
193 else:
194 lTimestampSource=TimestampSource.__members__[ts_source]
195
196 if lDesignType in [kDesignMaster, kDesignBoreas, kDesignGaia, kDesignKerberos]:
197 if lDesignType == kDesignGaia:
198 if epoch is not None:
199 lEpoch=IRIGEpoch.__members__[epoch]
200 lTopDesign.configure(lClockSource, lTimestampSource, lEpoch)
201 else:
202 secho("Supply irig option for design Gaia!", fg='red')
203 else:
204 lTopDesign.configure(lClockSource, lTimestampSource)
205 elif lDesignType in [kDesignEndpoint, kDesignChronos, kDesignFanout]:
206 lTopDesign.configure(lClockSource)
207 else:
208 secho("Configure not supported for design {}.\nConfigure failed!".format(lDesignName), fg='red')
209# ------------------------------------------------------------------------------
cdrswitch(obj, mux)
Definition design.py:101
configure(obj, clock_source, ts_source, epoch)
Definition design.py:163
cdrresync(ctx, obj, id)
Definition design.py:130
cdrstatus(ctx, obj, id)
Definition design.py:115