[P4-dev] Where should the operations on arbitrary-precision integers be declared?

Christian Esteve Rothenberg chesteve at dca.fee.unicamp.br
Mon Jun 20 18:06:46 EDT 2016


Thanks Antonin!

Ch
On Jun 20, 2016 6:38 PM, "Antonin Bas" <antonin at barefootnetworks.com> wrote:

> Cool, thanks for letting me know
>
> On Mon, Jun 20, 2016 at 2:37 PM, Javier <richardqa at gmail.com> wrote:
>
>> It works now,
>>
>> Thank you so much Antonin
>>
>> regards
>> Javier
>>
>> 2016-06-20 17:26 GMT-03:00 Javier <richardqa at gmail.com>:
>>
>>> It is "9a2d5aa38" march 24:(
>>>
>>> Please let me try to do it again with the new commit. I write then
>>>
>>> Thank you so much
>>> Javier
>>>
>>> 2016-06-20 17:17 GMT-03:00 Antonin Bas <antonin at barefootnetworks.com>:
>>>
>>>> What is the latest commit in your behavioral-model clone? Because I
>>>> added modulo support this morning...
>>>>
>>>> On Mon, Jun 20, 2016 at 1:12 PM, Javier <richardqa at gmail.com> wrote:
>>>>
>>>>> Hi Antonin,
>>>>>
>>>>> Thank you so much for the reply,
>>>>>
>>>>> I tried to replicate the code simple_router.p4 with p4v1.1 using the
>>>>> ideas that you comment: "http://pastebin.com/hukUDq4e"
>>>>>
>>>>> As you see, I added one new action "myaction" and one new table "c".
>>>>>
>>>>> From command.txt, I just add one entry:
>>>>>
>>>>> table_add c myaction 0 => 5 3 0
>>>>>
>>>>> Now, in the action ""set_nhop", I changed this line:
>>>>>
>>>>> +    ipv4.ttl = ipv4.ttl - 1;
>>>>> -     ipv4.ttl = ipv4.ttl - routing_metadata.f1;
>>>>>
>>>>> Now, I execute run_demo.sh and all ok, but when I do ping between h1
>>>>> and h2  I should get this value 62? (64 - 5mod3), However i didn't get to
>>>>> ping between them (no reply).
>>>>> If I change the operator '%' to '*' operator It works  64 - 3*5=49
>>>>> when ping h1,h2.
>>>>>
>>>>> Could you tell me whether am I doing something bad please?
>>>>>
>>>>>
>>>>> Thank you in advance,
>>>>> Javier
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> 2016-06-20 15:39 GMT-03:00 Antonin Bas <antonin at barefootnetworks.com>:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>>
>>>>>> I just noticed that modulo and divide where not supported by the P4
>>>>>> frontend, so I made the change. In P4v1.1, using modulo would look like
>>>>>> this:
>>>>>> action my_action(in int<32> a, in int<32> b) {
>>>>>>     modify_field(*h1.f1*, a % b);  // a >= 0, b > 0
>>>>>>     // or *h1.f1* = a % b;
>>>>>> }
>>>>>> The second syntax is supported by the p4-hlir compiler, but I don't
>>>>>> think it is described in the official spec.
>>>>>> This action can then be referenced by a table.
>>>>>> Really now that I have made the change in the frontend, using
>>>>>> "modulo" is no different from using "add" or "substract". See
>>>>>> https://github.com/p4lang/tutorials/blob/master/p4v1_1/simple_router/p4src/simple_router.p4#L129
>>>>>> for a P4v1.1 program.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Antonin
>>>>>>
>>>>>> On Mon, Jun 20, 2016 at 4:53 AM, Christian Esteve Rothenberg <
>>>>>> chesteve at dca.fee.unicamp.br> wrote:
>>>>>>
>>>>>>> Thanks Antonin for your comprehensive reply!
>>>>>>>
>>>>>>> Are you aware of any publicly available P4 code example using the
>>>>>>> modulo operation?
>>>>>>>
>>>>>>> Just a code snippet would suffice...
>>>>>>>
>>>>>>> thanks,
>>>>>>> Christian
>>>>>>>
>>>>>>> On Fri, Jun 17, 2016 at 5:05 PM, Antonin Bas
>>>>>>> <antonin at barefootnetworks.com> wrote:
>>>>>>> > Hi Javier,
>>>>>>> >
>>>>>>> > In P4v1.1, the only variables you have are fields (packet fields
>>>>>>> and
>>>>>>> > metadata fields), and they have global scope. These variables all
>>>>>>> have a
>>>>>>> > type which includes their bitwidth (with the exception of the very
>>>>>>> specific
>>>>>>> > variable-length field case). For example, the ethernet header can
>>>>>>> be
>>>>>>> > declared as follows:
>>>>>>> >
>>>>>>> > header_type ethernet_t {
>>>>>>> >     fields {
>>>>>>> >         bit<48> dstAddr;
>>>>>>> >         bit<48> srcAddr;
>>>>>>> >         bit<16> etherType;
>>>>>>> >     }
>>>>>>> > }
>>>>>>> >
>>>>>>> >
>>>>>>> > Notice that all three fields are bitstrings. One can also declare
>>>>>>> fields has
>>>>>>> > signed integers (int<w>), usually this is more useful for some
>>>>>>> metadata
>>>>>>> > fields.
>>>>>>> > As mentioned in the spec, you cannot declare fields a "int"
>>>>>>> (without a
>>>>>>> > width). This is reserved for evaluation of compile-time constants.
>>>>>>> The "int"
>>>>>>> > type is used by the compiler but is hidden from the P4 programmer.
>>>>>>> For
>>>>>>> > example, let's look at the following code:
>>>>>>> > ethernet.etherType = (bit<16>) (11111111 - 1);
>>>>>>> > The compiler will use the internal "int" type to represent
>>>>>>> compile-time
>>>>>>> > constants 11111111 and 1. It will also compute the difference,
>>>>>>> 11111110,
>>>>>>> > which is also of type "int". This is what we call
>>>>>>> "arbitrary-precision
>>>>>>> > arithmetic" since the compiler can handle arbitrarily large
>>>>>>> compile time
>>>>>>> > constants. Finally the compiler should give you a warning because
>>>>>>> 11111110
>>>>>>> > cannot be represented using 16 bits and the most significant bits
>>>>>>> will be
>>>>>>> > lost.
>>>>>>> >
>>>>>>> > Best,
>>>>>>> >
>>>>>>> > Antonin
>>>>>>> >
>>>>>>> >
>>>>>>> > On Thu, Jun 16, 2016 at 4:13 PM, Javier <richardqa at gmail.com>
>>>>>>> wrote:
>>>>>>> >>
>>>>>>> >> Hi everyone,
>>>>>>> >>
>>>>>>> >> I am trying to use the operations on "arbitrary-precison constant
>>>>>>> >> integers", however I dont get to know how to declare these
>>>>>>> constant
>>>>>>> >> integers. In the P4 spec for v1.1 tell that "the only values that
>>>>>>> can have
>>>>>>> >> the type int are compile-time constants" but it doesn't show how
>>>>>>> to use it.
>>>>>>> >> For example, i want to use the operator modulo to get the modulo
>>>>>>> of two
>>>>>>> >> variables, where and how should I declare these variables?.
>>>>>>> >>
>>>>>>> >> Thank in advance,
>>>>>>> >> Javier
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> --
>>>>>>> >> Saludos Cordiales
>>>>>>> >> Javier
>>>>>>> >> Fingerprint: 7AF8 4E03 66C2 2663 3A77  7067 6B5A D8F9 EE91 47BE
>>>>>>> >>
>>>>>>> >> _______________________________________________
>>>>>>> >> P4-dev mailing list
>>>>>>> >> P4-dev at lists.p4.org
>>>>>>> >> http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org
>>>>>>> >
>>>>>>> >
>>>>>>> >
>>>>>>> >
>>>>>>> > --
>>>>>>> > Antonin
>>>>>>> >
>>>>>>> > _______________________________________________
>>>>>>> > P4-dev mailing list
>>>>>>> > P4-dev at lists.p4.org
>>>>>>> > http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Antonin
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Saludos Cordiales
>>>>> Javier
>>>>> PhD Student (UNICAMP)
>>>>> http://www.linkedin.com/in/richardqa
>>>>> Fingerprint: 7AF8 4E03 66C2 2663 3A77  7067 6B5A D8F9 EE91 47BE
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Antonin
>>>>
>>>
>>>
>>>
>>> --
>>> Saludos Cordiales
>>> Javier
>>> PhD Student (UNICAMP)
>>> http://www.linkedin.com/in/richardqa
>>> Fingerprint: 7AF8 4E03 66C2 2663 3A77  7067 6B5A D8F9 EE91 47BE
>>>
>>
>>
>>
>> --
>> Saludos Cordiales
>> Javier
>> PhD Student (UNICAMP)
>> http://www.linkedin.com/in/richardqa
>> Fingerprint: 7AF8 4E03 66C2 2663 3A77  7067 6B5A D8F9 EE91 47BE
>>
>
>
>
> --
> Antonin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.p4.org/pipermail/p4-dev_lists.p4.org/attachments/20160620/2ec90480/attachment-0002.html>


More information about the P4-dev mailing list