544def stats(obj, sel_links, seconds, show_udp, show_buf):
545 """Simple program that greets NAME for a total of COUNT times."""
546
547 hrms = obj.hermes
548
549 mgts = list(range(hrms.n_mgt))
550
551
552 if not sel_links:
553 sel_links = mgts
554 else:
555 sel_links = [int(s) for s in sel_links]
556
557
558
559 if not set(sel_links).issubset(mgts):
560 print(sel_links, mgts)
561 raise ValueError(f"MGTs {set(sel_links)-set(mgts)} are not instantiated")
562
563
564
565 print(f"Sampling hermes counters for {seconds}s")
566 hrms.sample_ctrs(seconds)
567
568 info_data = dump_sub_regs(hrms.get_node('info'))
569 print(dict_to_table(info_data, title='hermes info', show_header=False))
570
571
572
573 for i in sel_links:
574 print(f'---Tx Mux {i} Status---')
575
576 hrms.sel_tx_mux(i)
577
578
579
580 top_ctrl = dump_sub_regs(hrms.get_node('tx_path.tx_mux.csr.ctrl'))
581 top_stat = dump_sub_regs(hrms.get_node('tx_path.tx_mux.csr.stat'))
582 ctrl_mux = dump_sub_regs(hrms.get_node('tx_path.tx_mux.mux.ctrl'))
583 stat_mux = dump_sub_regs(hrms.get_node('tx_path.tx_mux.mux.stat'))
584
585 grid = Table.grid()
586 grid.add_column("ctrl")
587 grid.add_column("stat")
588 grid.add_row(
589 dict_to_table(top_ctrl, title='tx_mux ctrl', show_header=False),
590 dict_to_table(top_stat, title='tx mux stat', show_header=False),
591 dict_to_table(ctrl_mux, title="mux ctrl", show_header=False),
592 dict_to_table(stat_mux, title="mux stat", show_header=False),
593 )
594 print(grid)
595
596
597 if show_udp:
598 hrms.sel_udp_core(i)
599 ctrl_udp_src = dump_sub_regs(hrms.get_node(f'tx_path.udp_core.udp_core_control.src_addr_ctrl'))
600 ctrl_udp = dump_sub_regs(hrms.get_node(f'tx_path.udp_core.udp_core_control.ctrl'))
601 ctrl_flt_udp = dump_sub_regs(hrms.get_node(f'tx_path.udp_core.udp_core_control.ctrl.filter_control'))
602 if hrms.get_nodes(f'tx_path.udp_core.udp_core_control.rx_packet_counters'):
603 print("New tx counters found")
604 stat_rx_udp = dump_sub_regs(hrms.get_node(f'tx_path.udp_core.udp_core_control.rx_packet_counters'))
605 stat_tx_udp = dump_sub_regs(hrms.get_node(f'tx_path.udp_core.udp_core_control.tx_packet_counters'))
606 else:
607 print("No new tx counters found")
608 stat_rx_udp = dump_sub_regs(hrms.get_node(f'tx_path.udp_core.udp_core_control.tx_packet_counters'))
609 stat_tx_udp = {'-':0}
610
611
612 ctrl_srcdst = {}
613 ctrl_srcdst['src_ip'] = ctrl_udp_src['src_ip_addr']
614 ctrl_srcdst['dst_ip'] = ctrl_udp['dst_ip_addr']
615 ctrl_srcdst['src_mac'] = (ctrl_udp_src['src_mac_addr_upper'] << 32) + ctrl_udp_src['src_mac_addr_lower']
616 ctrl_srcdst['dst_mac'] = (ctrl_udp['dst_mac_addr_upper'] << 32) + ctrl_udp['dst_mac_addr_lower']
617 ctrl_srcdst['src_port'] = ctrl_udp_src['src_port']
618 ctrl_srcdst['dst_port'] = ctrl_udp['dst_port']
619
620 grid = Table.grid()
621 grid.add_column("ctrl")
622 grid.add_column("stat")
623 grid.add_row(
624
625 dict_to_table(ctrl_srcdst, title="udp src/dst", show_header=False),
626 dict_to_table(ctrl_flt_udp, title="udp filter", show_header=False),
627 dict_to_table(stat_rx_udp, title="udp rx stat", show_header=False),
628 dict_to_table(stat_tx_udp, title="udp tx stat", show_header=False),
629 )
630 print(grid)
631
632 if show_buf:
633 ibuf_stats = {}
634
635 src_ids = tuple(range(hrms.n_srcs_p_mgt))
636 for j in src_ids:
637
638 hrms.sel_tx_mux_buf(j)
639 s = dump_sub_regs(hrms.get_node('tx_path.tx_mux.buf'))
640 s['blk_acc'] = (s['blk_acc_h']<<32)+s['blk_acc_l']
641 s['blk_oflow'] = (s['blk_oflow_h']<<32)+s['blk_oflow_l']
642 s['blk_rej'] = (s['blk_rej_h']<<32)+s['blk_rej_l']
643 s['ts'] = (s['ts_h']<<32)+s['ts_l']
644 s['vol'] = (s['vol_h']<<32)+s['vol_l']
645 s['blk_longlast'] = (s['blk_longlast_h']<<32)+s['blk_longlast_l']
646 s['blk_lastnotval'] = (s['blk_lastnotval_h']<<32)+s['blk_lastnotval_l']
647
648 for k in tuple(s.keys()):
649 for n in ('blk_acc_', 'blk_oflow_', 'blk_rej_', 'ts_', 'vol_', 'blk_longlast_', 'blk_lastnotval_'):
650 if k.startswith(n):
651 del s[k]
652
653 for k in ('ctrl', 'stat', 'buf_mon'):
654 del s[k]
655
656
657 ibuf_stats[j] = s
658
659
660 t = Table()
661
662
663 t.add_column('name')
664 for j in src_ids:
665 t.add_column(f'Buf {j}', style='green')
666
667
668 reg_names = set()
669 for k,v in ibuf_stats.items():
670 reg_names = reg_names.union(v.keys())
671
672 for n in sorted(reg_names):
673 t.add_row(n,*(hex(ibuf_stats[j][n]) for j in src_ids))
674 print(t)
675
676
677@cli.command()
678@click.pass_obj
679@click.option('-r', '--phy-reset', is_flag=True, default=None, help="Reset the phy block")