[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: gEDA-user: Layer selective DRC
On Fri, Aug 05, 2011 at 07:28:34PM +0200, Kai-Martin Knaak wrote:
> Kai-Martin Knaak wrote:
>
> > Unfortunately, current git head of PCB enters an infinite loop if
> > the attribute is set correctly. The attached patch fixes this bug.
> > Now, DRC does indeed ignore the layers marked by the attribute.
> > ( I triple checked ;-)
>
> Well, it was working for a smallish pet project. Unfortunately, it still
> fails in a similar way for my real project (the large one).
>
> As a workaround, I tried to temporarily remove all tracks from the layers
> I don't want to apply the DRC check to. But this breaks connectivity and
> DRC gets swamped by false positives.
>
> Looks like I am running out of options...
>
> Maybe, PCB::skip-drc can be made to work, after all. I was able to narrow
> down the code path for the entry into the endless loop. It is a continue
> statement in LookupLOConnectionsToPVList() in the middle of find.c . See
> below. The offending lines are marked with an exclamation mark at the start of
> the line. Anyone got an idea, what might be the correct way to skip here?
>
> /------------from pcb/src/find.c------------------------------------
> static bool
> LookupLOConnectionsToPVList (bool AndRats)
> {
> Cardinal layer;
> struct pv_info info;
>
> /* loop over all PVs currently on list */
> while (PVList.Location < PVList.Number)
> {
> /* get pointer to data */
> info.pv = *(PVLIST_ENTRY (PVList.Location));
> EXPAND_BOUNDS (&info.pv);
>
> /* check pads */
> if (setjmp (info.env) == 0)
> r_search (PCB->Data->pad_tree, (BoxType *) & info.pv, NULL,
> LOCtoPVpad_callback, &info);
> else
> return true;
>
> /* now all lines, arcs and polygons of the several layers */
> for (layer = 0; layer < max_copper_layer; layer++)
> {
> ! if (LAYER_PTR (layer)->no_drc)
> ! continue;
> info.layer = layer;
>
> ...
Hmm, at a glance this looks okay. Can you change the loop to
dump some debug code before each continue, like, say,
if (LAYER_PTR (layer)->no_drc)
{
fprintf (stderr, "Skip layer %d, max %d, (PVL.L %d, PVL.N %d) continuing...\n",
layer, max_copper_layer, PVList.Location, PVList.Number);
continue;
}
Then above and below the for loop add
puts ("enter FOR");
...
puts ("exit FOR");
and similar for the while() loop.
That should tell you a bit more about how this loop is happening.
--
Andrew Poelstra
Email: asp11 at sfu.ca OR apoelstra at wpsoftware.net
Web: http://www.wpsoftware.net/andrew/
_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user