<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=us-ascii">
<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:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        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:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle24
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle25
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.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="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">There is no tool that I am aware of to dump the IR graph in dot format. However, these graphs are fairly large, it is not clear that a dot printout will be very legible.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I don’t expect it will be too difficult to write a piece of code which generates such graphs, though. This could be done either in C++, or in Python, by ingesting the JSON and dumping dot. In JSON anything that
 has a “NodeID” is a node, and fields in JSON indicate the edges. If you want to do it in C++ take a look at the DumpIR class in the top4.cpp file; it is very small, but it could be even shorter if it didn’t try to be so smart. In C++ you will also have to
 find a place to hook up your method to be called.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Mihai<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><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>From:</b> hemant@mnkcg.com [mailto:hemant@mnkcg.com] <br>
<b>Sent:</b> Friday, August 4, 2017 3:58 PM<br>
<b>To:</b> Mihai Budiu <mbudiu@vmware.com>; p4-dev@lists.p4.org<br>
<b>Subject:</b> RE: [P4-dev] p4test and IR in JSON format question<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Sorry, my bad.  I am saying a DAG graph that I could use a tool such as “dot” (graphviz) to draw a visual of the graph.   I am aware of the Visitor C++ class for a backend to use.   I should be able to use the Visitor class to dump the
 graph and figure out plotting it using dot.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hemant<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Mihai Budiu [<a href="mailto:mbudiu@vmware.com">mailto:mbudiu@vmware.com</a>]
<br>
<b>Sent:</b> Friday, August 04, 2017 6:17 PM<br>
<b>To:</b> <a href="mailto:hemant@mnkcg.com">hemant@mnkcg.com</a>; <a href="mailto:p4-dev@lists.p4.org">
p4-dev@lists.p4.org</a><br>
<b>Subject:</b> RE: [P4-dev] p4test and IR in JSON format question<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="color:#1F497D">What do you mean by “DAG format”?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The JSON text describes a DAG, which can be used to recover the internal representation of the program used by the compiler.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The IR C++ data structures in the compiler also represent the program as a DAG of C++ objects.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Mihai<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><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>From:</b> <a href="mailto:hemant@mnkcg.com">hemant@mnkcg.com</a> [<a href="mailto:hemant@mnkcg.com">mailto:hemant@mnkcg.com</a>]
<br>
<b>Sent:</b> Friday, August 4, 2017 2:59 PM<br>
<b>To:</b> Mihai Budiu <<a href="mailto:mbudiu@vmware.com">mbudiu@vmware.com</a>>; 'Antonin Bas' <<a href="mailto:antonin@barefootnetworks.com">antonin@barefootnetworks.com</a>>;
<a href="mailto:p4-dev@lists.p4.org">p4-dev@lists.p4.org</a><br>
<b>Subject:</b> RE: [P4-dev] p4test and IR in JSON format question<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="background:white">My question was indeed, why I don’t see a “size” : 16 in ir.json around the snipped output in my email.   I didn’t know the IR was in serialized form.   I looked for the IR node with number 456 and found the “size”
 : 16 elsewhere in ir.json.   I am interested in using p4test to dump the Midend IR that a backend will receive.  My preference is to receive this IR in a DAG format.  Is that possible with p4test?<o:p></o:p></p>
<p class="MsoNormal" style="background:white"><o:p> </o:p></p>
<p class="MsoNormal" style="background:white">Thanks,<o:p></o:p></p>
<p class="MsoNormal" style="background:white"><o:p> </o:p></p>
<p class="MsoNormal" style="background:white">Hemant<o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Mihai Budiu [<a href="mailto:mbudiu@vmware.com">mailto:mbudiu@vmware.com</a>]
<br>
<b>Sent:</b> Friday, August 04, 2017 4:07 PM<br>
<b>To:</b> <a href="mailto:hemant@mnkcg.com">hemant@mnkcg.com</a>; 'Antonin Bas' <<a href="mailto:antonin@barefootnetworks.com">antonin@barefootnetworks.com</a>>;
<a href="mailto:p4-dev@lists.p4.org">p4-dev@lists.p4.org</a><br>
<b>Subject:</b> RE: [P4-dev] p4test and IR in JSON format question<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="color:#1F497D">I am not sure what is the actual question you are asking.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The JSON you are dumping is actually the internal representation of the program inside the compiler. There is a separate JSON representation of the program, which is consumed by the behavioral model; that representation
 is produced by the p4c-bm2-ss compiler using the –o flag.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Assuming that what you care about is the internal IR, then the type of the ‘metadata’ field is in the IR node with number 456, which should be present somewhere in the JSON file, and should look like this:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                        "type" : {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                          "Node_ID" : 456,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                          "Node_Type" : "Type_Bits",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                          "size" : 16,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                          "isSigned" : false<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                        },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">What you see are just references to this node. The IR is a DAG, and in the serialized form each node appears only once; subsequent appearances of a node are replaced with a reference to the first appearance,
 which has always a unique nodeId.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Mihai<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><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>From:</b> P4-dev [<a href="mailto:p4-dev-bounces@lists.p4.org">mailto:p4-dev-bounces@lists.p4.org</a>]
<b>On Behalf Of </b><a href="mailto:hemant@mnkcg.com">hemant@mnkcg.com</a><br>
<b>Sent:</b> Thursday, August 03, 2017 11:40 AM<br>
<b>To:</b> 'p4-dev' <<a href="mailto:p4-dev@lists.p4.org">p4-dev@lists.p4.org</a>><br>
<b>Subject:</b> Re: [P4-dev] p4test and IR in JSON format question<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Sorry, I forgot to add the annotation in the mystruct  example below.   I have added it now.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> P4-dev [<a href="mailto:p4-dev-bounces@lists.p4.org">mailto:p4-dev-bounces@lists.p4.org</a>]
<b>On Behalf Of </b><a href="mailto:hemant@mnkcg.com">hemant@mnkcg.com</a><br>
<b>Sent:</b> Thursday, August 03, 2017 10:46 AM<br>
<b>To:</b> 'p4-dev' <<a href="mailto:p4-dev@lists.p4.org">p4-dev@lists.p4.org</a>><br>
<b>Subject:</b> [P4-dev] p4test and IR in JSON format question<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:12.0pt">I have used this command to generate IR to various output files.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white">./p4test --p4v 16 ~/p4-xpc/mySwitch.p4 --top4 FrontEndLast,MidEndLast --toJSON ~/ir.json --dump ~ -v<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;background:white">I get the following output files.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New"">mySwitch-FrontEnd_31_FrontEndLast.p4<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New"">mySwitch-MidEnd_40_MidEndLast.p4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white">ir.json<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;background:white">My P4-16 program has this struct defined.<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;background:white"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New"">struct mystruct_t {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New";background:yellow;mso-highlight:yellow">@MY_annotation("(FOO)")</span><span style="font-size:12.0pt;font-family:"Courier New""><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New"">bit<16>   metadata;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;background:white"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;background:white">In the
</span><span style="font-size:12.0pt;font-family:"Courier New"">mySwitch-MidEnd_40_MidEndLast.p4
</span><span style="font-size:12.0pt">file, I see my data struct in the P4 program show up with its bit fields. 
<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New";background:white">/* </span><span style="font-size:12.0pt;font-family:"Courier New""><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53904">
<span style="background:white">  <Type_Struct>(978058) */</span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53905">
<span style="background:white">struct mystruct_t {</span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53906">
<span style="background:white">/* </span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53907">
<span style="background:white">    <StructField>(978060)</span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53908">
<span style="background:white">      <Annotations>(978061)</span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53909">
<span style="background:white">      <Type_Bits>(456) */</span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53910">
<span style="background:white">        @MY_annotation("(FOO)") </span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53911">
<span style="background:white">    bit<16> metadata;</span><br id="yiv8885279415yui_3_16_0_ym19_1_1501711436962_53912">
<span style="background:white">}</span></span><span style="font-size:12.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt">However, the
</span><span style="font-size:12.0pt;font-family:"Courier New"">ir.json</span><span style="font-size:12.0pt"> file  does not show any bits with the metadata field.  An operative question is which IR does the –toJSON dump, especially, in comparison to the MidEndLast
 pass?  Then, the next question is, why the 16 bits do not show up in the JSON output below?  How does a backend know the metadata fields comprises of 16 bits?  Did I miss anything in the JSON IR below? 
<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;font-family:"Courier New"">{<br>
        "Node_ID" : 978058,<br>
        "Node_Type" : "Type_Struct",<br>
        "name" : "mystruct_t",<br>
        "declid" : 369,<br>
        "annotations" : {<br>
          "Node_ID" : 3<br>
        },<br>
        "fields" : {<br>
          "Node_ID" : 978059,<br>
          "Node_Type" : "IndexedVector<StructField>",<br>
          "vec" : [<br>
            {<br>
              "Node_ID" : 978060,<br>
              "Node_Type" : "StructField",<br>
              "name" : "metadata",<br>
              "declid" : 5560,<br>
              "annotations" : {<br>
                "Node_ID" : 978061,<br>
                "Node_Type" : "Annotations",<br>
                "annotations" : {<br>
                  "Node_ID" : 978062,<br>
                  "Node_Type" : "Vector<Annotation>",<br>
                  "vec" : [<br>
                    {<br>
                      "Node_ID" : 978063,<br>
                      "Node_Type" : "Annotation",<br>
                      "name" : "MY_annotation",<br>
                      "expr" : {<br>
                        "Node_ID" : 978064,<br>
                        "Node_Type" : "Vector<Expression>",<br>
                        "vec" : [<br>
                          {<br>
                            "Node_ID" : 978065,<br>
                            "Node_Type" : "StringLiteral",<br>
                            "type" : {<br>
                              "Node_ID" : 55225<br>
                            },<br>
                            "value" : "(FOO)",<br>
                            "Source_Info" : {<br>
                              "filename" : "/home/hemant/mySwitch.p4",<br>
                              "line" : 71,<br>
                              "column" : 25,<br>
                              "source_fragment" : """<br>
                            }<br>
                          }<br>
                        ]<br>
                      },<br>
                      "Source_Info" : {<br>
                        "filename" : "/home/hemant/mySwitch.p4",<br>
                        "line" : 71,<br>
                        "column" : 0,<br>
                        "source_fragment" : "@"<br>
                      }<br>
                    }<br>
                  ]<br>
                },<br>
                "Source_Info" : {<br>
                  "filename" : "/home/hemant/mySwitch.p4",<br>
                  "line" : 71,<br>
                  "column" : 0,<br>
                  "source_fragment" : "@MY_annotation("(FOO)")"<br>
                }<br>
              },<br>
              "type" : {<br>
                "Node_ID" : 456<br>
              },<br>
              "Source_Info" : {<br>
                "filename" : "/home/hemant/mySwitch.p4",<br>
                "line" : 72,<br>
                "column" : 12,<br>
                "source_fragment" : "metadata"<br>
              }<br>
            }<br>
          ],<br>
          "declarations" : {<br>
            "metadata" : {<br>
              "Node_ID" : 978060,<br>
              "Node_Type" : "StructField",<br>
              "name" : "metadata",<br>
              "declid" : 5560,<br>
              "annotations" : {<br>
                "Node_ID" : 978061<br>
              },<br>
              "type" : {<br>
                "Node_ID" : 456<br>
              }<br>
            }<br>
          }<br>
        },<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;background:white">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;background:white"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;background:white">Hemant<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Courier New";background:white"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>