18#ifndef BACKENDS_TOFINO_BF_ASM_JBAY_METER_H_
19#define BACKENDS_TOFINO_BF_ASM_JBAY_METER_H_
21template <
typename REGS>
22void MeterTable::setup_teop_regs_2(REGS ®s,
int meter_group_index) {
23 BUG_CHECK(teop >= 0 && teop < 4,
"teop out of range");
24 BUG_CHECK(gress == EGRESS,
"gress must be EGRESS");
26 auto &adrdist = regs.rams.match.adrdist;
27 if (!teop_initialized) {
29 auto delay = stage->pipelength(gress) - stage->pred_cycle(gress) - 7;
30 adrdist.teop_bus_ctl[teop].teop_bus_ctl_delay = delay;
31 adrdist.teop_bus_ctl[teop].teop_bus_ctl_delay_en = 1;
32 adrdist.teop_bus_ctl[teop].teop_bus_ctl_meter_en = 1;
34 adrdist.meter_to_teop_adr_oxbar_ctl[teop].enabled_2bit_muxctl_select = meter_group_index;
35 adrdist.meter_to_teop_adr_oxbar_ctl[teop].enabled_2bit_muxctl_enable = 1;
36 teop_initialized =
true;
39 adrdist.teop_to_meter_adr_oxbar_ctl[meter_group_index].enabled_2bit_muxctl_select = teop;
40 adrdist.teop_to_meter_adr_oxbar_ctl[meter_group_index].enabled_2bit_muxctl_enable = 1;
43 adrdist.dp_teop_meter_ctl[meter_group_index].dp_teop_meter_ctl_err = 0;
62 adrdist.dp_teop_meter_ctl[meter_group_index].dp_teop_meter_ctl_rx_shift = 0;
63 adrdist.dp_teop_meter_ctl[meter_group_index].dp_teop_meter_ctl_rx_en = 1;
65 auto &meter = regs.rams.map_alu.meter_group[meter_group_index].meter;
66 meter.meter_ctl_teop_en = 1;
69template <
typename REGS>
70void MeterTable::write_alu_vpn_range_2(REGS ®s) {
71 auto &adrdist = regs.rams.match.adrdist;
75 std::set<int> vpn_processed;
79 layout_vpn_bounds(minvpn, sparevpn,
false);
81 for (
int home_row : home_rows) {
82 bool block_start =
false;
83 bool block_end =
false;
86 for (Layout &logical_row : layout) {
88 if (logical_row.row == home_row) block_start =
true;
91 for (
auto v : logical_row.vpns) {
96 if (vpn_processed.count(v))
97 error(home_lineno,
"Multiple instance of the VPN %d detected", v);
99 vpn_processed.insert(v);
101 if (v < min) min = v;
102 if (v > max) max = v;
106 BUG_CHECK(min != 1000000 && max != -1,
"Invalid VPN range");
108 bitvec block_range(min, max - min + 1);
109 if (vpn_range.intersects(block_range))
110 error(home_lineno,
"Overlapping of VPN range detected");
112 vpn_range |= block_range;
114 adrdist.mau_meter_alu_vpn_range[home_row / 4].meter_vpn_base = min;
115 adrdist.mau_meter_alu_vpn_range[home_row / 4].meter_vpn_limit = max;
116 adrdist.mau_meter_alu_vpn_range[home_row / 4].meter_vpn_range_check_enable = 1;
117 for (MatchTable *m : match_tables)
118 adrdist.meter_alu_adr_range_check_icxbar_map[home_row / 4] |= 1U
123 BUG_CHECK(block_start && block_end,
"Invalid VPN range");
126 if (vpn_range != bitvec(minvpn, sparevpn - minvpn))
127 error(home_lineno,
"VPN range not entirely covered");
131void MeterTable::setup_teop_regs(Target::JBay::mau_regs ®s,
int meter_group_index) {
132 setup_teop_regs_2(regs, meter_group_index);
136void MeterTable::write_alu_vpn_range(Target::JBay::mau_regs ®s) {
137 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