24 if (act != tbl->stage->imem_addr_use[imem_thread(tbl->gress)][act->addr]) {
25 LOG3(
"skipping " << tbl->name() <<
'.' << act->name <<
" as its imem is used by "
26 << tbl->stage->imem_addr_use[imem_thread(tbl->gress)][act->addr]->name);
30 auto &imem = regs.dp.imem;
31 int iaddr = act->addr / ACTION_IMEM_COLORS;
32 int color = act->addr % ACTION_IMEM_COLORS;
33 unsigned bits = encode();
34 BUG_CHECK(slot >= 0,
"slots must be >= 0");
35 unsigned off = slot % Phv::mau_groupsize();
36 unsigned side = 0, group = 0;
37 switch (slot / Phv::mau_groupsize()) {
95 BUG(
"bad slot size %d", slot / Phv::mau_groupsize());
98 switch (Phv::reg(slot)->type) {
99 case Phv::Register::NORMAL:
100 switch (Phv::reg(slot)->size) {
102 BUG_CHECK(group == 0 || group == 1,
"bad group");
103 imem.imem_subword8[side][group][off][iaddr].imem_subword8_instr = bits;
104 imem.imem_subword8[side][group][off][iaddr].imem_subword8_color = color;
105 imem.imem_subword8[side][group][off][iaddr].imem_subword8_parity =
106 parity(bits) ^ color;
109 imem.imem_subword16[side][group][off][iaddr].imem_subword16_instr = bits;
110 imem.imem_subword16[side][group][off][iaddr].imem_subword16_color = color;
111 imem.imem_subword16[side][group][off][iaddr].imem_subword16_parity =
112 parity(bits) ^ color;
115 BUG_CHECK(group == 0 || group == 1,
"bad group");
116 imem.imem_subword32[side][group][off][iaddr].imem_subword32_instr = bits;
117 imem.imem_subword32[side][group][off][iaddr].imem_subword32_color = color;
118 imem.imem_subword32[side][group][off][iaddr].imem_subword32_parity =
119 parity(bits) ^ color;
122 BUG(
"bad size %d", Phv::reg(slot)->size);
125 case Phv::Register::MOCHA:
126 switch (Phv::reg(slot)->size) {
128 BUG_CHECK(group == 0 || group == 1,
"bad group");
129 imem.imem_mocha_subword8[side][group][off - 12][iaddr]
130 .imem_mocha_subword_instr = bits;
131 imem.imem_mocha_subword8[side][group][off - 12][iaddr]
132 .imem_mocha_subword_color = color;
133 imem.imem_mocha_subword8[side][group][off - 12][iaddr]
134 .imem_mocha_subword_parity = parity(bits) ^ color;
137 imem.imem_mocha_subword16[side][group][off - 12][iaddr]
138 .imem_mocha_subword_instr = bits;
139 imem.imem_mocha_subword16[side][group][off - 12][iaddr]
140 .imem_mocha_subword_color = color;
141 imem.imem_mocha_subword16[side][group][off - 12][iaddr]
142 .imem_mocha_subword_parity = parity(bits) ^ color;
145 BUG_CHECK(group == 0 || group == 1,
"bad group");
146 imem.imem_mocha_subword32[side][group][off - 12][iaddr]
147 .imem_mocha_subword_instr = bits;
148 imem.imem_mocha_subword32[side][group][off - 12][iaddr]
149 .imem_mocha_subword_color = color;
150 imem.imem_mocha_subword32[side][group][off - 12][iaddr]
151 .imem_mocha_subword_parity = parity(bits) ^ color;
154 BUG(
"bad size %d", Phv::reg(slot)->size);
157 case Phv::Register::DARK:
158 switch (Phv::reg(slot)->size) {
160 BUG_CHECK(group == 0 || group == 1,
"bad group");
161 imem.imem_dark_subword8[side][group][off - 16][iaddr].imem_dark_subword_instr =
163 imem.imem_dark_subword8[side][group][off - 16][iaddr].imem_dark_subword_color =
165 imem.imem_dark_subword8[side][group][off - 16][iaddr].imem_dark_subword_parity =
166 parity(bits) ^ color;
169 imem.imem_dark_subword16[side][group][off - 16][iaddr].imem_dark_subword_instr =
171 imem.imem_dark_subword16[side][group][off - 16][iaddr].imem_dark_subword_color =
173 imem.imem_dark_subword16[side][group][off - 16][iaddr]
174 .imem_dark_subword_parity = parity(bits) ^ color;
177 BUG_CHECK(group == 0 || group == 1,
"bad group");
178 imem.imem_dark_subword32[side][group][off - 16][iaddr].imem_dark_subword_instr =
180 imem.imem_dark_subword32[side][group][off - 16][iaddr].imem_dark_subword_color =
182 imem.imem_dark_subword32[side][group][off - 16][iaddr]
183 .imem_dark_subword_parity = parity(bits) ^ color;
186 BUG(
"bad size %d", Phv::reg(slot)->size);
190 BUG(
"bad type %d", Phv::reg(slot)->type);
193 auto &power_ctl = regs.dp.actionmux_din_power_ctl;
194 phvRead([&](
const Phv::Slice &sl) { set_power_ctl_reg(power_ctl, sl.reg.mau_id()); });