164class ShortenTokenLength :
public Transform {
173 if (str.size() <= allowedLength)
return str;
174 auto itr = newNameMap.find(str);
175 if (itr != newNameMap.end())
return itr->second;
177 cstring newStr = str.substr(0, allowedLength - std::to_string(count).size());
178 newStr += std::to_string(count);
180 newNameMap.insert(std::pair<cstring, cstring>(str, newStr));
181 origNameMap.insert(std::pair<cstring, cstring>(newStr, str));
186 if (name.originalName ==
"NoAction")
return name.originalName;
192 : newNameMap(newNameMap) {}
195 const IR::Node *preorder(IR::Member *m)
override {
196 if (m->toString().startsWith(
"m.") || m->toString().startsWith(
"t."))
197 m->member = shortenString(m->member);
199 m->member = shortenString(m->member, 30);
203 const IR::Node *preorder(IR::DpdkStructType *s)
override {
204 if (s->getAnnotation(
"__packet_data__"_cs)) {
205 s->name = shortenString(s->name);
207 for (
auto field : s->fields) {
208 IR::StructField *f =
new IR::StructField(field->name, field->type);
209 f->name = shortenString(f->name, 30);
210 changedFields.push_back(f);
212 return new IR::DpdkStructType(s->srcInfo, s->name, s->annotations, changedFields);
214 s->name = shortenString(s->name);
216 for (
auto field : s->fields) {
217 IR::StructField *f =
new IR::StructField(field->name, field->type);
218 f->name = shortenString(f->name);
219 changedFields.push_back(f);
221 return new IR::DpdkStructType(s->srcInfo, s->name, s->annotations, changedFields);
226 const IR::Node *preorder(IR::DpdkHeaderType *h)
override {
227 h->name = shortenString(h->name);
229 for (
auto field : h->fields) {
230 IR::StructField *f =
new IR::StructField(field->name, field->type);
231 f->name = shortenString(f->name, 30);
232 changedFields.push_back(f);
234 return new IR::DpdkHeaderType(h->srcInfo, h->name, h->annotations, changedFields);
237 const IR::Node *preorder(IR::DpdkExternDeclaration *e)
override {
238 e->name = shortenString(e->name);
242 const IR::Node *preorder(IR::Declaration *g)
override {
243 g->name = shortenString(g->name);
247 void shortenParamTypeName(IR::ParameterList &pl) {
249 for (
auto p : pl.parameters) {
250 auto newType0 = p->type->to<IR::Type_Name>();
251 auto path0 = newType0->path->clone();
252 path0->name = shortenString(path0->name);
253 new_pl.push_back(
new IR::Parameter(p->srcInfo, p->name, p->annotations, p->direction,
254 new IR::Type_Name(newType0->srcInfo, path0),
257 pl = IR::ParameterList{new_pl};
260 const IR::Node *preorder(IR::DpdkAction *a)
override {
261 a->name = shortenString(dropSuffixIfNoAction(a->name));
262 shortenParamTypeName(a->para);
266 const IR::Node *preorder(IR::ActionList *al)
override {
268 for (
auto ale : al->actionList) {
269 auto methodCallExpr = ale->expression->to<IR::MethodCallExpression>();
270 auto pathExpr = methodCallExpr->method->to<IR::PathExpression>();
271 auto path0 = pathExpr->path->clone();
272 path0->name = shortenString(dropSuffixIfNoAction(path0->name));
273 new_al.push_back(
new IR::ActionListElement(
274 ale->srcInfo, ale->annotations,
275 new IR::MethodCallExpression(
276 methodCallExpr->srcInfo, methodCallExpr->type,
277 new IR::PathExpression(pathExpr->srcInfo, pathExpr->type, path0),
278 methodCallExpr->typeArguments, methodCallExpr->arguments)));
280 return new IR::ActionList(al->srcInfo, new_al);
283 const IR::Node *preorder(IR::DpdkTable *t)
override {
284 t->name = shortenString(t->name);
285 auto methodCallExpr = t->default_action->to<IR::MethodCallExpression>();
286 auto pathExpr = methodCallExpr->method->to<IR::PathExpression>();
287 auto path0 = pathExpr->path->clone();
288 path0->name = shortenString(dropSuffixIfNoAction(path0->name));
289 t->default_action =
new IR::MethodCallExpression(
290 methodCallExpr->srcInfo, methodCallExpr->type,
291 new IR::PathExpression(pathExpr->srcInfo, pathExpr->type, path0),
292 methodCallExpr->typeArguments, methodCallExpr->arguments);
296 const IR::Node *preorder(IR::DpdkLearner *l)
override {
297 l->name = shortenString(l->name);
301 const IR::Node *preorder(IR::DpdkSelector *s)
override {
302 s->name = shortenString(s->name);
306 const IR::Node *preorder(IR::DpdkLearnStatement *ls)
override {
307 ls->action = shortenString(dropSuffixIfNoAction(ls->action));
311 const IR::Node *preorder(IR::DpdkApplyStatement *as)
override {
312 as->table = shortenString(as->table);
316 const IR::Node *preorder(IR::DpdkJmpStatement *j)
override {
317 j->label = shortenString(j->label);
321 const IR::Node *preorder(IR::DpdkLabelStatement *ls)
override {
322 ls->label = shortenString(ls->label);
326 const IR::Node *preorder(IR::DpdkJmpActionStatement *jas)
override {
327 jas->action = shortenString(dropSuffixIfNoAction(jas->action));
334class CollectUseDefInfo :
public Inspector {
342 std::unordered_map<cstring, int> defInfo;
343 std::unordered_map<
cstring ,
const IR::Expression * > replacementMap;
344 std::unordered_map<cstring, bool> dontEliminate;
346 explicit CollectUseDefInfo(
P4::TypeMap *typeMap) : typeMap(typeMap) {
347 dontEliminate[
"m.pna_main_output_metadata_output_port"_cs] =
true;
348 dontEliminate[
"m.psa_ingress_output_metadata_drop"_cs] =
true;
349 dontEliminate[
"m.psa_ingress_output_metadata_egress_port"_cs] =
true;
352 bool preorder(
const IR::DpdkJmpCondStatement *b)
override {
358 bool preorder(
const IR::DpdkLearnStatement *b)
override {
360 dontEliminate[b->timeout->toString()] =
true;
362 usesInfo[b->argument->toString()]++;
365 dontEliminate[b->argument->toString()] =
true;
370 bool preorder(
const IR::DpdkUnaryStatement *u)
override {
372 defInfo[u->dst->toString()]++;
374 dontEliminate[u->dst->toString()] =
true;
378 bool preorder(
const IR::DpdkBinaryStatement *b)
override {
381 defInfo[b->dst->toString()]++;
384 dontEliminate[b->dst->toString()] =
true;
385 dontEliminate[b->src1->toString()] =
true;
389 bool preorder(
const IR::DpdkMovStatement *mv)
override {
390 defInfo[mv->dst->toString()]++;
392 replacementMap[mv->dst->toString()] = mv->src;
396 bool preorder(
const IR::DpdkCastStatement *c)
override {
398 defInfo[c->dst->toString()]++;
399 replacementMap[c->dst->toString()] = c->src;
403 bool preorder(
const IR::DpdkMirrorStatement *m)
override {
405 usesInfo[m->sessionId->toString()]++;
407 dontEliminate[m->slotId->toString()] =
true;
408 dontEliminate[m->sessionId->toString()] =
true;
412 bool preorder(
const IR::DpdkEmitStatement *e)
override {
413 auto type = typeMap->getType(e->header)->to<IR::Type_Header>();
415 for (
auto f : type->fields) {
416 cstring name = e->header->toString() +
"." + f->name.toString();
422 bool preorder(
const IR::DpdkExtractStatement *e)
override {
423 auto type = typeMap->getType(e->header)->to<IR::Type_Header>();
425 for (
auto f : type->fields) {
426 cstring name = e->header->toString() +
"." + f->name.toString();
432 dontEliminate[e->length->toString()] =
true;
437 bool preorder(
const IR::DpdkLookaheadStatement *l)
override {
438 auto type = typeMap->getType(l->header)->to<IR::Type_Header>();
440 for (
auto f : type->fields) {
441 cstring name = l->header->toString() +
"." + f->name.toString();
447 bool preorder(
const IR::DpdkRxStatement *r)
override {
450 dontEliminate[r->port->toString()] =
true;
454 bool preorder(
const IR::DpdkTxStatement *t)
override {
457 dontEliminate[t->port->toString()] =
true;
461 bool preorder(
const IR::DpdkRecircidStatement *t)
override {
464 dontEliminate[t->pass->toString()] =
true;
468 bool preorder(
const IR::DpdkRearmStatement *r)
override {
472 dontEliminate[r->timeout->toString()] =
true;
477 bool preorder(
const IR::DpdkChecksumAddStatement *c)
override {
480 if (
auto m = c->field->to<IR::Member>())
481 if (m->expr->is<IR::Type_Header>()) dontEliminate[c->field->toString()] =
true;
485 bool preorder(
const IR::DpdkChecksumSubStatement *c)
override {
488 if (
auto m = c->field->to<IR::Member>())
489 if (m->expr->is<IR::Type_Header>()) dontEliminate[c->field->toString()] =
true;
493 bool preorder(
const IR::DpdkGetHashStatement *c)
override {
496 dontEliminate[c->dst->toString()] =
true;
500 bool preorder(
const IR::DpdkVerifyStatement *v)
override {
501 usesInfo[v->condition->toString()]++;
504 dontEliminate[v->condition->toString()] =
true;
505 dontEliminate[v->error->toString()] =
true;
509 bool preorder(
const IR::DpdkMeterDeclStatement *c)
override {
514 bool preorder(
const IR::DpdkMeterExecuteStatement *e)
override {
516 if (e->length)
usesInfo[e->length->toString()]++;
517 usesInfo[e->color_in->toString()]++;
518 usesInfo[e->color_out->toString()]++;
522 bool preorder(
const IR::DpdkCounterCountStatement *c)
override {
524 if (c->incr)
usesInfo[c->incr->toString()]++;
528 bool preorder(
const IR::DpdkRegisterDeclStatement *r)
override {
533 bool preorder(
const IR::DpdkRegisterReadStatement *r)
override {
535 defInfo[r->dst->toString()]++;
539 bool preorder(
const IR::DpdkRegisterWriteStatement *r)
override {
544 bool preorder(
const IR::DpdkTable *t)
override {
545 auto keys = t->match_keys;
547 for (
auto ke : keys->keyElements) {
548 dontEliminate[ke->expression->toString()] =
true;
553 bool haveSingleUseDef(cstring str) {
return defInfo[str] == 1 &&
usesInfo[str] == 1; }