42 explicit SortExtracts(IR::BFN::ParserState *state) {
43 std::stable_sort(state->statements.begin(), state->statements.end(),
44 [&](
const IR::BFN::ParserPrimitive *a,
const IR::BFN::ParserPrimitive *b) {
45 auto va = get_packet_range(a);
46 auto vb = get_packet_range(b);
47 return (va && vb) ? (va->range < vb->range) : !!va;
51 std::clog <<
"sorted primitives in " << state->name << std::endl;
52 for (
auto p : state->statements) std::clog << p << std::endl;
84struct ShiftPacketRVal : Shift {
85 bool negative_ok =
false;
86 explicit ShiftPacketRVal(
int shft,
bool neg_ok =
false) : Shift(shft), negative_ok(neg_ok) {}
88 IR::Node *preorder(IR::BFN::PacketRVal *rval)
override {
89 auto new_range = rval->range.shiftedByBits(-shift_amt);
90 if (!negative_ok) BUG_CHECK(new_range.lo >= 0,
"packet rval shifted to be negative?");
91 rval->range = new_range;
95 IR::Node *postorder(IR::BFN::ChecksumSubtract *csum)
override {
96 auto *orig = getOriginal<IR::BFN::ChecksumSubtract>();
97 if (csum->source->range.loByte() % 2 != orig->source->range.loByte() % 2) {
98 return new IR::BFN::ChecksumSubtract(csum->declName, csum->source, !csum->swap,
99 csum->isPayloadChecksum);
104 IR::Node *postorder(IR::BFN::ChecksumAdd *csum)
override {
105 auto *orig = getOriginal<IR::BFN::ChecksumAdd>();
106 if (csum->source->range.loByte() % 2 != orig->source->range.loByte() % 2) {
107 return new IR::BFN::ChecksumAdd(csum->declName, csum->source, !csum->swap,
108 csum->isHeaderChecksum);