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