kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #10382
Re: layer based constraints
If this feature would work neither with freerouter, nor Cern's push and shove router, then
it would be useless to me.
I currently use freerouter in p&s mode exclusively, never route in kicad.
Tom, if he had time might comment on the likelihood of support for something like this in
his p&s work for internal pcbnew.
On 05/07/2013 11:30 AM, Simon Huwyler wrote:
> I have worked a bit more on the idea of the “layer based constraints”. We
> have already argued quite a bit about how one should tell KiCad about
> different constraints on different layers. But I think, we all more or less
> agree that there are realistic use cases where a constraint is not only
> dependent on the net, but also on the layer (and maybe other things).
>
> So, the routine getConstraint() (with or without an ‘other’ item passed as
> argument) should get another argument: LAYER_NUM aLayer, because, as soon as
> the layer, in one way or the other, influences the minimal acceptable
> clearance between different nets, I have to distinguish between these nets.
> For all these connectedItems that are only on one layer (like tracks), the
> item can just check on which layer it is, and return the appropriate value.
> But there are also pads and vias. And here, it is not sufficient anymore to
> just ask “what is the miminal clearance around you”? Instead, I have to ask:
> What is the minimal clearance around you on layer two?” That’s why I
> inserted the additional argument aLayer. Of course, I included it on all
> connectedItems because of subtyping. A track, for example, just ignores it
> and takes its own layer as a reference.
>
> Ok, then, I did another thing: ConnectedItems can show their clearance as a
> line around the item, which is one of the best features of KiCad, if you ask
> me. I LOVE this feature! But now, I had a problem with it. Again, if an item
> is on only one layer, it’s fine. Just show the clearance according to the
> layer of the track. But what about a pad? A pad can “sit” on all layers. So,
> which clearance to show? Possible anwers:
>
> - none
> - the net-based clearance (only feasable if we ARE separating net-based and
> layer-based clearances, and not mixing them in any way)
> - all clearances, in the respective color
> - the clearance according to the layer that is currently active, if it is a
> copper layer, and none if it is a non-copper layer.
>
> I, for my personal branch, decided to pick the last solution. But this
> confronted me with another question: If I am on layer two, and there is a
> multi-layer pad, a track on layer two and a track on layer one. What do I
> expect to see?
> I decided that I would like to see the clearances on layer two. Nothing
> else. So, the pad shows me the clearance it has on layer two. And the pad,
> that is on layer two, shows me its clearance, and the track on layer shows
> no clearance line.
> I hacked this behavior and must say that I like it. I never checkt “always”
> at “show tracks clearances”, because it was just too much information. But
> with my patch, I now think I’m going to stay at this option. It shows my all
> clearances I have to respect on the layer that is currentla active (a.e. the
> layer on which I am placing tracks at the moment). After all, I don’t care
> about a layer two’s clearance if I’m on layer one.
>
> I will upload a branch eventually so you guys can have a look at it. Not so
> much to press my implementation of it into a release (there's no chance for
> it, either ;-), but more to let you get a feeling of it, because I really
> think this is an issue. I think, a good CAE tool should take the layer into
> account when it comes to constraints. And as KiCad IS a very good tool, it
> is proven by induction, that KiCad should be able to handle this! :-) Just
> kidding....
>
> Now, there are still other things, like, for example, constraints between
> two defined nets, area based constraints... all the fancy stuff. Of course,
> we could add also these things as additional parameters... or we could pass
> an object containing all important parameters an item has to know to
> calculate the clearance. Or... hmmm... just a reference to the caller item:
> - Item xy, tell me, please, how much clearance I have to keep to you. I am
> item yz.
> - Item yz, on what layer are you? And what’s your net?
> - Ok, Item xy, please stay 2mm away from me.
>
> Oh, I almost forgot: There is another thing that, as I suppose, is quite
> connected to this issue: Pads with defined pad-stacks. Say, I want to insert
> a pad on the outer layers, but on the inner layers, there should be no
> copper (or less copper). This surely influences the clearance. Again, the
> clearance strongly depends on the layer on which I am approaching the pad.
>
>
> What do you think? Is this worth a blue-print?
> I really really like the idea of implementing such a thing. I am, actually,
> now starting to work productively with my patch (but only as a hobbyist) and
> up to now, I really like also the slightly changed look-and-feel as
> described above.
>
> - I can define clearance and width constraints for every layer (which is, as
> I said, very useful to me because of manufactuer’s constraints)
> - I am shown all clearances (max of net-based and layer based) on the active
> layer
> - when I place a track with the “standard” thickness setting, it gets me the
> actual thickness of the net on the layer I am.
> - When I switch layers (a.e. place a via) the width changes according to the
> new rules (same net, but different layer, again, the max i taken).
> - It, of course, also gives me the the updated clearance.
> - Pads: It shows me the clearance for the actual layer (or none, of it is
> not a copper layer).
> - copper fills are taking taking care of the different layer constraints
> around pads.
> - DRC I didn’t check intensively yet, but should work.
>
> I am very well aware that it’s a bad idea to just take this first
> realization into the main branch instead of really thinking about future
> features, and how to do it right. As I said, I don't intend this branch to
> be merged as-is, but more as a basepoint for some discussion.
>
>
> Greets
> Simon
>
>
> -----Ursprüngliche Nachricht-----
> From: Dick Hollenbeck
> Sent: Sunday, April 28, 2013 3:12 PM
> To: kicad-developers@xxxxxxxxxxxxxxxxxxx
> Subject: Re: [Kicad-developers] layer based constraints
>
> On 04/27/2013 12:10 PM, Lorenzo Marcantonio wrote:
>> On Sat, Apr 27, 2013 at 11:11:54AM -0500, Dick Hollenbeck wrote:
>>> But how important is that really? Will it result in a reduction in pay?
>>>
>>> The "common" user has been a hobbyist, and is becoming a corporate
>>> employee as the
>>> software gets better.
>>
>> OK, even most of the corporate employees have probably 0% of
>> understanding a boolean expression. Unless he's a digital designer :D
>> woes on him in that case
>>
>>> So while I agree, I think the importance of this concern is minimal.
>>> Actually zero.
>>> If we like it, that should be good enough. We are corporate employees,
>>> and are paying to
>>> make this software useable for our needs. You said yourself the same
>>> thing.
>>
>> Agree on that. But if it's possible to make it usable for the
>> non-programmer people (without too much work) then it's better.
>> Otherwise I'd looking for components using grep instead of the component
>> browser for example (the sad thing is that often grepping is more
>> effective...)
>>
>>> Great idea, do it. It seems we are all still open to the best ideas.
>>
>> In a previous message I wrote about how CAM350/gerbtool do DRC. The CAM
>> products are for 60% DRC beasts so they know how to do their job:D
>>
>> Eagle has a simple netclass-to-netclass clearance. I haven't used any
>> other of the 'big ones' (Altium, Allegro, PADS or Expedition) so I don't
>> really know how they handle it. Many entry level products don't have even
>> a netclass notion, so we already are way above them:D
>>
>>> Is there a way we can provide a python expression, but do most of the
>>> work in C++?, by
>>> implementing the functions being called in C++ behind the expression, by
>>> following the
>>> python C API.
>>>
>>> This is a slight variation on the original idea, which can be a way to
>>> turbo charge it,
>>> maybe to cut out a few lookups at runtime.
>>>
>>> Obviously the python expressions can all be "pre-compiled", but I don't
>>> think they can be
>>> "pre-evalutated" when "both" is in play, since that is a dynamic match
>>> maker.
>>
>> Caching (memoizing, actually) strategies for the python calls would
>> depend on the data available to the call. Assuming the function is pure
>> (i.e. depending only on the passed parameters) you could cull *a lot* of
>> calls.
>>
>> Example (in C, I don't know python enough): function returning
>> the clearance (one of the contended values) between two netclasses and
>> the current layer; with only the minimum data we'd have:
>>
>> int dynamic_clearance(const char *netclass1, const char *netclass2,
>> const char *layer);
>>
>> *iif* the implementation is pure, as from the hypothesis, there are no
>> external dependancies and no collateral effects so *every* call with
>> a tuple (triplet) would always return the same value. Put it in a map
>> (memoize it) and you have just resolved the clearance issues between
>> these two classes on that layer with just one python call. AFAIK
>> memoizing is a standard idiom in python, too.
>>
>> More flexibility reduces optimization possibilities. Let's say we pass
>> the netnames too (don't ask why, maybe the user wants more granularity
>> than netnames, no idea)
>>
>> int dynamic_clearance(const char *netclass1, const char *netclass2,
>> const char *netname1, const char *netname2,
>> const char *layer);
>>
>> Here memoizing is a lot less effective... you only cache clearance
>> between two nets (the netclasses are actually redundant and passed as
>> convenience). However you would optimize the common case of buses
>> wandering around the board. Still a good improvement, probably.
>>
>> At the other end, if the decision function has the whole segment
>> information at hand:
>>
>> int dynamic_clearance(const char *netclass1, const char *netclass2,
>> const char *netname1, const char *netname2,
>> const char *layer, int stuff, int other_stuff...)
>>
>> Then we gain *no* performance since (ideally) every segment is tested
>> against any other segment just once. In fact caching overhead would
>> probably make it slower than without.
>>
>> That said, maybe a python call is just so fast that the big time is
>> spent computing distances maybe. Or the bottleneck is in the string
>> comparison. If it was LUA instead of Python I'd say to directly call the
>> function without any doubt (LUA strings are interned so the string
>> equality is pointer equality for example, and the byte code interpreter
>> is... well, fast).
>>
>> As you said instrumented profiling is needed, at least to compare the cost
>> of a python call to the rest of the stuff in the DRC routines.
>
>
> Caching is an interesting idea to keep in our toolbox. I think C++ has some
> great
> potential in developing some wrapper classes for making use of python
> expessions fairly
> painless. It is an area I hope to contribute to when I have some more time.
>
> Each year we host a large memorial day party here at the ranch, and often
> have a pig roast
> on a spit. The preparations for that can get overwhelming and start weeks
> in advance. So
> this has reached full scale as of this weekend. Time is more scarce than
> ever.
>
> Dick
>
>
>
>>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help : https://help.launchpad.net/ListHelp
>
>
Follow ups
References
-
layer based constraints
From: Simon Huwyler, 2013-04-24
-
Re: layer based constraints
From: Dimitris Lampridis, 2013-04-26
-
Re: layer based constraints
From: Dick Hollenbeck, 2013-04-26
-
Re: layer based constraints
From: Simon Huwyler, 2013-04-26
-
Re: layer based constraints
From: Simon Huwyler, 2013-04-26
-
Re: layer based constraints
From: Tomasz Wlostowski, 2013-04-26
-
Re: layer based constraints
From: Dick Hollenbeck, 2013-04-27
-
Re: layer based constraints
From: Lorenzo Marcantonio, 2013-04-27
-
Re: layer based constraints
From: Dick Hollenbeck, 2013-04-27
-
Re: layer based constraints
From: Lorenzo Marcantonio, 2013-04-27
-
Re: layer based constraints
From: Dick Hollenbeck, 2013-04-28
-
Re: layer based constraints
From: Simon Huwyler, 2013-05-07