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