[Click] "Graft" ports (was: Scoping/naming issues)
Philip Prindeville
philipp_subx at redfish-solutions.com
Thu Jan 20 18:59:25 EST 2011
I've been thinking about this some more...
If I have the following:
elementclass Foo {
stuff1 -> external-object -> stuff2;
}
then this can be rewritten as:
elementclass Foo {
stuff1 -> [N] output;
input [M] -> stuff2;
}
f :: Foo;
f [N] -> external-object -> [M] f;
I'd like to propose a notational convenience called "graft" (as in a graft-point).
graft[0] would be short-hand for 1+ the highest used input, and [0] graft would be 1+ the highest used input.
(and so on for [1], [2], etc.)
We'd need a new operator for graft-points. Maybe:
f [G]<-> [a] external-object [b]<-> [G] f;
it would be a syntactic error to mismatch subscripts for the object being grafted to.
The notation inside the elementclass would be:
elementclass Foo {
stuff1 -> graft [G] -> stuff2; // or ... [G] graft ...
}
Does that make sense?
-Philip
On 1/18/11 3:43 PM, Beyers Cronje wrote:
> The config you posted below Ian explicitly states "This would be legal:" at
> the top. I think Ian is referring to the second config that will cause
> issues:
>
> "
> I think this should complain that fd[0] is being used twice (port
> connection error), although it may take a minute to see why that's the
> case (and would be much trickier to see in a more complex config):
> --------------------------------------
> fd::FromDevice(...);
>
> elementclass Bar {
> fd[0] -> Print() -> [0]output;
> }
>
> a::Bar() -> Discard();
> b::Bar() -> Discard();
> --------------------------------------
> "
>
>
> On Wed, Jan 19, 2011 at 12:32 AM, Philip Prindeville<
> philipp_subx at redfish-solutions.com> wrote:
>
>> On 1/18/11 7:34 AM, Ian Rose wrote:
>>> If I am thinking this through correctly, IMHO it wouldn't be a good idea
>>> to allow elementclasses to do this. Reason being that in some cases you
>>> could create port connection errors merely through declaring multiple
>>> elements of your new elementclass type. This would be an unexpected and
>>> confusing error since its impossible to do currently. AFAIK currently
>>> there are no errors that can occur merely by *declaring* too many
>>> elements of some type. So this would introduce a whole new category of
>>> error. Some examples:
>>>
>>> This would be legal:
>>> --------------------------------------
>>> fd::FromDevice(...);
>>>
>>> elementclass Bar {
>>> fd[0] -> Print() -> [0]output;
>>> }
>>>
>>> a::Bar() -> Discard();
>>> --------------------------------------
>>>
>>> I think this should complain that fd[0] is being used twice (port
>>> connection error), although it may take a minute to see why that's the
>>> case (and would be much trickier to see in a more complex config):
>> Sorry, not seeing why the above case represents using the port twice...
>>
>>
>>> --------------------------------------
>>> fd::FromDevice(...);
>>>
>>> elementclass Bar {
>>> fd[0] -> Print() -> [0]output;
>>> }
>>>
>>> a::Bar() -> Discard();
>>> b::Bar() -> Discard();
>>> --------------------------------------
>>>
>>> In order to cause this same error currently (without the proposed
>>> elementclass enhancement) you'd have to do this, which I think makes the
>>> error more obvious:
>>> --------------------------------------
>>> fd::FromDevice(...);
>>>
>>> elementclass Bar {
>>> input[0] -> Print() -> [0]output;
>>> }
>>>
>>> fd[0] -> a::Bar() -> Discard();
>>> fd[0] -> b::Bar() -> Discard();
>>> --------------------------------------
>>>
>>>
>>> Just my $0.02.
>>>
>>> - Ian
>>>
>>>
>>> On 01/17/2011 07:55 PM, Philip Prindeville wrote:
>>>> Yeah, it especially makes sense to have arpfoo be global if it needs to
>> be accessible from two different elementclass's, one that deals with the IP
>> flow (input [0] and output [0]) and another one that deals strictly with the
>> ARP request/reply flow (input [1] and output [1]).
>>>> Someone else will have to come up with the patches... I've not yet
>> dabbled in the code itself.
>>>>
>>>> On 1/17/11 4:35 PM, Eddie Kohler wrote:
>>>>> Hi Philip,
>>>>>
>>>>> I can see why you thought compound elements would work that way, but
>> they don't. They are very strictly encapsulated: all connections to other
>> elements must take place through explicit inputs and outputs.
>>>>> I admit it would make sense to do it the way you've imagined. Patches
>> welcome...
>>>>> Eddie
>>>>>
>>>>>
>>>>> On 1/15/11 2:53 PM, Philip Prindeville wrote:
>>>>>> I've got a configuration where I do:
>>>>>>
>>>>>> ...
>>>>>> arpfoo :: ARPQuerier(...);
>>>>>>
>>>>>> elementclass Bar {
>>>>>> ...
>>>>>> class :: classifier(...);
>>>>>> ...
>>>>>> class [2] -> [1] arpfoo;
>>>>>> ...
>>>>>> }
>>>>>>
>>>>>>
>>>>>> but it complains that "unknown element class 'arpfoo'" in a few
>> places, and that input 1 isn't used...
>>>>>> So I'm confused. Everything is scoped globally... even stuff defined
>> within an elementclass gets scoped globally.
>>>>>> Why then can't I access a global variable from within an
>> elementclass's scope?
>>>>>> What am I missing?
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> -Philip
>>
More information about the click
mailing list