<html><body><div style="font-family: times new roman, new york, times, serif; font-size: 12pt; color: #000000"><div>Mihai and Vladimir,</div><div><span style="font-size: 12pt;">Can you confirm my understanding from P4-16's perspective? </span></div><div>P4-16 allows to apply same table twice. </div><div>The table transitions(control flows) are not programmed within the table using hit-miss concept or action.</div><div><span style="font-size: 12pt;">I don't see such a provision in the spec of P4-16 dated May 22, 2017 version 1.0.0, unless target provides a special action.</span></div><div><span style="font-size: 12pt;">Only, apply{...} block, programs the table transition.</span></div><div><span style="font-size: 12pt;">Here, there is no possibility of programming a loop or cycle, however can have multiple :.apply" calls from the same table instance.</span></div><div><span style="font-size: 12pt;">Am I right? </span></div><div><span style="font-size: 12pt;"><br></span></div><div><span style="font-size: 12pt;">Now from perspective of realizing it in hardware or software.</span></div><div><span style="font-size: 12pt;"><br></span></div><div><span style="font-size: 12pt;">Vladimir,</span></div><div><span style="font-size: 12pt;">If a target provides action (or primitive in the terminology of BMV2) to transit to other table,  the table having this "special" ability gets involved in control flow programming.</span></div><div><span style="font-size: 12pt;">Things become complicated and applying same table twice means possibility of having cycle.</span></div><div><span style="font-size: 12pt;">Yes, I agree match and actions are separate stages. But, attaching control flow(table transitions) with actions may create a problem of having cycles.</span></div><div><span style="font-size: 12pt;"><br></span></div><div><span style="font-size: 12pt;">In follwing,</span></div><div><div style="font-family: Helvetica, Arial, sans-serif;" data-mce-style="font-family: Helvetica, Arial, sans-serif;">"Another important aspect of the language is the fact that match and action are thought of as separate phases, each taking some amount of time. During the match phase, the abstract machine determines the following 3 things:</div><div style="font-family: Helvetica, Arial, sans-serif;" data-mce-style="font-family: Helvetica, Arial, sans-serif;"><ol><li>The action that needs to be executed</li><li>The action data for this action</li><li>The next table (pointer)</li></ol><div>The actual action is executed during the second phase." </div></div><div style="font-family: Helvetica, Arial, sans-serif;" data-mce-style="font-family: Helvetica, Arial, sans-serif;"><br></div><div style="font-family: Helvetica, Arial, sans-serif;" data-mce-style="font-family: Helvetica, Arial, sans-serif;">This is why it is so natural to allow conditional execution, based on hit/miss or match result. </div><div><br></div></div><div><span style="font-size: 12pt;">From P4-16 language perspective, I do not see benefit of attaching "3. The next table(pointer)" with action execution.</span></div><div><span style="font-size: 12pt;"><br></span></div><div><span style="font-size: 12pt;"></span></div><div><span style="font-size: 12pt;">Thanks for sharing the links, I could not attend the meet and later forgot to check if ppts are available or not. </span></div><div>In future, I might be interested in knowing more details of tofino hardware, to see if outcome my work can use this.</div><div><span style="font-size: 12pt;"><br></span></div><div><span style="font-size: 12pt;">Antonin,</span></div><div><span style="font-size: 12pt;">Now related to BMV2 code, I want to know following.</span></div><div><span style="font-size: 12pt;">If "conditionals" and "next_states" both are setting the states, which would be used?</span></div><div><span style="font-size: 12pt;">If my above understanding of P4-16 spec is right(that tables do not take part in control flow </span>programming<span style="font-size: 12pt;"> via action), </span></div><div><span style="font-size: 12pt;">is it sufficient to keep the *next_node  in ControlFlowNode class and strictly making it pipeline with possibility of multiple ".apply" of  the same table?</span></div><div><span style="font-size: 12pt;">Yes, I agree change in compiler will be needed, it need to generate something in "conditionals" tag in absence of "if expression" in apply{...} block with direct t.apply calls.</span></div><div>I am not raising any issue, just trying to understand BMv2 code and p4-16 clearly so I can correctly extend BMV2 for my work.</div><div>My problem is table-transitions can be programmed two ways with current BMV2, I can take either of the way and follow it. </div><div><br></div><div>Thanks in advance folks.</div><div><br></div><div>PS.</div><div>I really appreciate your replies, knowing some of my questions could be already discussed topics in the past and some code questions might be unnecessary, if I spend more time with code.</div><div>As, I am in absolute hurry can not experiment everything, I am asking some code-related questions on dev forum. </div><div><br></div><div><span name="x"></span>-Hardik<span name="x"></span><br></div><div><br></div><hr id="zwchr"><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>"Mihai Budiu" <mbudiu@vmware.com><br><b>To: </b>"Vladimir Gurevich" <vladimir.gurevich@barefootnetworks.com>, "Hardik Soni" <hardik.soni@inria.fr><br><b>Cc: </b>"p4-dev" <p4-dev@lists.p4.org><br><b>Sent: </b>Tuesday, 15 August, 2017 7:18:44 PM<br><b>Subject: </b>RE: [P4-dev] tables ordering in pipeline using "conditionals", "next_tables", ...?<br><div><br></div>





<style><!--

@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;}

p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}

@list l0
        {mso-list-id:29113974;
        mso-list-template-ids:-1;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style>
<div class="WordSection1">
<p class="MsoNormal"><span lang="RO">I </span>would like to qualify this explanation; it depends on the meaning of “loops”, or on what you consider nodes in your graph. P4-16 in fact allows one to apply a table instance multiple times, so the graph which has
 table instances as nodes can have loops. Some targets, such as bmv2, cannot support such graphs, so the compiler for this target will reject such programs. Other targets may support them.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Mihai</p>
<p class="MsoNormal"> </p>
<div style="mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="border:none;padding:0in"><b>From: </b><a href="mailto:vladimir.gurevich@barefootnetworks.com" target="_blank">Vladimir Gurevich</a><br>
<b>Sent: </b>Tuesday, August 15, 2017 10:13<br>
<b>To: </b><a href="mailto:hardik.soni@inria.fr" target="_blank">Hardik Soni</a><br>
<b>Cc: </b><a href="mailto:p4-dev@lists.p4.org" target="_blank">p4-dev</a><br>
<b>Subject: </b>Re: [P4-dev] tables ordering in pipeline using "conditionals", "next_tables", ...?</p>
</div>
<p class="MsoNormal"> </p>
</div>
<div>
<div dir="ltr">Hello Hardik,
<div><br>
</div>
<div>I am not sure if you are asking about BMv2 implementation details of P4 in general. Let me answer your question from P4 standpoint. </div>
<div><br>
</div>
<div>The match-action algorithm that is representable by P4 controls (not parsers), is, indeed a graph, specifically a DAG, meaning that there are no loops. It is, indeed, the compiler's responsibility to ensure that there are no loops and therefore there is
 no possibility that next-table pointers will point "backwards". Such graphs are easily and naturally implemented in real hardware pipelines (just execute what you need and ignore the rest).</div>
<div><br>
</div>
<div>Another important aspect of the language is the fact that match and action are thought of as separate phases, each taking some amount of time. During the match phase, the abstract machine determines the following 3 things:</div>
<div>
<ol>
<li>The action that needs to be executed</li><li>The action data for this action</li><li>The next table (pointer)</li></ol>
<div>The actual action is executed during the second phase. </div>
</div>
<div><br>
</div>
<div>This is why it is so natural to allow conditional execution, based on hit/miss or match result. </div>
<div><br>
</div>
<div>For more details you can take a look at the presentations from P4 Developers Day (<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__p4.org_wp-2Dcontent_uploads_2017_05_p4-5Fd2-5F2017-5Fp4-5F16-5Ftutorial.pdf&d=DwMFaQ&c=uilaK90D4TOVoH58JNXRgQ&r=tGW6TKXajnoXSyy1S1P4DHGPe8sj54GGvw-b21n7aWg&m=2tAKo3QoShJfZR0a-gUsu_H4cm0q3F_4jVYQzFmnYHo&s=DiFZAssrsp4Fo8hh9Yx8tVvRLKWBvqqGCTxfSskilZw&e=" target="_blank">http://p4.org/wp-content/uploads/2017/05/p4_d2_2017_p4_16_tutorial.pdf</a>
 and <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__p4.org_wp-2Dcontent_uploads_2017_05_p4-5Fd2-5F2017-5Fprogrammable-5Fdata-5Fplane-5Fat-5Fterabit-5Fspeeds.pdf&d=DwMFaQ&c=uilaK90D4TOVoH58JNXRgQ&r=tGW6TKXajnoXSyy1S1P4DHGPe8sj54GGvw-b21n7aWg&m=2tAKo3QoShJfZR0a-gUsu_H4cm0q3F_4jVYQzFmnYHo&s=rPlGQZP3fC5KXyvcUz5bXLVb_r7F8cP8Jv_xCj7fV2c&e=" target="_blank">http://p4.org/wp-content/uploads/2017/05/p4_d2_2017_programmable_data_plane_at_terabit_speeds.pdf</a>)</div>
<div><br>
</div>
<div>Happy hacking,</div>
<div>Vladimir</div>
<div><br>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Tue, Aug 15, 2017 at 8:59 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>I have a confusion between two constructs.</div>
<div><br>
</div>
<div>1) <span style="font-size:12pt">Why next tables are dependent on actions? </span></div>
<div>    I have attached a screenshot, it shows fragment of .p4 against .json side by side.</div>
<div>    For 3 actions, there are 3 values in "next_tables" tag from line 784 to 786 in .json snippet.</div>
<div>    In <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_p4lang_behavioral-2Dmodel_blob_master_src_bm-5Fsim_P4Objects.cpp-23L1697&d=DwMFaQ&c=uilaK90D4TOVoH58JNXRgQ&r=tGW6TKXajnoXSyy1S1P4DHGPe8sj54GGvw-b21n7aWg&m=2tAKo3QoShJfZR0a-gUsu_H4cm0q3F_4jVYQzFmnYHo&s=Rat2_ovh_DEyTkZnKGb77Zu9hc78b_V3eCbNbDJJXEs&e=" target="_blank">lines
 1697 to 1713</a>  of P4Objects.cpp,  why MatchTableAbstract types have next_tables based on actions?</div>
<div>    These actions are not kind of "goto table" semantics.</div>
<div>
<div>    It is not really a pipeline if there are next_table options based on actions in one table, its a graph.</div>
<div>    This semantic(control invocation from table) is not specified in the spec of P4-16 dated May 22, 2017 version 1.0.0.</div>
<div>    For example, the idea of having different  next nodes even for __HIT__ and __MISS__  are also not specified.<span style="font-size:12pt"> </span></div>
<div><br>
</div>
<div>2) T<span style="font-size:12pt">here is apply{...} in .p4 or conditionals in .json, so which order of table arrangement is finally used?</span></div>
</div>
<div>    To me it seems, conditionals have final say.</div>
<div>    </div>
<div>I went through <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_p4lang_behavioral-2Dmodel_blob_master_docs_JSON-5Fformat.md&d=DwMFaQ&c=uilaK90D4TOVoH58JNXRgQ&r=tGW6TKXajnoXSyy1S1P4DHGPe8sj54GGvw-b21n7aWg&m=2tAKo3QoShJfZR0a-gUsu_H4cm0q3F_4jVYQzFmnYHo&s=xV_t_-2glSCeAnX8rIjFZe4dkXRYOqjzEvJgVHaC1yo&e=" target="_blank">
https://github.com/p4lang/behavioral-model/blob/master/docs/JSON_format.md</a> link.</div>
<div>Still, did not understand why two ways to define control flow even if it is a graph?</div>
<div>What is the difference, except the scope at which control transition is programmed? </div>
<div><br>
</div>
<div></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>
</div>
<br>
_______________________________________________<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="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.p4.org_mailman_listinfo_p4-2Ddev-5Flists.p4.org&d=DwMFaQ&c=uilaK90D4TOVoH58JNXRgQ&r=tGW6TKXajnoXSyy1S1P4DHGPe8sj54GGvw-b21n7aWg&m=2tAKo3QoShJfZR0a-gUsu_H4cm0q3F_4jVYQzFmnYHo&s=_l_2vE_TFTrQ-VqeniXApTc7_acFY9n0J26dxKxJhnc&e=" rel="noreferrer" target="_blank">http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org</a><br>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<div class="gmail_signature">
<div dir="ltr">
<div>
<div dir="ltr">
<div><span size="4" data-mce-style="font-size: large;" style="font-size: large;"><b>Vladimir Gurevich</b></span></div>
<div><span size="4" data-mce-style="font-size: large;" style="font-size: large;"><b><br>
</b></span></div>
<div><span size="4" data-mce-style="font-size: large;" style="font-size: large;"><b>Barefoot Networks</b></span></div>
<div><b><span size="2" data-mce-style="font-size: small;" style="font-size: small;">Technical Lead, Customer Engineering</span></b></div>
<div><span size="2" data-mce-style="font-size: small;" style="font-size: small;">Email: <a href="mailto:vag@barefootnetworks.com" target="_blank">
vag@barefootnetworks.com</a></span></div>
<div><span size="2" data-mce-style="font-size: small;" style="font-size: small;">Phone: (408) 833-4505</span></div>
<div><br>
</div>
</div>
</div>
</div>
</div>
</div>
</div>


</blockquote><div><br></div></div></body></html>