139#define CMP_SIGNED 0x08
154 friend bool operator<(
const WidthRec &l,
const WidthRec &r) {
155 if (l.type != r.type)
return (l.type < r.type);
158 return (l.u.value < r.u.value);
162 (l.u.concat.lhsw < r.u.concat.lhsw) ||
163 ((l.u.concat.lhsw == r.u.concat.lhsw) && (l.u.concat.rhsw < r.u.concat.rhsw)));
173 return (l.u.arith.w < r.u.arith.w);
176 return ((l.u.bxsmul.bw < r.u.bxsmul.bw) ||
177 ((l.u.bxsmul.bw == r.u.bxsmul.bw) && (l.u.bxsmul.sv < r.u.bxsmul.sv)));
180 return ((l.u.cast.fw < r.u.cast.fw) ||
181 ((l.u.cast.fw == r.u.cast.fw) && (l.u.cast.tw < r.u.cast.tw)));
186 return ((l.u.shift_x.lw < r.u.shift_x.lw) || ((l.u.shift_x.lw == r.u.shift_x.lw) &&
187 ((l.u.shift_x.rw < r.u.shift_x.rw))));
192 return ((l.u.shift_c.lw < r.u.shift_c.lw) || ((l.u.shift_c.lw == r.u.shift_c.lw) &&
193 ((l.u.shift_c.sv < r.u.shift_c.sv))));
196 return ((l.u.cmp.w < r.u.cmp.w) ||
197 ((l.u.cmp.w == r.u.cmp.w) && (l.u.cmp.cmp < r.u.cmp.cmp)));
201 return ((l.u.sarith.w < r.u.sarith.w) ||
202 ((l.u.sarith.w == r.u.sarith.w) &&
203 (!l.u.sarith.issigned && r.u.sarith.issigned)));
206 return (l.u.assign.w < r.u.assign.w);
211 friend bool operator==(
const WidthRec &l,
const WidthRec &r) {
212 if (l.type != r.type)
return (0);
215 return (l.u.value == r.u.value);
218 return ((l.u.concat.lhsw == r.u.concat.lhsw) &&
219 (l.u.concat.rhsw) == (r.u.concat.rhsw));
229 return (l.u.arith.w == r.u.arith.w);
232 return ((l.u.bxsmul.bw == r.u.bxsmul.bw) && (l.u.bxsmul.sv == r.u.bxsmul.sv));
235 return ((l.u.cast.fw == r.u.cast.fw) && (l.u.cast.tw == r.u.cast.tw));
240 return ((l.u.shift_x.lw == r.u.shift_x.lw) && (l.u.shift_x.rw == r.u.shift_x.rw));
245 return ((l.u.shift_c.lw == r.u.shift_c.lw) && (l.u.shift_c.sv == r.u.shift_c.sv));
248 return ((l.u.cmp.w == r.u.cmp.w) && (l.u.cmp.cmp == r.u.cmp.cmp));
252 return ((l.u.sarith.w == r.u.sarith.w) &&
253 (l.u.sarith.issigned == r.u.sarith.issigned));
256 return (l.u.assign.w == r.u.assign.w);
261 friend bool operator>(
const WidthRec &l,
const WidthRec &r) {
return (r < l); }
262 friend bool operator>=(
const WidthRec &l,
const WidthRec &r) {
return (!(l < r)); }
263 friend bool operator<=(
const WidthRec &l,
const WidthRec &r) {
return (!(r < l)); }
264 friend bool operator!=(
const WidthRec &l,
const WidthRec &r) {
return (!(l == r)); }
267class 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), 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 arith_common_2(
const IR::Operation_Binary *, WrType,
bool =
true);
314 bool arith_common_1(
const IR::Operation_Unary *, WrType,
bool =
true);
315 bool sarith_common_2(
const IR::Operation_Binary *, WrType,
bool =
true);
317 void end_apply(
const IR::Node *)
override;
318 void revisit_visited();
327class ConvertToBackendIR :
public Inspector {
331 unsigned instance_id;
332 bool is_num_elements;
338 unsigned no_of_instances;
342 enum CounterType { PACKETS, BYTES, PACKETS_AND_BYTES };
343 const IR::ToplevelBlock *tlb;
344 IR::TCPipeline *tcPipeline;
348 unsigned int tableCount = 0;
349 unsigned int actionCount = 0;
350 unsigned int metadataCount = 0;
351 unsigned int labelCount = 0;
352 unsigned int externCount = 0;
353 cstring pipelineName =
nullptr;
354 cstring mainParserName =
nullptr;
367 : tlb(tlb), tcPipeline(pipe), refMap(refMap), typeMap(typeMap), options(options) {}
368 void setPipelineName();
369 cstring getPipelineName() {
return pipelineName; };
370 bool preorder(
const IR::P4Program *p)
override;
371 void postorder(
const IR::P4Action *a)
override;
372 void postorder(
const IR::P4Table *t)
override;
373 void postorder(
const IR::P4Program *p)
override;
374 void postorder(
const IR::Declaration_Instance *d)
override;
375 void postorder(
const IR::Type_Struct *ts)
override;
376 safe_vector<const IR::TCKey *> processExternConstructor(
const IR::Type_Extern *extn,
377 const IR::Declaration_Instance *decl,
378 struct ExternInstance *instance);
379 safe_vector<const IR::TCKey *> processExternControlPath(
const IR::Type_Extern *extn,
380 const IR::Declaration_Instance *decl,
382 cstring getControlPathKeyAnnotation(
const IR::StructField *field);
383 unsigned GetAccessNumericValue(std::string_view access);
384 bool isDuplicateAction(
const IR::P4Action *action);
385 bool isDuplicateOrNoAction(
const IR::P4Action *action);
386 void updateDefaultHitAction(
const IR::P4Table *t, IR::TCTable *tdef);
387 void updateDefaultMissAction(
const IR::P4Table *t, IR::TCTable *tdef);
388 void updateConstEntries(
const IR::P4Table *t, IR::TCTable *tdef);
389 void updateMatchType(
const IR::P4Table *t, IR::TCTable *tabledef);
390 void updateTimerProfiles(IR::TCTable *tabledef);
391 void updatePnaDirectCounter(
const IR::P4Table *t, IR::TCTable *tabledef,
unsigned tentries);
392 void updatePnaDirectMeter(
const IR::P4Table *t, IR::TCTable *tabledef,
unsigned tentries);
394 bool isPnaMainInputMeta(
const IR::Member *mem);
395 bool isPnaMainOutputMeta(
const IR::Member *mem);
396 unsigned int findMappedKernelMeta(
const IR::Member *mem);
397 const IR::Expression *ExtractExpFromCast(
const IR::Expression *exp);
398 unsigned getTcType(
const IR::StringLiteral *sl);
399 unsigned getTableId(cstring tableName)
const;
400 unsigned getActionId(cstring actionName)
const;
401 cstring getExternId(cstring externName)
const;
402 unsigned getExternInstanceId(cstring externName, cstring instanceName)
const;
403 cstring processExternPermission(
const IR::Type_Extern *ext);
404 unsigned getTableKeysize(
unsigned tableId)
const;
405 cstring externalName(
const IR::IDeclaration *declaration)
const;
406 cstring HandleTableAccessPermission(
const IR::P4Table *t);
407 std::pair<cstring, cstring> *GetAnnotatedAccessPath(
const IR::Annotation *anno);
408 void updateAddOnMissTable(
const IR::P4Table *t);
409 bool checkParameterDirection(
const IR::TCAction *tcAction);
410 bool hasExecuteMethod(
const IR::Type_Extern *extn);
411 void addExternTypeInstance(
const IR::Declaration_Instance *decl,
412 IR::TCExternInstance *tcExternInstance, cstring eName);
413 safe_vector<const IR::TCKey *> HandleTypeNameStructField(
const IR::StructField *field,
414 const IR::Type_Extern *extn,
415 const IR::Declaration_Instance *decl,
416 int &kId, cstring annoName);
417 safe_vector<const IR::TCKey *> processCounterControlPathKeys(
418 const IR::Type_Struct *extern_control_path,
const IR::Type_Extern *extn,
419 const IR::Declaration_Instance *decl);
420 CounterType toCounterType(
const int type);