<div dir="ltr">Even if you could write some meta-programming code to deduce parameter direction from the action primitive type, you would only be able to detect "const" vs "non-const". If it is "non-const", you wouldn't know if it is "out" or "in-out".<div>Ultimately, I have not idea why you would need this parameter direction information in a target, so without more concrete information and maybe some pseudo-code, it is hard for me to advise you.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 10, 2017 at 3:11 AM, Hardik Soni <span dir="ltr"><<a href="mailto:hardik.soni@inria.fr" target="_blank">hardik.soni@inria.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div style="font-family:times new roman,new york,times,serif;font-size:12pt;color:#000000"><div>Hello,</div><div><br></div><div><span style="font-size:12pt">Ok, following is my understanding. If I am missing something, let me know.</span></div><div><span style="font-size:12pt">From action definitions in json file </span><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/P4Objects.h#L414" style="font-size:12pt" target="_blank">actions_map</a><span style="font-size:12pt"> is being created with value type as </span><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L631" title="ActionFn" style="font-size:12pt" target="_blank">ActionFn</a><span style="font-size:12pt"> .</span></div><div>As I see in <a href="https://github.com/p4lang/behavioral-model/blob/master/src/bm_sim/P4Objects.cpp#L389" target="_blank">P4Objects::add_primitive_to_<wbr>action</a>  all the parameters of "all" the primitives are being pushed into the same vector named <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L676" target="_blank">params</a>.</div><div>Just above <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L676" target="_blank">params</a>, there is vector of <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L607" target="_blank">ActionPrimitveCall</a> named <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L675" target="_blank">primitives</a>.<br></div><div>So, all the parameters of all the primitives are pushed into the same vector.</div><div><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L607" target="_blank">ActionPrimitiveCall</a> ctor has <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L627" target="_blank">param_offset</a>. However, I see it being used to slice the <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L676" target="_blank">params</a> vector in execution of <a href="https://github.com/p4lang/behavioral-model/blob/master/src/bm_sim/actions.cpp#L310" target="_blank">ActionFnEntry::execute</a>.</div><div>And then <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L497" target="_blank">unpack_caller</a> in <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L607" target="_blank">ActionPrimiti<wbr>veCall</a> calls the functors of primitive defined by the target, while unpacking the the args.</div><div><br></div><div>My problem is following.</div><div>I need (for my target) the direction and values of the parameters of the primitives stored inside the data-structures of the BMV2's code. Not as definitions.</div><div>I do understand it is not the needed for BMV2 and P4 compiler, as they have definitions and they just pass the appropriate parameters to the primitives.</div><div><span style="font-size:12pt">For example, the way </span><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L568" style="font-size:12pt" target="_blank">get_num_params</a><span style="font-size:12pt"> deducts and stores the number of arguments, even if the source code of BMV2 already has the definitions for the core primitives.</span><span style="font-size:12pt">   </span></div><div><span style="font-size:12pt">The values are available in </span><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L676" style="font-size:12pt" target="_blank">params</a><span style="font-size:12pt"> and along with </span><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L675" style="font-size:12pt" target="_blank">primitive</a><span style="font-size:12pt"> and </span><a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L627" style="font-size:12pt" target="_blank">param_<wbr>offset</a><span style="font-size:12pt">, I have the access.</span></div><div>For the directions, I am looking for some meta-programming construct to deduct  in/out/in-out direction from the parameter pack at <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/actions.h#L558" target="_blank">ActionPrimitive</a></div><div>If you can suggest any approach, it will help. Thanks in advance.</div><div><br></div><div>Worst case, I might have to add a pure virtual method in ActionPrimitive to force primitives to notify direction of their parameters explicitly even if they have defined it.</div><div>Is there any other better place, where one time read of all the primitives can give directions of all the parameters of all the primitives in a data-structures inside the code?(not as reference or const references of c++)</div><div><br></div><div><span name="x"></span>-Hardik<span name="x"></span><br></div><div><br></div><hr id="m_-1053961522668532752zwchr"><blockquote style="border-left:2px solid #1010ff;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><b>From: </b>"Hardik Soni" <<a href="mailto:hardik.soni@inria.fr" target="_blank">hardik.soni@inria.fr</a>><br><b>To: </b>"Antonin Bas" <<a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a>><br><b>Cc: </b>"p4-dev" <<a href="mailto:p4-dev@lists.p4.org" target="_blank">p4-dev@lists.p4.org</a>><br><b>Sent: </b>Thursday, 10 August, 2017 6:58:28 AM<div><div class="h5"><br><b>Subject: </b>Re: [P4-dev] Queries related to primitives in json and bmv2 code<br><div><br></div><div style="font-family:times new roman,new york,times,serif;font-size:12pt;color:#000000"><div>Hi Antonin,</div><div><br></div><div>Thank you for the answers, it helped a lot.</div><div>From 4 and 5, can I conclude following?</div><div><br></div><div>Compiler reads the primitive statement form action block of  .p4 file. It Prepares left-to-right ordered list of parameters with their type, value tags in json.</div><div>BMV2 reads the json, and as it already has the definitions of primitives, it pass the same ordered list, left-to-right to the operator of primitive.</div><div>And because the the order is deterministic direction parameter implicitly matches, both P4 compiler and BMV2 know the definition.</div><div>If it is the case can you point the code where ActionPrimitiveCall::<wbr>execute being invoked(even if it is the overloaded )?</div><div>It will save some code browsing. :)</div><div><br></div><div><span></span>-Hardik<span></span><br></div><div><br></div><hr id="m_-1053961522668532752zwchr"><blockquote style="border-left:2px solid #1010ff;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><b>From: </b>"Antonin Bas" <<a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a>><br><b>To: </b>"Hardik Soni" <<a href="mailto:hardik.soni@inria.fr" target="_blank">hardik.soni@inria.fr</a>><br><b>Cc: </b>"p4-dev" <<a href="mailto:p4-dev@lists.p4.org" target="_blank">p4-dev@lists.p4.org</a>><br><b>Sent: </b>Wednesday, 9 August, 2017 11:15:39 PM<br><b>Subject: </b>Re: [P4-dev] Queries related to primitives in json and bmv2 code<br><div><br></div><div dir="ltr">Q1: It is the job of the compiler to know which operations are available for a given architecture. Some are always available, they are referred to as the "core primitives" in the bmv2 JSON documentation (<a href="https://github.com/p4lang/behavioral-model/blob/master/docs/JSON_format.md" target="_blank">https://github.com/p4lang/<wbr>behavioral-model/blob/master/<wbr>docs/JSON_format.md</a>). For other operations, the name expected by bmv2 usually matches the name in the P4 architecture file. This is the case for "truncate" (arch: <a href="https://github.com/p4lang/p4c/blob/master/p4include/v1model.p4#L141" target="_blank">https://github.com/<wbr>p4lang/p4c/blob/master/<wbr>p4include/v1model.p4#L141</a>, bmv2: <a href="https://github.com/p4lang/behavioral-model/blob/master/targets/simple_switch/primitives.cpp#L339" target="_blank">https://github.com/<wbr>p4lang/behavioral-model/blob/<wbr>master/targets/simple_switch/<wbr>primitives.cpp#L339</a>). This is not the case for "random" (arch) / "modify_field_rng_uniform" (bmv2). When needed the compiler is responsible for performing the appropriate mapping. By being consistent when defining the architecture and implement it in bmv2, one can avoid having to perform this mapping. Unfortunately v1model.p4 and simple_switch were defined at different times and diverge slightly.<div>One important thing to remember is that bmv2 operations cannot "return" values unlike P4_16 extern methods, so the compiler usually needs to synthesize an "out" parameter.</div><div><br></div><div>Q2: You can look at this file and see that primitives can have any number of parameters: <a href="https://github.com/p4lang/behavioral-model/blob/master/targets/simple_switch/primitives.cpp" target="_blank">https://github.<wbr>com/p4lang/behavioral-model/<wbr>blob/master/targets/simple_<wbr>switch/primitives.cpp</a></div><div><br></div><div>Q3: I think you misunderstood the comment. The comment is an open question asking whether we should be able to capture all primitive <i>parameters</i> as expressions in an efficient way.</div><div><br></div><div>Q4: Yes for "assign". The order of arguments is deterministic for all primitives btw.</div><div><br></div><div>Q5: This information is irrelevant to bmv2 and therefore doesn't appear in the JSON. bmv2 already "knows" the direction in a way based on the primitive definition / implementation. For example, in the case of modify_field (<a href="https://github.com/p4lang/behavioral-model/blob/master/targets/simple_switch/primitives.cpp#L44" target="_blank">https://github.com/p4lang/<wbr>behavioral-model/blob/master/<wbr>targets/simple_switch/<wbr>primitives.cpp#L44</a>) the first parameter is a non-const reference ("out") while the second is a const reference ("in").</div><div>The compiler is also aware of the direction of parameters based on the primitive / extern method definition (<a href="https://github.com/p4lang/p4c/blob/master/p4include/v1model.p4" target="_blank">https://github.com/p4lang/<wbr>p4c/blob/master/p4include/<wbr>v1model.p4</a>).</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 9, 2017 at 7:24 AM, Hardik Soni <span dir="ltr"><<a href="mailto:hardik.soni@inria.fr" target="_blank">hardik.soni@inria.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div style="font-family:times new roman,new york,times,serif;font-size:12pt;color:#000000"><div>Hello,</div><div><br></div><div>ok, I have the answer of Q1 but there is a follow up question.</div><div>I forgot I took the same primitives.cpp as simple_switch. </div><div>There was a separate file primitves.cpp</div><div><br></div><div>Q1' : How does compiler know the opcode name of primitives for the target?</div><div><br></div><div> Q5: I need information on direction of parameters for the primitives in json or BMV2.</div><div>I meant is there a way  to know if the parameter remains constant in the execution of primitive or gets modified.</div><div>Any dirtiest hack would be fine for now.</div><div><br></div><div><span></span>-Hardik<span></span><br></div><div><br></div><hr id="m_-1053961522668532752m_-6596824217985097164zwchr"><blockquote style="border-left:2px solid #1010ff;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><b>From: </b>"Hardik Soni" <<a href="mailto:hardik.soni@inria.fr" target="_blank">hardik.soni@inria.fr</a>><br><b>To: </b>"p4-dev" <<a href="mailto:p4-dev@lists.p4.org" target="_blank">p4-dev@lists.p4.org</a>><br><b>Sent: </b>Wednesday, 9 August, 2017 3:41:56 PM<br><b>Subject: </b>[P4-dev] Queries related to primitives in json and bmv2 code<div><div class="m_-1053961522668532752h5"><br><div><br></div><div style="font-family:times new roman,new york,times,serif;font-size:12pt;color:#000000"><div>Hello,</div><div><br></div><div>Q1. What are the possible "op" values for primitives in context of following json snippet?</div><div>I can see the macro, but where is the place where target writers invoke the macros?</div><div>Is there a set of basic primitives already defined, lets say for BMV2 simple switch target?</div><div><br></div><div><span style="font-size:12pt">...</span></div><div><p style="margin:0px">"primitives" : [<br> {<br>     "op" : "assign", <br>     "parameters" : [</p><p style="margin:0px"> ...</p><p style="margin:0px"><br></p><p style="margin:0px"><br></p><p style="margin:0px">Q2. Do primitives always have  two parameters? Left expression and right expression?</p><p style="margin:0px">Following are the two cases of "assign" primitive.</p><p style="margin:0px"><br></p><p style="margin:0px">Case 1:</p><p style="margin:0px">{<br>     "op" : "assign",<br>     "parameters" : [<br>     {<br>         "type" : "field",<br>         "value" : ["ethernet", "srcAddr"]<br>     },<br>     {<br>         "type" : "field",<br>         "value" : ["ethernet", "dstAddr"]<br>     }<br>     ],<br>     "source_info" : {<br>         "filename" : "./input-p4s/dc.p4",<br>         "line" : 231,<br>         "column" : 8,<br>         "source_fragment" : "hdr.ethernet.srcAddr = hdr.ethernet.dstAddr"<br>     }<br> },</p><p style="margin:0px"><br></p><p style="margin:0px"><br></p><p style="margin:0px">Case 2:</p><p style="margin:0px">{<br>     "op" : "assign",<br>     "parameters" : [<br>     {<br>     "type" : "field",<br>     "value" : ["ipv4", "ttl"]<br>     },<br>     {<br>         "type" : "expression",<br>         "value" : {<br>             "type" : "expression",<br>             "value" : {</p><p style="margin:0px">                "op" : "&",</p><p style="margin:0px">                "left" : {<br>                     "type" : "expression",<br>                     "value" : {<br>                         "op" : "+",<br>                         "left" : {</p><p style="margin:0px">                            "<wbr>type" : "field",<br>                             "<wbr>value" : ["ipv4", "ttl"]</p><p style="margin:0px">                        },<br>                         "<wbr>right" : {<br>                         "type" : "hexstr",</p><p style="margin:0px">                        "<wbr>value" : "0xff"<br>                         }<br>                     }</p><p style="margin:0px">                },<br>                 "right" : {<br>                     "type" : "hexstr",<br>                     "value" : "0xff"<br>                 }<br>             }<br>         }</p><p style="margin:0px">    }<br> ],<br> "source_info" : {<br>     "filename" : "./input-p4s/dc.p4",<br>     "line" : 233,<br>     "column" : 8,<br>     "source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 1"<br> }<br> }</p><p style="margin:0px"><br></p><p style="margin:0px"><br></p><p style="margin:0px">Q3. In the function  <span style="font-size:12pt">P4Objects::add_<wbr>primitive_to_action(const Json::Value &cfg_primitive, ActionFn *action_fn)</span></p><p style="margin:0px"><span style="font-size:12pt">        there is a comment for "expression" type.</span></p><p style="margin:0px"><span style="font-size:12pt"> "// TODO(Antonin): should this make the field case (and other) obsolete</span></p><p style="margin:0px">  // maybe if we can optimize this case "</p><p style="margin:0px">For future code, do you think all the primitives can be captured as expressions?<span style="font-size:12pt"></span></p><p style="margin:0px"><br></p><p style="margin:0px"><br></p><p style="margin:0px">Q4. Can I  always conclude that the first parameter is left side of assignment operator and the second parameter is right side, given that __"op" : "assign"__?</p><p style="margin:0px"><br></p></div><div><br></div><div><span></span><div><span style="font-size:medium">Best Regards,</span><br><span style="font-size:medium">Hardik Soni</span></div><span></span><br></div></div><br></div></div>______________________________<wbr>_________________<br>P4-dev mailing list<br><a href="mailto:P4-dev@lists.p4.org" target="_blank">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/<wbr>listinfo/p4-dev_lists.p4.org</a></blockquote><div><br></div></div></div><br>______________________________<wbr>_________________<br> P4-dev mailing list<br> <a href="mailto:P4-dev@lists.p4.org" target="_blank">P4-dev@lists.p4.org</a><br> <a href="http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org" rel="noreferrer" target="_blank">http://lists.p4.org/mailman/<wbr>listinfo/p4-dev_lists.p4.org</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="m_-1053961522668532752gmail_signature"><div dir="ltr">Antonin<br></div></div></div></blockquote><div><br></div></div><br>______________________________<wbr>_________________<br>P4-dev mailing list<br><a href="mailto:P4-dev@lists.p4.org" target="_blank">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/<wbr>listinfo/p4-dev_lists.p4.org</a></div></div></blockquote><div><br></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Antonin<br></div></div>
</div>