18#ifndef BACKENDS_TOFINO_BF_ASM_JBAY_COUNTER_H_
19#define BACKENDS_TOFINO_BF_ASM_JBAY_COUNTER_H_
21template <
typename REGS>
22void CounterTable::setup_teop_regs_2(REGS ®s,
int stats_group_index) {
23 BUG_CHECK(teop >= 0 && teop < 4,
"Invalid teop: %d", teop);
24 BUG_CHECK(gress == EGRESS,
"Invalid gress: %d", gress);
26 auto &adrdist = regs.rams.match.adrdist;
28 if (!teop_initialized) {
30 auto delay = stage->pipelength(gress) - stage->pred_cycle(gress) - 7;
31 adrdist.teop_bus_ctl[teop].teop_bus_ctl_delay = delay;
32 adrdist.teop_bus_ctl[teop].teop_bus_ctl_delay_en = 1;
33 adrdist.teop_bus_ctl[teop].teop_bus_ctl_stats_en = 1;
35 adrdist.stats_to_teop_adr_oxbar_ctl[teop].enabled_2bit_muxctl_select = stats_group_index;
36 adrdist.stats_to_teop_adr_oxbar_ctl[teop].enabled_2bit_muxctl_enable = 1;
37 teop_initialized =
true;
40 adrdist.teop_to_stats_adr_oxbar_ctl[stats_group_index].enabled_2bit_muxctl_select = teop;
41 adrdist.teop_to_stats_adr_oxbar_ctl[stats_group_index].enabled_2bit_muxctl_enable = 1;
44 adrdist.dp_teop_stats_ctl[stats_group_index].dp_teop_stats_ctl_err = 0;
46 adrdist.dp_teop_stats_ctl[stats_group_index].dp_teop_stats_ctl_rx_shift = 2;
47 adrdist.dp_teop_stats_ctl[stats_group_index].dp_teop_stats_ctl_rx_en = 1;
49 auto &stats = regs.rams.map_alu.stats_wrap[stats_group_index].stats;
50 stats.statistics_ctl_teop_en = 1;
53template <
typename REGS>
54void CounterTable::write_alu_vpn_range_2(REGS ®s) {
55 auto &adrdist = regs.rams.match.adrdist;
59 std::set<int> vpn_processed;
63 layout_vpn_bounds(minvpn, sparevpn,
false);
65 for (
int home_row : home_rows) {
66 bool block_start =
false;
67 bool block_end =
false;
70 for (Layout &logical_row : layout) {
72 if (logical_row.row == home_row) block_start =
true;
75 for (
auto v : logical_row.vpns) {
80 if (vpn_processed.count(v))
81 error(home_lineno,
"Multiple instance of the VPN %d detected", v);
83 vpn_processed.insert(v);
90 BUG_CHECK(min != 1000000 && max != -1,
" Invalid VPN range");
92 bitvec block_range(min, max - min + 1);
93 if (vpn_range.intersects(block_range))
94 error(home_lineno,
"Overlapping of VPN range detected");
96 vpn_range |= block_range;
98 adrdist.mau_stats_alu_vpn_range[home_row / 4].stats_vpn_base = min;
99 adrdist.mau_stats_alu_vpn_range[home_row / 4].stats_vpn_limit = max;
100 adrdist.mau_stats_alu_vpn_range[home_row / 4].stats_vpn_range_check_enable = 1;
104 BUG_CHECK(block_start && block_end,
"Invalid VPN range");
107 if (vpn_range != bitvec(minvpn, sparevpn - minvpn))
108 error(home_lineno,
"VPN range not entirely covered");
112void CounterTable::setup_teop_regs(Target::JBay::mau_regs ®s,
int stats_group_index) {
113 setup_teop_regs_2(regs, stats_group_index);
117void CounterTable::write_alu_vpn_range(Target::JBay::mau_regs ®s) {
118 write_alu_vpn_range_2(regs);
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58