21void Stage::write_regs(Target::Tofino::mau_regs ®s,
bool) {
22 write_common_regs<Target::Tofino>(regs);
23 auto &merge = regs.rams.match.merge;
24 for (gress_t gress : Range(INGRESS, EGRESS)) {
26 merge.predication_ctl[gress].start_table_fifo_delay0 = pred_cycle(gress) - 1;
27 merge.predication_ctl[gress].start_table_fifo_delay1 = 0;
28 merge.predication_ctl[gress].start_table_fifo_enable = 1;
30 switch (stage_dep[gress]) {
32 merge.predication_ctl[gress].start_table_fifo_delay0 =
33 this[-1].pipelength(gress) -
this[-1].pred_cycle(gress) +
34 pred_cycle(gress) - 1;
35 merge.predication_ctl[gress].start_table_fifo_delay1 =
36 this[-1].pipelength(gress) -
this[-1].pred_cycle(gress);
37 merge.predication_ctl[gress].start_table_fifo_enable = 3;
40 merge.predication_ctl[gress].start_table_fifo_delay0 = 1;
41 merge.predication_ctl[gress].start_table_fifo_delay1 = 0;
42 merge.predication_ctl[gress].start_table_fifo_enable = 1;
45 merge.predication_ctl[gress].start_table_fifo_enable = 0;
48 BUG(
"bad stage dependency");
52 regs.dp.cur_stage_dependency_on_prev[gress] = MATCH_DEP - stage_dep[gress];
53 if (stage_dep[gress] == CONCURRENT) regs.dp.stage_concurrent_with_prev |= 1U << gress;
55 if (stageno != AsmStage::numstages() - 1)
56 regs.dp.next_stage_dependency_on_cur[gress] = MATCH_DEP -
this[1].stage_dep[gress];
57 else if (AsmStage::numstages() < Target::NUM_MAU_STAGES())
58 regs.dp.next_stage_dependency_on_cur[gress] = 2;
59 auto &deferred_eop_bus_delay = regs.rams.match.adrdist.deferred_eop_bus_delay[gress];
60 deferred_eop_bus_delay.eop_internal_delay_fifo = pred_cycle(gress) + 3;
62 if (stageno == AsmStage::numstages() - 1) {
63 if (AsmStage::numstages() < Target::NUM_MAU_STAGES())
64 deferred_eop_bus_delay.eop_output_delay_fifo = 0;
66 deferred_eop_bus_delay.eop_output_delay_fifo = pipelength(gress) - 1;
67 }
else if (
this[1].stage_dep[gress] == MATCH_DEP)
68 deferred_eop_bus_delay.eop_output_delay_fifo = pipelength(gress) - 1;
69 else if (
this[1].stage_dep[gress] == ACTION_DEP)
70 deferred_eop_bus_delay.eop_output_delay_fifo = 1;
72 deferred_eop_bus_delay.eop_output_delay_fifo = 0;
73 deferred_eop_bus_delay.eop_delay_fifo_en = 1;
76 for (gress_t gress : Range(INGRESS, EGRESS))
77 if (table_use[gress] & USE_TCAM)
78 regs.tcams.tcam_piped |= options.match_compiler ? 3 : 1 << gress;
80 bitvec in_use = match_use[INGRESS] | action_use[INGRESS] | action_set[INGRESS];
81 bitvec eg_use = match_use[EGRESS] | action_use[EGRESS] | action_set[EGRESS];
82 if (options.match_compiler) {
88 in_use -= Deparser::PhvUse(EGRESS);
89 eg_use -= Deparser::PhvUse(INGRESS);
94 in_use |= Phv::use(INGRESS);
95 eg_use |= Phv::use(EGRESS);
96 static const int phv_use_transpose[2][14] = {
97 {0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21},
98 {4, 5, 6, 7, 12, 13, 14, 15, 22, 23, 24, 25, 26, 27}};
101 for (
int i = 0; i < 2; i++) {
102 for (
int j = 0; j < 14; j++) {
103 regs.dp.phv_ingress_thread_alu[i][j] = regs.dp.phv_ingress_thread_imem[i][j] =
104 regs.dp.phv_ingress_thread[i][j] = in_use.getrange(8 * phv_use_transpose[i][j], 8);
105 regs.dp.phv_egress_thread_alu[i][j] = regs.dp.phv_egress_thread_imem[i][j] =
106 regs.dp.phv_egress_thread[i][j] = eg_use.getrange(8 * phv_use_transpose[i][j], 8);