<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>I figured out how to rebuild the HLIR .py code after making a minor change to test the change.  <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Humble apologies that I missed that all one has to do is invoke “sudo python setup.py install” again and the code change is picked up. <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Hemant<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'> P4-dev [mailto:p4-dev-bounces@lists.p4.org] <b>On Behalf Of </b>hemant@mnkcg.com<br><b>Sent:</b> Saturday, November 05, 2016 10:00 AM<br><b>To:</b> 'Antonin Bas' <antonin@barefootnetworks.com><br><b>Cc:</b> p4-dev@lists.p4.org<br><b>Subject:</b> Re: [P4-dev] HLIR and p4_action<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Antonin,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>A follow-up question.  I don’t see any build instructions/script to show how the HLIR is built.   What if a user is changing a .py file in the HLIR code and would like to rebuild the HLIR? <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>Hemant<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p> </o:p></span></p><p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'> Antonin Bas [<a href="mailto:antonin@barefootnetworks.com">mailto:antonin@barefootnetworks.com</a>] <br><b>Sent:</b> Thursday, November 03, 2016 12:35 PM<br><b>To:</b> <a href="mailto:hemant@mnkcg.com">hemant@mnkcg.com</a><br><b>Cc:</b> <a href="mailto:p4-dev@lists.p4.org">p4-dev@lists.p4.org</a><br><b>Subject:</b> Re: [P4-dev] HLIR and p4_action<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><div><div><div><div><p class=MsoNormal style='margin-bottom:12.0pt'>Hi Hemant,<o:p></o:p></p></div><p class=MsoNormal>There is no straightforward way of checking whether an action is user-defined or a primitive action. You can look at the call_sequence attribute of the p4_action object (h.p4_actions[<i>action_name</i>].call_sequence). If this is an empty list, then it is likely to be a primitive action -although in theory it can also be a user-defined action with an empty body.<o:p></o:p></p></div><p class=MsoNormal>Usually, we do not iterate over the p4_actions dictionary directly. Rather, we walk the table graph and for each table we look at the actions it is calling. For each of these actions, we then look at the flat_call_sequence attribute, which is the sequence of action primitives this action is calling (and these are guaranteed to be ALL action primitives as we have flattened the call sequence).<o:p></o:p></p></div></div><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>On Thu, Nov 3, 2016 at 5:05 AM, <<a href="mailto:hemant@mnkcg.com" target="_blank">hemant@mnkcg.com</a>> wrote:<o:p></o:p></p><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I am playing with stateful.p4 included in the tests directory with the p4-hlir.  The stateful.p4 source code contains only two actions shown below.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>action hop(ttl, egress_spec) {</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>    add_to_field(ttl, -1);</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>    modify_field(standard_metadata.egress_spec, egress_spec, 0xFFFFFFFF);</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>}</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>action hop_ipv4(egress_spec) {</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>    hop(ipv4.ttl, egress_spec);</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>}</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I am using the p4-shell to inspect hlir info.   The h.p4_actions includes a kitchen sink of actions followed by the two actions implemented in the stateful.p4 source code.  What if a user of the HLIR would like to see his/her defined methods only?<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>>>> <span style='background:yellow'>h.p4_actions.items()</span></span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'>[('subtract', p4_action.subtract), ('no_op', p4_action.no_op), ('remove_header', p4_action.remove_header), ('modify_field_with_hash_based_offset', p4_action.modify_field_with_hash_based_offset), ('add_header', p4_action.add_header), ('execute_meter', p4_action.execute_meter), ('bit_and', p4_action.bit_and), ('subtract_from_field', p4_action.subtract_from_field), ('register_write', p4_action.register_write), ('add', p4_action.add), ('modify_field', p4_action.modify_field), ('count', p4_action.count), ('truncate', p4_action.truncate), ('clone_egress_pkt_to_egress', p4_action.clone_egress_pkt_to_egress), ('bit_or', p4_action.bit_or), ('pop', p4_action.pop), ('register_read', p4_action.register_read), ('bit_xor', p4_action.bit_xor), ('recirculate', p4_action.recirculate), ('resubmit', p4_action.resubmit), ('add_to_field', p4_action.add_to_field), ('drop', p4_action.drop), ('copy_header', p4_action.copy_header), ('generate_digest', p4_action.generate_digest), ('push', p4_action.push), ('clone_ingress_pkt_to_egress', p4_action.clone_ingress_pkt_to_egress), (<span style='background:yellow'>'hop', p4_action.hop), ('hop_ipv4', p4_action.hop_ipv4), ('drop_pkt', p4_action.drop_pkt)</span>]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Courier New"'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks,<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hemant<o:p></o:p></p></div></div><p class=MsoNormal><br>_______________________________________________<br>P4-dev mailing list<br><a href="mailto:P4-dev@lists.p4.org">P4-dev@lists.p4.org</a><br><a href="http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org" target="_blank">http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org</a><o:p></o:p></p></blockquote></div><p class=MsoNormal><br><br clear=all><br>-- <o:p></o:p></p><div><div><p class=MsoNormal>Antonin<o:p></o:p></p></div></div></div></div></body></html>