kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #14087
Re: Push-and-shove router issues with blind vias
With the attached patch, the router fully supports both routing
over/under blind/buried vias and shoving them, but cannot yet add new
blind vias.
The current code cannot distinguish between blind vias and microvias. It
uses a simple heuristic: if a via goes from the top to the bottom it
must be a through-board via, otherwise blind/buried. This means that
when a microvia is shoved, it's silently converted to a regular blind
via.
This may be the time for a discussion of why microvias are considered
"special" compared to normal blind vias. I'm working on a board now that
uses layer 1-2 and 1-3 microvias. These are implemented at the fab by
drilling from layer 2-3 anywhere that a layer 1-3 via is needed, then
laminating layer 1 and drilling from 1-2 anywhere that either 1-2 or 1-3
vias are used.
In other words, real microvias (when using a stacked process) can go to
layers other than 2 and N-1. If this is the only distinction between
microvias and blind vias in KiCAD, I propose eliminating the microvia
entity entirely. There could perhaps be a DRC mode to only allow blind
vias between specific layer pairs if you're targeting a process with a
limited number of microvia layers.
On Tue, 2014-07-22 at 12:16 -0400, Andrew Zonenberg wrote:
> I've already fixed item 2 in a pending patch (three-line change to
> PNS_ROUTER::syncVia, works experimentally but not heavily tested).
>
> With any luck there will be a fix for 3 soon as well. 1 will be more
> work and I'm not sure I have time to patch that right now.
>
> On Tue, 2014-07-22 at 17:37 +0200, Tomasz Wlostowski wrote:
> > On 22.07.2014 17:32, Andrew Zonenberg wrote:
> > > I've found three problems so far:
> > >
> > > 1) Pressing the "insert blind via" key when using the push-and-shove
> > > router does not actually add a blind via.
> > >
> > > 2) In both "avoid" and "shove" mode, the router treats blind vias as
> > > through-board vias and will move or avoid them even if there's no real
> > > collision (for example, routing a layer 4 trace under a blind layer 1-2
> > > via doesn't work). I've been mitigating this by drawing the portion of
> > > the track that goes under a blind via by hand, but all of the mode
> > > switching is awkward.
> > >
> > > 3) When a blind via is moved by the router in "shove" mode, it is
> > > converted to a through-board via.
> >
> > Hi Andrew,
> >
> > There's no support yet for blind/buried vias in the P&S. We may add it
> > in the near future.
> >
> > Regards,
> > Tom
> >
>
> _______________________________________________
> 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
--
Andrew Zonenberg
PhD student, security group
Computer Science Department
Rensselaer Polytechnic Institute
http://colossus.cs.rpi.edu/~azonenberg/
=== modified file 'pcbnew/router/pns_router.cpp'
--- pcbnew/router/pns_router.cpp 2014-07-09 14:57:01 +0000
+++ pcbnew/router/pns_router.cpp 2014-07-22 16:40:01 +0000
@@ -227,9 +227,12 @@
PNS_ITEM* PNS_ROUTER::syncVia( VIA* aVia )
{
+ LAYER_ID top, bottom;
+ aVia->LayerPair(&top, &bottom);
+
PNS_VIA* v = new PNS_VIA(
aVia->GetPosition(),
- PNS_LAYERSET( 0, MAX_CU_LAYERS - 1 ),
+ PNS_LAYERSET( top, bottom),
aVia->GetWidth(),
aVia->GetDrillValue(),
aVia->GetNetCode() );
@@ -759,8 +762,23 @@
via_board->SetWidth( via->Diameter() );
via_board->SetDrill( via->Drill() );
via_board->SetNetCode( via->Net() );
- via_board->SetLayerPair( ToLAYER_ID( m_settings.GetLayerTop() ),
- ToLAYER_ID( m_settings.GetLayerBottom() ) );
+ via_board->SetLayerPair( ToLAYER_ID( via->Layers().Start() ),
+ ToLAYER_ID( via->Layers().End() ) );
+
+ //If we're on all layers of the board, we must be a through via
+ if( (via->Layers().Start() == m_settings.GetLayerTop()) &&
+ (via->Layers().End() == m_settings.GetLayerBottom())
+ )
+ {
+ via_board->SetViaType(VIA_THROUGH);
+ }
+
+ //Otherwise we're a blind/buried via or microvia.
+ //There's no way to tell without adding extra fields to the PNS_VIA class so for now, guess blind/buried.
+ //Note that shoved microvias will be converted silently to blind/buried vias of the same size until fixed.
+ else
+ via_board->SetViaType(VIA_BLIND_BURIED);
+
newBI = via_board;
break;
}
Attachment:
signature.asc
Description: This is a digitally signed message part
Follow ups
References