[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: Layer selective DRC



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;
          /* add touching lines */
          if (setjmp (info.env) == 0)
            r_search (LAYER_PTR (layer)->line_tree, (BoxType *) & info.pv,
                      NULL, LOCtoPVline_callback, &info);
          else
            return true;
          /* add touching arcs */
          if (setjmp (info.env) == 0)
            r_search (LAYER_PTR (layer)->arc_tree, (BoxType *) & info.pv,
                      NULL, LOCtoPVarc_callback, &info);
          else
            return true;
          /* check all polygons */
          if (setjmp (info.env) == 0)
            r_search (LAYER_PTR (layer)->polygon_tree, (BoxType *) & info.pv,
                      NULL, LOCtoPVpoly_callback, &info);
          else
            return true;
        }
      /* Check for rat-lines that may intersect the PV */
      if (AndRats)
        {
          if (setjmp (info.env) == 0)
            r_search (PCB->Data->rat_tree, (BoxType *) & info.pv, NULL,
                      LOCtoPVrat_callback, &info);
          else
            return true;
        }
      PVList.Location++;
    }
  return false;
}
\-------------------------------------------------


 ---<)kaimartin(>---

-- 
Kai-Martin Knaak                                  tel: +49-511-762-2895
UniversitÃt Hannover, Inst. fÃr Quantenoptik      fax: +49-511-762-2211	
Welfengarten 1, 30167 Hannover           http://www.iqo.uni-hannover.de
-----> not happy with moderation of geda-user mailinglist



_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user