138#define CMP_SIGNED 0x08
153 friend bool operator<(
const WidthRec &l,
const WidthRec &r) {
154 if (l.type != r.type)
return (l.type < r.type);
157 return (l.u.value < r.u.value);
161 (l.u.concat.lhsw < r.u.concat.lhsw) ||
162 ((l.u.concat.lhsw == r.u.concat.lhsw) && (l.u.concat.rhsw < r.u.concat.rhsw)));
172 return (l.u.arith.w < r.u.arith.w);
175 return ((l.u.bxsmul.bw < r.u.bxsmul.bw) ||
176 ((l.u.bxsmul.bw == r.u.bxsmul.bw) && (l.u.bxsmul.sv < r.u.bxsmul.sv)));
179 return ((l.u.cast.fw < r.u.cast.fw) ||
180 ((l.u.cast.fw == r.u.cast.fw) && (l.u.cast.tw < r.u.cast.tw)));
185 return ((l.u.shift_x.lw < r.u.shift_x.lw) || ((l.u.shift_x.lw == r.u.shift_x.lw) &&
186 ((l.u.shift_x.rw < r.u.shift_x.rw))));
191 return ((l.u.shift_c.lw < r.u.shift_c.lw) || ((l.u.shift_c.lw == r.u.shift_c.lw) &&
192 ((l.u.shift_c.sv < r.u.shift_c.sv))));
195 return ((l.u.cmp.w < r.u.cmp.w) ||
196 ((l.u.cmp.w == r.u.cmp.w) && (l.u.cmp.cmp < r.u.cmp.cmp)));
200 return ((l.u.sarith.w < r.u.sarith.w) ||
201 ((l.u.sarith.w == r.u.sarith.w) &&
202 (!l.u.sarith.issigned && r.u.sarith.issigned)));
205 return (l.u.assign.w < r.u.assign.w);
210 friend bool operator==(
const WidthRec &l,
const WidthRec &r) {
211 if (l.type != r.type)
return (0);
214 return (l.u.value == r.u.value);
217 return ((l.u.concat.lhsw == r.u.concat.lhsw) &&
218 (l.u.concat.rhsw) == (r.u.concat.rhsw));
228 return (l.u.arith.w == r.u.arith.w);
231 return ((l.u.bxsmul.bw == r.u.bxsmul.bw) && (l.u.bxsmul.sv == r.u.bxsmul.sv));
234 return ((l.u.cast.fw == r.u.cast.fw) && (l.u.cast.tw == r.u.cast.tw));
239 return ((l.u.shift_x.lw == r.u.shift_x.lw) && (l.u.shift_x.rw == r.u.shift_x.rw));
244 return ((l.u.shift_c.lw == r.u.shift_c.lw) && (l.u.shift_c.sv == r.u.shift_c.sv));
247 return ((l.u.cmp.w == r.u.cmp.w) && (l.u.cmp.cmp == r.u.cmp.cmp));
251 return ((l.u.sarith.w == r.u.sarith.w) &&
252 (l.u.sarith.issigned == r.u.sarith.issigned));
255 return (l.u.assign.w == r.u.assign.w);
260 friend bool operator>(
const WidthRec &l,
const WidthRec &r) {
return (r < l); }
261 friend bool operator>=(
const WidthRec &l,
const WidthRec &r) {
return (!(l < r)); }
262 friend bool operator<=(
const WidthRec &l,
const WidthRec &r) {
return (!(r < l)); }
263 friend bool operator!=(
const WidthRec &l,
const WidthRec &r) {
return (!(l == r)); }
266class ScanWidths :
public Inspector {
275 void add_concat(
int,
int);
276 void add_arith(WrType,
int);
277 void add_sarith(WrType,
int,
bool);
278 void add_bxsmul(
int,
unsigned int);
279 void add_cast(
unsigned int,
unsigned int);
280 bool bigXSmallMul(
const IR::Expression *,
const IR::Constant *);
281 void add_shift_c(WrType,
unsigned int,
unsigned int);
282 void add_shift_x(WrType,
unsigned int,
unsigned int);
283 void add_cmp(
unsigned int,
unsigned char);
284 void add_assign(
unsigned int);
288 : nwr(0), wrv(0), typemap(tm), refmap(rm), target(tgt) {}
289 ~ScanWidths(
void) { std::free(wrv); }
290 void expr_common(
const IR::Expression *);
291 bool preorder(
const IR::Expression *)
override;
292 bool preorder(
const IR::Concat *)
override;
293 bool preorder(
const IR::Add *)
override;
294 bool preorder(
const IR::Sub *)
override;
295 bool preorder(
const IR::Mul *)
override;
296 bool preorder(
const IR::Cast *)
override;
297 bool preorder(
const IR::Neg *)
override;
298 bool preorder(
const IR::Cmpl *)
override;
299 bool preorder(
const IR::Shl *)
override;
300 bool preorder(
const IR::Shr *)
override;
301 bool preorder(
const IR::Equ *)
override;
302 bool preorder(
const IR::Neq *)
override;
303 bool preorder(
const IR::Lss *)
override;
304 bool preorder(
const IR::Leq *)
override;
305 bool preorder(
const IR::Grt *)
override;
306 bool preorder(
const IR::Geq *)
override;
307 bool preorder(
const IR::BAnd *)
override;
308 bool preorder(
const IR::BOr *)
override;
309 bool preorder(
const IR::BXor *)
override;
310 bool preorder(
const IR::AddSat *)
override;
311 bool preorder(
const IR::SubSat *)
override;
312 bool preorder(
const IR::AssignmentStatement *)
override;
313 bool preorder(
const IR::MethodCallExpression *)
override;
314 bool arith_common_2(
const IR::Operation_Binary *, WrType,
bool =
true);
315 bool arith_common_1(
const IR::Operation_Unary *, WrType,
bool =
true);
316 bool sarith_common_2(
const IR::Operation_Binary *, WrType,
bool =
true);
318 void end_apply(
const IR::Node *)
override;
319 void revisit_visited();
328class ConvertToBackendIR :
public Inspector {
332 unsigned instance_id;
333 bool is_num_elements;
339 unsigned no_of_instances;
343 enum CounterType { PACKETS, BYTES, PACKETS_AND_BYTES };
344 const IR::ToplevelBlock *tlb;
345 IR::TCPipeline *tcPipeline;
349 unsigned int tableCount = 0;
350 unsigned int actionCount = 0;
351 unsigned int metadataCount = 0;
352 unsigned int labelCount = 0;
353 unsigned int externCount = 0;
354 cstring pipelineName =
nullptr;
355 cstring mainParserName =
nullptr;
368 : tlb(tlb), tcPipeline(pipe), refMap(refMap), typeMap(typeMap), options(options) {}
369 void setPipelineName();
370 cstring getPipelineName() {
return pipelineName; };
371 bool preorder(
const IR::P4Program *p)
override;
372 void postorder(
const IR::P4Action *a)
override;
373 void postorder(
const IR::P4Table *t)
override;
374 void postorder(
const IR::P4Program *p)
override;
375 void postorder(
const IR::Declaration_Instance *d)
override;
376 void postorder(
const IR::Type_Struct *ts)
override;
377 safe_vector<const IR::TCKey *> processExternConstructor(
const IR::Type_Extern *extn,
378 const IR::Declaration_Instance *decl,
379 struct ExternInstance *instance);
380 safe_vector<const IR::TCKey *> processExternControlPath(
const IR::Type_Extern *extn,
381 const IR::Declaration_Instance *decl,
383 cstring getControlPathKeyAnnotation(
const IR::StructField *field);
384 unsigned GetAccessNumericValue(std::string_view access);
385 bool isDuplicateAction(
const IR::P4Action *action);
386 bool isDuplicateOrNoAction(
const IR::P4Action *action);
387 void updateDefaultHitAction(
const IR::P4Table *t, IR::TCTable *tdef);
388 void updateDefaultMissAction(
const IR::P4Table *t, IR::TCTable *tdef);
389 void updateConstEntries(
const IR::P4Table *t, IR::TCTable *tdef);
390 void updateMatchType(
const IR::P4Table *t, IR::TCTable *tabledef);
391 void updateTimerProfiles(IR::TCTable *tabledef);
392 void updatePnaDirectCounter(
const IR::P4Table *t, IR::TCTable *tabledef,
unsigned tentries);
393 void updatePnaDirectMeter(
const IR::P4Table *t, IR::TCTable *tabledef,
unsigned tentries);
395 bool isPnaMainInputMeta(
const IR::Member *mem);
396 bool isPnaMainOutputMeta(
const IR::Member *mem);
397 unsigned int findMappedKernelMeta(
const IR::Member *mem);
398 const IR::Expression *ExtractExpFromCast(
const IR::Expression *exp);
399 unsigned getTcType(
const IR::StringLiteral *sl);
400 unsigned getTableId(cstring tableName)
const;
401 unsigned getActionId(cstring actionName)
const;
402 cstring getExternId(cstring externName)
const;
403 unsigned getExternInstanceId(cstring externName, cstring instanceName)
const;
404 cstring processExternPermission(
const IR::Type_Extern *ext);
405 unsigned getTableKeysize(
unsigned tableId)
const;
406 cstring externalName(
const IR::IDeclaration *declaration)
const;
407 cstring HandleTableAccessPermission(
const IR::P4Table *t);
408 std::pair<cstring, cstring> *GetAnnotatedAccessPath(
const IR::Annotation *anno);
409 void updateAddOnMissTable(
const IR::P4Table *t);
410 bool checkParameterDirection(
const IR::TCAction *tcAction);
411 bool hasExecuteMethod(
const IR::Type_Extern *extn);
412 void addExternTypeInstance(
const IR::Declaration_Instance *decl,
413 IR::TCExternInstance *tcExternInstance, cstring eName);
414 safe_vector<const IR::TCKey *> HandleTypeNameStructField(
const IR::StructField *field,
415 const IR::Type_Extern *extn,
416 const IR::Declaration_Instance *decl,
417 int &kId, cstring annoName);
418 safe_vector<const IR::TCKey *> processCounterControlPathKeys(
419 const IR::Type_Struct *extern_control_path,
const IR::Type_Extern *extn,
420 const IR::Declaration_Instance *decl);
421 CounterType toCounterType(
const int type);