mirror of https://github.com/m-labs/artiq.git
coredevice/analyzer: decode log messages
This commit is contained in:
parent
048dcbee92
commit
b5253e1353
|
@ -264,6 +264,59 @@ class DDSHandler:
|
||||||
self._decode_ad9914_write(message)
|
self._decode_ad9914_write(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_log_chars(data):
|
||||||
|
r = ""
|
||||||
|
for i in range(4):
|
||||||
|
n = data >> 24
|
||||||
|
data = (data << 8) & 0xffffffff
|
||||||
|
if not n:
|
||||||
|
return r
|
||||||
|
r += chr(n)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
class LogHandler:
|
||||||
|
def __init__(self, vcd_manager, vcd_log_channels):
|
||||||
|
self.vcd_channels = dict()
|
||||||
|
for name, maxlength in vcd_log_channels.items():
|
||||||
|
self.vcd_channels[name] = vcd_manager.get_channel("log/" + name,
|
||||||
|
maxlength*8)
|
||||||
|
self.current_entry = ""
|
||||||
|
|
||||||
|
def process_message(self, message):
|
||||||
|
if isinstance(message, OutputMessage):
|
||||||
|
message_payload = _extract_log_chars(message.data)
|
||||||
|
self.current_entry += message_payload
|
||||||
|
if len(message_payload) < 4:
|
||||||
|
channel_name, log_message = \
|
||||||
|
self.current_entry.split(":", maxsplit=1)
|
||||||
|
vcd_value = ""
|
||||||
|
for c in log_message:
|
||||||
|
vcd_value += "{:08b}".format(ord(c))
|
||||||
|
self.vcd_channels[channel_name].set_value(vcd_value)
|
||||||
|
self.current_entry = ""
|
||||||
|
|
||||||
|
|
||||||
|
def get_vcd_log_channels(log_channel, messages):
|
||||||
|
vcd_log_channels = dict()
|
||||||
|
log_entry = ""
|
||||||
|
for message in messages:
|
||||||
|
if (isinstance(message, OutputMessage)
|
||||||
|
and message.channel == log_channel):
|
||||||
|
message_payload = _extract_log_chars(message.data)
|
||||||
|
log_entry += message_payload
|
||||||
|
if len(message_payload) < 4:
|
||||||
|
channel_name, log_message = log_entry.split(":", maxsplit=1)
|
||||||
|
l = len(log_message)
|
||||||
|
if channel_name in vcd_log_channels:
|
||||||
|
if vcd_log_channels[channel_name] < l:
|
||||||
|
vcd_log_channels[channel_name] = l
|
||||||
|
else:
|
||||||
|
vcd_log_channels[channel_name] = l
|
||||||
|
log_entry = ""
|
||||||
|
return vcd_log_channels
|
||||||
|
|
||||||
|
|
||||||
def get_ref_period(devices):
|
def get_ref_period(devices):
|
||||||
ref_period = None
|
ref_period = None
|
||||||
for desc in devices.values():
|
for desc in devices.values():
|
||||||
|
@ -278,7 +331,7 @@ def get_ref_period(devices):
|
||||||
|
|
||||||
|
|
||||||
def create_channel_handlers(vcd_manager, devices, ref_period,
|
def create_channel_handlers(vcd_manager, devices, ref_period,
|
||||||
log_channel, dds_channel, dds_onehot_sel):
|
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":
|
||||||
|
@ -321,13 +374,16 @@ def decoded_dump_to_vcd(fileobj, devices, dump):
|
||||||
logger.warning("unable to determine core device ref_period")
|
logger.warning("unable to determine core device ref_period")
|
||||||
ref_period = 1e-9 # guess
|
ref_period = 1e-9 # guess
|
||||||
|
|
||||||
|
messages = sorted(dump.messages, key=get_message_time)
|
||||||
|
|
||||||
channel_handlers = create_channel_handlers(
|
channel_handlers = create_channel_handlers(
|
||||||
vcd_manager, devices, ref_period,
|
vcd_manager, devices, ref_period,
|
||||||
dump.log_channel, dump.dds_channel, dump.dds_onehot_sel)
|
dump.dds_channel, dump.dds_onehot_sel)
|
||||||
|
vcd_log_channels = get_vcd_log_channels(dump.log_channel, messages)
|
||||||
|
channel_handlers[dump.log_channel] = LogHandler(vcd_manager, vcd_log_channels)
|
||||||
slack = vcd_manager.get_channel("rtio_slack", 64)
|
slack = vcd_manager.get_channel("rtio_slack", 64)
|
||||||
|
|
||||||
vcd_manager.set_time(0)
|
vcd_manager.set_time(0)
|
||||||
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:
|
||||||
|
|
Loading…
Reference in New Issue