forked from M-Labs/artiq
analyzer: encapsulate decoded dump, get onehot sel from header
This commit is contained in:
parent
4be5df9802
commit
e41e2c088d
|
@ -57,10 +57,14 @@ def decode_message(data):
|
||||||
ExceptionType(exception_type))
|
ExceptionType(exception_type))
|
||||||
|
|
||||||
|
|
||||||
|
DecodedDump = namedtuple(
|
||||||
|
"DecodedDump", "log_channel dds_channel dds_onehot_sel messages")
|
||||||
|
|
||||||
|
|
||||||
def decode_dump(data):
|
def decode_dump(data):
|
||||||
parts = struct.unpack(">IQbbbb", data[:16])
|
parts = struct.unpack(">IQbbbb", data[:16])
|
||||||
(sent_bytes, total_byte_count,
|
(sent_bytes, total_byte_count,
|
||||||
overflow_occured, log_channel, dds_channel, _) = parts
|
overflow_occured, log_channel, dds_channel, dds_onehot_sel) = parts
|
||||||
|
|
||||||
if sent_bytes + 16 != len(data):
|
if sent_bytes + 16 != len(data):
|
||||||
raise ValueError("analyzer dump has incorrect length")
|
raise ValueError("analyzer dump has incorrect length")
|
||||||
|
@ -76,7 +80,9 @@ def decode_dump(data):
|
||||||
for _ in range(sent_bytes//32):
|
for _ in range(sent_bytes//32):
|
||||||
messages.append(decode_message(data[position:position+32]))
|
messages.append(decode_message(data[position:position+32]))
|
||||||
position += 32
|
position += 32
|
||||||
return messages, log_channel, dds_channel
|
return DecodedDump(log_channel,
|
||||||
|
dds_channel, bool(dds_onehot_sel),
|
||||||
|
messages)
|
||||||
|
|
||||||
|
|
||||||
def vcd_codes():
|
def vcd_codes():
|
||||||
|
@ -255,7 +261,8 @@ def get_timescale(devices):
|
||||||
return timescale
|
return timescale
|
||||||
|
|
||||||
|
|
||||||
def create_channel_handlers(vcd_manager, devices, log_channel, dds_channel):
|
def create_channel_handlers(vcd_manager, devices, log_channel,
|
||||||
|
dds_channel, dds_onehot_sel):
|
||||||
channel_handlers = dict()
|
channel_handlers = dict()
|
||||||
for name, desc in sorted(devices.items(), key=itemgetter(0)):
|
for name, desc in sorted(devices.items(), key=itemgetter(0)):
|
||||||
if isinstance(desc, dict) and desc["type"] == "local":
|
if isinstance(desc, dict) and desc["type"] == "local":
|
||||||
|
@ -274,10 +281,8 @@ def create_channel_handlers(vcd_manager, devices, log_channel, dds_channel):
|
||||||
if dds_handler.sysclk != sysclk:
|
if dds_handler.sysclk != sysclk:
|
||||||
raise ValueError("All DDS channels must have the same sysclk")
|
raise ValueError("All DDS channels must have the same sysclk")
|
||||||
else:
|
else:
|
||||||
# Assume AD9914 systems use one-hot selection signals
|
|
||||||
# TODO: move one-hot flag declarations into a single place
|
|
||||||
dds_handler = DDSHandler(vcd_manager, desc["class"],
|
dds_handler = DDSHandler(vcd_manager, desc["class"],
|
||||||
desc["class"] == "AD9914", sysclk)
|
dds_onehot_sel, sysclk)
|
||||||
channel_handlers[dds_channel] = dds_handler
|
channel_handlers[dds_channel] = dds_handler
|
||||||
dds_handler.add_dds_channel(name, dds_channel_ddsbus)
|
dds_handler.add_dds_channel(name, dds_channel_ddsbus)
|
||||||
return channel_handlers
|
return channel_handlers
|
||||||
|
@ -287,7 +292,7 @@ def get_message_time(message):
|
||||||
return getattr(message, "timestamp", message.rtio_counter)
|
return getattr(message, "timestamp", message.rtio_counter)
|
||||||
|
|
||||||
|
|
||||||
def messages_to_vcd(filename, devices, messages, log_channel, dds_channel):
|
def decoded_dump_to_vcd(filename, devices, dump):
|
||||||
vcd_manager = VCDManager(filename)
|
vcd_manager = VCDManager(filename)
|
||||||
try:
|
try:
|
||||||
timescale = get_timescale(devices)
|
timescale = get_timescale(devices)
|
||||||
|
@ -296,11 +301,12 @@ def messages_to_vcd(filename, devices, messages, log_channel, dds_channel):
|
||||||
else:
|
else:
|
||||||
logger.warning("unable to determine VCD timescale")
|
logger.warning("unable to determine VCD timescale")
|
||||||
|
|
||||||
channel_handlers = create_channel_handlers(vcd_manager, devices,
|
channel_handlers = create_channel_handlers(
|
||||||
log_channel, dds_channel)
|
vcd_manager, devices,
|
||||||
|
dump.log_channel, dump.dds_channel, dump.dds_onehot_sel)
|
||||||
|
|
||||||
vcd_manager.set_time(0)
|
vcd_manager.set_time(0)
|
||||||
messages = sorted(messages, key=get_message_time)
|
messages = sorted(dump.messages, key=get_message_time)
|
||||||
if messages:
|
if messages:
|
||||||
start_time = get_message_time(messages[0])
|
start_time = get_message_time(messages[0])
|
||||||
for message in messages:
|
for message in messages:
|
||||||
|
|
|
@ -6,7 +6,7 @@ import struct
|
||||||
from artiq.tools import verbosity_args, init_logger
|
from artiq.tools import verbosity_args, init_logger
|
||||||
from artiq.master.databases import DeviceDB
|
from artiq.master.databases import DeviceDB
|
||||||
from artiq.master.worker_db import DeviceManager
|
from artiq.master.worker_db import DeviceManager
|
||||||
from artiq.coredevice.analyzer import decode_dump, messages_to_vcd
|
from artiq.coredevice.analyzer import decode_dump, decoded_dump_to_vcd
|
||||||
|
|
||||||
|
|
||||||
def get_argparser():
|
def get_argparser():
|
||||||
|
@ -88,16 +88,15 @@ def main():
|
||||||
elif args.action == "cfg-erase":
|
elif args.action == "cfg-erase":
|
||||||
comm.flash_storage_erase()
|
comm.flash_storage_erase()
|
||||||
elif args.action == "analyzer-dump":
|
elif args.action == "analyzer-dump":
|
||||||
messages, log_channel, dds_channel = \
|
decoded_dump = decode_dump(comm.get_analyzer_dump())
|
||||||
decode_dump(comm.get_analyzer_dump())
|
|
||||||
if args.m:
|
if args.m:
|
||||||
print("Log channel:", log_channel)
|
print("Log channel:", decoded_dump.log_channel)
|
||||||
print("DDS channel:", dds_channel)
|
print("DDS channel:", decoded_dump.dds_channel)
|
||||||
for message in messages:
|
print("DDS one-hot:", decoded_dump.dds_onehot_sel)
|
||||||
|
for message in decoded_dump.messages:
|
||||||
print(message)
|
print(message)
|
||||||
if args.f:
|
if args.f:
|
||||||
messages_to_vcd(args.f, device_mgr.get_device_db(), messages,
|
decoded_dump_to_vcd(args.f, device_mgr.get_device_db(), decoded_dump)
|
||||||
log_channel, dds_channel)
|
|
||||||
finally:
|
finally:
|
||||||
device_mgr.close_devices()
|
device_mgr.close_devices()
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct analyzer_header {
|
||||||
unsigned char overflow_occured;
|
unsigned char overflow_occured;
|
||||||
unsigned char log_channel;
|
unsigned char log_channel;
|
||||||
unsigned char dds_channel;
|
unsigned char dds_channel;
|
||||||
unsigned char padding;
|
unsigned char dds_onehot_sel;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,7 +73,11 @@ void analyzer_start(void)
|
||||||
analyzer_header.overflow_occured = rtio_analyzer_message_encoder_overflow_read();
|
analyzer_header.overflow_occured = rtio_analyzer_message_encoder_overflow_read();
|
||||||
analyzer_header.log_channel = 0;
|
analyzer_header.log_channel = 0;
|
||||||
analyzer_header.dds_channel = CONFIG_RTIO_DDS_CHANNEL;
|
analyzer_header.dds_channel = CONFIG_RTIO_DDS_CHANNEL;
|
||||||
analyzer_header.padding = 0;
|
#ifdef DDS_ONEHOT_SEL
|
||||||
|
analyzer_header.dds_onehot_sel = 1;
|
||||||
|
#else
|
||||||
|
analyzer_header.dds_onehot_sel = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
offset_consumed = 0;
|
offset_consumed = 0;
|
||||||
offset_sent = 0;
|
offset_sent = 0;
|
||||||
|
|
Loading…
Reference in New Issue