On 05/07/2013 04:06 PM, Simon Huwyler wrote: > >> If this feature would work neither with freerouter, nor Cern's push and >> shove router, then >> it would be useless to me. > > fair enough. Of course it has to be consistent with the whole package! > >> I currently use freerouter in p&s mode exclusively, never route in kicad. > > what? Actually, I've always seen freerouter just as an autorouter (and I > don't like autorouters). I never had the idea to manually route with it. > Will try this eventually.
Recommended. Here is a memory aid for others: Freerouter can be split into two words. Free router. I don't see auto in there, and I don't see push and shove in there. But it does both. It routes. > I think I have seen that freerouter doesn't know layer constraints, but you > can tell net classes to be valid on certain layers. I personally still > think, my way is the better one. :-) But that's not the point. Because also > in this way, as I said, Kicad's constraint handler should be aware of the > different layers implement what freerouter does. > >> Tom, if he had time might comment on the likelihood of support for >> something like this in >> his p&s work for internal pcbnew. > > Looking forward to that. But acually I don't think there will be a problem. > I think, Tom will "just" ask about clearances and do some (very complex) > stuff to avoid violations. How these clearances are calculated, I's suppose, > is not of interest to Tom's P&S router. Or am I wrong? > > > > 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@lists.launchpad.net >> 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@lists.launchpad.net >> Unsubscribe : https://launchpad.net/~kicad-developers >> More help : https://help.launchpad.net/ListHelp >> >> > > _______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp