Fw: Contributions (was Re: disallow distributed switch branches)

From: Jonathan David <j.david_at_.....>
Date: Mon Apr 30 2007 - 11:24:24 PDT
sorry , meant to send this to the reflector.. 
 
Jonathan David
j.david@ieee.org
jb_david@yahoo.com
http://ieee-jbdavid.blogspot.com
Mobile 408 390 2425
Work:
jbdavid@scintera.com
http://www.scintera.com
408 636-2618

----- Forwarded Message ----
From: Jonathan David <jb_david@yahoo.com>
To: Kevin Cameron <kevin@sonicsinc.com>
Sent: Monday, April 30, 2007 11:23:42 AM
Subject: Re: Contributions (was Re: disallow distributed switch branches)

Ok, let me weigh in here with a users perspective. 

there are 3 primary reasons I want oomrs.. 
1. for testbench & instrumentation.. I want to be able to access the value of a node/branch in another design element, without making that a port.
In general this doesn't involve contributions - but digital designers quickly learned they needed a "deposit value"  for their debug and simulation. 
What if I wanted to run several AC sims with different starting points.. - I could use an oomr to add the AC signal across the various starting point branches with out having to modify the design or the testbench 
Generally the modification would be to insert a 0v ac=1 source in series with the other stuff in that branch.. 
so the contribution effect (adding to what is existing) would be the right behavior.. 
2. for parasitic insertion.. Here I want to connect an electric or magnetic field from a net (that is not a port) of one block to a net of another block that is at an arbitrary level of the hierarchy.   for the Efield the field strength will be in proportion to the  area of the effect  section of the wire, and inversely proportional to the distance (ie a Capacitor)   - as this creates a new branch  it  might be  more  appropriate to form this  as 
I(branch) <+ C*ddt(V(branch)) - so that additional parasitics(on the same node pair)  would contribute in parallel.. 
The magnetic coupling is harder - as you need to identify the specific affected part of the branch and contribute a voltage  proportional to the current in a different branch.. - but still you add the voltage to any other voltage on that branch.. 
3 for configuration and fault testing - to be able to make similar kinds of changes to the design the end user(or faulty equipment)  could do.. I wouldn't say Kevin's construct is moot, but in chip design you generally can't short two internal nodes without bringing them out of the package 
1. doing it as a 0v short would likely be a problem, and its not realistic any way.. rather we'd want to create a low resistance branch.. and then if there is a existing branch that has a voltage source we don't create the two voltage source problem.. 
If you are adding a voltage source where one already existed, why are you doing that - why wouldn't you just modify the one that is there.. ? ( ie pass down a parameter to that one, creating opens and shorts are sort of the worst case.. and in someways might be better done in other ways outside of the simulation. 

It seems to me, that like with tools that walk the design to recored logic levels, and now they need to query the net type to see if a logic level is available to be recorded.. - we would want a similar capability to determine if a voltage source already exists on a particular branch.. - to know if I need to break the existing branch and add a new element, (add in series) or add a new element in parallel.. - but if you are adding in parallel, it should probably always be in the current source form and/or should include a finite resistance. 

--- In my (quick and dirty) thought exercise I see no reason to forbid contributions across block boundaries and yes I WOULD want a contribution type of  behavior.. 

so if this is the case, then the problem is only in the simulators.. 
is there a simulator requirement to forbid contributions to the same node from different blocks? ie to allow multi-rate simulation etc.. 
- really the only problem here is when folks try to make a short circuit with V(a) <+ 0 .. and another block adds a different voltage too that.. 
Perhaps the easy way around that would be to allow a local branch declaration so that you could create in a block a branch that cannot be contributed to from outside that block.. 
but a better way might be to deprecate switch branches.. of this sort in favor of a other sorts of switches.. 
Ie contribute a current between two nodes proportional to a variable resistance 
if two blocks contribute to the same branch quantity but are evaluated at different times, I would exect the behavior to be like that of accessing a voltage from the digital side.. the contribution from the non-evaluated branch would be a linear interpolation between its most recent value and its next value.. 
(some simulators might make an approximation that its the most recent value projected with its rate of change .. but that might get into simulator design rather then language design.. 




 
 
Jonathan David
j.david@ieee.org
jb_david@yahoo.com
http://ieee-jbdavid.blogspot.com
Mobile 408 390 2425
Work:
jbdavid@scintera.com
http://www.scintera.com
408 636-2618

----- Original Message ----
From: Kevin Cameron <kevin@sonicsinc.com>
To: Verilog-A Reflector <verilog-ams@eda.org>
Cc: Ken Kundert <ken@designers-guide.com>
Sent: Monday, April 30, 2007 10:02:43 AM
Subject: Re: Contributions (was Re: disallow distributed switch branches)

Ken Kundert wrote:
> edaorg@v-ms.com wrote:
>   
>> Ken Kundert wrote:
>>     
>>> All,
>>>     One of the original reasons why we went with the contribution
>>> operator with its accumulating nature as opposed to a equality operator
>>> when the language was first designed was that it neatly addressed the
>>> question of "what happens if you apply it more than once to the same
>>> branch". There are two choices if you use an equality operator:
>>> 1. it is an error
>>> 2. one wins
>>> Neither seemed like a very good alternative, but in the case of OOMRs in
>>> particular it was decided that neither was desirable. Consider each case:
>>> 1. if it is an error to give a value to a branch more than once, then
>>> once a branch is given a value in a module, then it could never be given
>>> a value via an OOMR. Since it is likely that any branch that one might
>>> want to give a value to via an OOMR would already have a value, this
>>> seemed like too big a restriction.
>>> 2. if only one wins when two values are given to a branch, how is it
>>> decided which value wins, particularly if both values are being given
>>> via OOMRs.
>>>   
>>>       
>> That's what the solver is for, it's not some kind of race condition.
>>     
>
> The situation is ambiguous. There are two equations when there should
> only be one. With the accumulating nature of the contribution operator
> we define how they should be combined. If we remove the accumulating
> nature, then we must define some other way for the ambiguity to be resolved.
>   
Are you talking about the accumulating nature of the "<+" operator or 
just branches in general?
>   
>>> Since the accumulating nature of the contribution operator was added to
>>> the language specifically to support OOMRs, it seems odd that we are now
>>> considering stripping this feature, but only for OOMRs. Has there been
>>> some issue with the contribution operator and OOMRs? I have heard people
>>> voice an opinion that they would prefer that it be changed, but nobody
>>> has pointed out any real problems with the way it works now or what
>>> significant new capability would be gained if a change were made.assignments
>>>       
>> [Don't recall the accumulating nature of the operator having much to do
>> with OOMRs myself, I suspect the OOMR stuff was pretty much an
>> afterthought.]
>>
>> The current behavior is inconsistent in that if you wire something up
>> with OOMRs vs using ports then you can get different behavior. To
>> someone with a good understanding of electronics and digital Verilog
>> it's not at all obvious that an OOMR potential contribution will add in
>> series with other potential contributions to a branch - the obvious
>> behavior would be that it was in parallel (as with using ports).
>>     
>
> I am at a loss to understand why it is a problem that contributions do
> not behave the same as port connections, especially since doing so would
> make OOMR contributions inconsistent with in-module contributions.
>   
I would differentiate "in-module" and "in-block", this discussion sprang 
out of issues related to having multiple analog blocks in a module.

While I have no real issues with the "<+" in-block behavior, I don't see 
the logic in extending it to in-module (for multiple blocks) or to OOMRs.

The problem is that if you take an analog block which is in one module 
and another in another module that contribute to the same nodes, then 
the behavior can change if you put them in the same module (but 
otherwise connect them the same). My view is that is a subtlety that 
most engineers are not going to appreciate and it will become a source 
of bugs.
>   
>> IMO the easiest way out of the problem is to deprecate "<+" as an
>> operator for OOMRs, and use a new operator which is explicitly indicates
>> that the contribution is in series or parallel (e.g. <++,<=).
>>     
>
> Again, we seem to be proposing changes for the sake of change. Is there
> a documented problem we are trying to solve?
>   
Yes. "<+" on OOMRs gives a different behavior than regular port 
connection, and there is no operator to get the same behavior as port 
connection. I don't believe the average user will be aware of the 
difference in behavior so that usage should be discouraged.

I case I'd consider possible is where in some higher level of a design 
you decide you need to short some connections on a pcb so you do:

       V(a.b.x,a.b.y) <+ 0.0;

If someone else had decided to add noise on that branch a level down -

      V(b.x,b.y) <+ noise_fn();

Then do you have a) failure because you can't drive two different 
voltages, or b) the noise, or c) 0 Volts.

I think a) is the correct behavior for the simulator, b) seems to be 
what you are advocating, and c) is what the user actually wanted.

Kev.
 

> -Ken
>
>   
>> Kev.
>>
>>     
>>> -Ken
>>>
>>> Kevin Cameron wrote:
>>>   
>>>       
>>>> To back up a bit in the discussion, I'd agree "<+" is a bit odd, but
>>>> it's not that dissimilar to "+=" in C. The only objection I had was to
>>>> extending the summing semantic to OOMRs and between analog blocks for
>>>> potentials, which is why I suggested using "<++" to make that case
>>>> explicit. Likewise I would have no problem with introducing a
>>>> non-summing operator (say "<=") if that makes it clearer to users what
>>>> is going on, that would then probably require another operator to match
>>>> the "<++" (say "<=+") for symmetry. Given that modelers then use "<="
>>>> instead of "<+", why would they expect any summing of potential
>>>> contributions for OOMRs or between blocks when using "<="?
>>>>
>>>> I think re-using operators from other languages would be a bad idea
>>>> unless they do exactly the same thing.
>>>>
>>>> Kev.
>>>>
>>>> Geoffrey.Coram wrote:
>>>>     
>>>>         
>>>>> Marq -
>>>>> In most cases, though, the distinction doesn't matter:
>>>>> if you don't expect the contributions to accumulate,
>>>>> then you write your model with a single contrib and
>>>>> everything works fine; or you have multiple contribs
>>>>> of complicated expressions, and for efficienct, you
>>>>> don't want to compute the complicated expressions that
>>>>> you don't need.  It'd be odd to have
>>>>>
>>>>>   I(br) <+ (some complicated expression);
>>>>>   if (off)
>>>>>     I(br) <+ 0; //does not set branch current to zero!
>>>>>
>>>>> If it's off (the idea is that the user wanted to turn
>>>>> the current off), it seems that the user would have
>>>>> wanted to bypass the complicated expression:
>>>>>   if (off)
>>>>>     I(br) <+ 0;
>>>>>   else
>>>>>     I(br) <+ (some complicated expression);
>>>>>
>>>>>
>>>>> The curious nature of the contrib is mentioned explicitly
>>>>> in my tutorials for writing Verilog-A compact models ...
>>>>>
>>>>> -Geoffrey
>>>>>
>>>>>
>>>>>
>>>>> Marq Kole wrote:
>>>>>  
>>>>>       
>>>>>           
>>>>>> All,
>>>>>>
>>>>>> I would even say that most users starting to write models for
>>>>>> Verilog-AMS are quite unaware of this. They write their models as
>>>>>> though it were a simple assignment - only in rare cases or when they
>>>>>> start to work on more complicated models will they start looking at
>>>>>> the actual LRM text and discover the contribution behavior. The same
>>>>>> goes for the implicit equations for that matter...
>>>>>>
>>>>>> Just my $0.02.
>>>>>>
>>>>>>     
>>>>>>         
>>>>>>             
>>>>>   
>>>>>       
>>>>>           
>>>>     
>>>>         
>>>   
>>>       
>> ------------------------------------------------------------------------
>>  
>> http://www.grfx.com <http://www.grfx.com>mailto:dkc_ f rom _grfx.com <mailto:dkc_ f rom _grfx.com>
>>
>>     
>
>   


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.








-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Mon Apr 30 11:24:48 2007

This archive was generated by hypermail 2.1.8 : Mon Apr 30 2007 - 11:24:58 PDT