← Back to team overview

kicad-developers team mailing list archive

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