From 44c1f5785be0ee7a9238c9754ac4909d2748aeb6 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Sun, 17 Jun 2018 16:31:00 -0700 Subject: [PATCH] pcbnew: Set dp clearance based on netclass Minimum differential pair clearance should be limited to the netclass differential pair spacing. This also cleans up some unused code that was left over from previous work on differential pair clearances. Fixes: lp:1673632 * https://bugs.launchpad.net/kicad/+bug/1673632 --- pcbnew/router/pns_diff_pair_placer.cpp | 4 --- pcbnew/router/pns_kicad_iface.cpp | 39 ++++++-------------------- pcbnew/router/pns_node.h | 2 -- 3 files changed, 8 insertions(+), 37 deletions(-) diff --git a/pcbnew/router/pns_diff_pair_placer.cpp b/pcbnew/router/pns_diff_pair_placer.cpp index 5f5b32ff7e..7415c32516 100644 --- a/pcbnew/router/pns_diff_pair_placer.cpp +++ b/pcbnew/router/pns_diff_pair_placer.cpp @@ -164,9 +164,6 @@ bool DIFF_PAIR_PLACER::attemptWalk( NODE* aNode, DIFF_PAIR* aCurrent, WALKAROUND walkaround( aNode, Router() ); WALKAROUND::WALKAROUND_STATUS wf1; - Router()->GetRuleResolver()->OverrideClearance( true, - aCurrent->NetP(), aCurrent->NetN(), aCurrent->Gap() ); - walkaround.SetSolidsOnly( aSolidsOnly ); walkaround.SetIterationLimit( Settings().WalkaroundIterationLimit() ); @@ -233,7 +230,6 @@ bool DIFF_PAIR_PLACER::attemptWalk( NODE* aNode, DIFF_PAIR* aCurrent, return false; aWalk.SetShape( cur.CP(), cur.CN() ); - Router()->GetRuleResolver()->OverrideClearance( false ); return true; } diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp index aaadca05af..4e7a5d1188 100644 --- a/pcbnew/router/pns_kicad_iface.cpp +++ b/pcbnew/router/pns_kicad_iface.cpp @@ -71,8 +71,6 @@ public: virtual int Clearance( const PNS::ITEM* aA, const PNS::ITEM* aB ) const override; virtual int Clearance( int aNetCode ) const override; - virtual void OverrideClearance( bool aEnable, int aNetA = 0, int aNetB = 0, int aClearance = 0 ) override; - virtual void UseDpGap( bool aUseDpGap ) override { m_useDpGap = aUseDpGap; } virtual int DpCoupledNet( int aNet ) override; virtual int DpNetPolarity( int aNet ) override; virtual bool DpNetPair( PNS::ITEM* aItem, int& aNetP, int& aNetN ) override; @@ -82,6 +80,7 @@ private: struct CLEARANCE_ENT { int coupledNet; + int dpClearance; int clearance; }; @@ -94,10 +93,6 @@ private: std::vector m_netClearanceCache; std::unordered_map m_localClearanceCache; int m_defaultClearance; - bool m_overrideEnabled; - int m_overrideNetA, m_overrideNetB; - int m_overrideClearance; - bool m_useDpGap; }; @@ -126,9 +121,11 @@ PNS_PCBNEW_RULE_RESOLVER::PNS_PCBNEW_RULE_RESOLVER( BOARD* aBoard, PNS::ROUTER* int clearance = nc->GetClearance(); ent.clearance = clearance; + ent.dpClearance = nc->GetDiffPairGap(); m_netClearanceCache[i] = ent; - wxLogTrace( "PNS", "Add net %u netclass %s clearance %d", i, netClassName.mb_str(), clearance ); + wxLogTrace( "PNS", "Add net %u netclass %s clearance %d Diff Pair clearance %d", + i, netClassName.mb_str(), clearance, ent.dpClearance ); } // Build clearance cache for pads @@ -148,8 +145,6 @@ PNS_PCBNEW_RULE_RESOLVER::PNS_PCBNEW_RULE_RESOLVER( BOARD* aBoard, PNS::ROUTER* } } - m_overrideEnabled = false; - auto defaultRule = m_board->GetDesignSettings().m_NetClasses.Find ("Default"); if( defaultRule ) @@ -160,11 +155,6 @@ PNS_PCBNEW_RULE_RESOLVER::PNS_PCBNEW_RULE_RESOLVER( BOARD* aBoard, PNS::ROUTER* { m_defaultClearance = Millimeter2iu(0.254); } - - m_overrideNetA = 0; - m_overrideNetB = 0; - m_overrideClearance = 0; - m_useDpGap = false; } @@ -196,17 +186,14 @@ int PNS_PCBNEW_RULE_RESOLVER::Clearance( const PNS::ITEM* aA, const PNS::ITEM* a int net_b = aB->Net(); int cl_b = ( net_b >= 0 ? m_netClearanceCache[net_b].clearance : m_defaultClearance ); - bool linesOnly = aA->OfKind( PNS::ITEM::SEGMENT_T | PNS::ITEM::LINE_T ) - && aB->OfKind( PNS::ITEM::SEGMENT_T | PNS::ITEM::LINE_T ); - + // Clearance in differential pairs can only happen when there is a specific net if( net_a >= 0 && net_b >= 0 && m_netClearanceCache[net_a].coupledNet == net_b ) { - if( linesOnly ) - cl_a = cl_b = m_router->Sizes().DiffPairGap() - 2 * PNS_HULL_MARGIN; - else - cl_a = cl_b = m_router->Sizes().DiffPairViaGap() - 2 * PNS_HULL_MARGIN; + cl_a = m_netClearanceCache[net_a].dpClearance; + cl_b = m_netClearanceCache[net_b].dpClearance; } + // Pad clearance is 0 if the ITEM* is not a pad int pad_a = localPadClearance( aA ); int pad_b = localPadClearance( aB ); @@ -229,16 +216,6 @@ int PNS_PCBNEW_RULE_RESOLVER::Clearance( int aNetCode ) const } -// fixme: ugly hack to make the optimizer respect gap width for currently routed differential pair. -void PNS_PCBNEW_RULE_RESOLVER::OverrideClearance( bool aEnable, int aNetA, int aNetB , int aClearance ) -{ - m_overrideEnabled = aEnable; - m_overrideNetA = aNetA; - m_overrideNetB = aNetB; - m_overrideClearance = aClearance; -} - - int PNS_PCBNEW_RULE_RESOLVER::matchDpSuffix( wxString aNetName, wxString& aComplementNet, wxString& aBaseDpName ) { int rv = 0; diff --git a/pcbnew/router/pns_node.h b/pcbnew/router/pns_node.h index 6ee8468af0..ab1ff3987d 100644 --- a/pcbnew/router/pns_node.h +++ b/pcbnew/router/pns_node.h @@ -60,8 +60,6 @@ public: virtual int Clearance( const ITEM* aA, const ITEM* aB ) const = 0; virtual int Clearance( int aNetCode ) const = 0; - virtual void OverrideClearance( bool aEnable, int aNetA = 0, int aNetB = 0, int aClearance = 0 ) = 0; - virtual void UseDpGap( bool aUseDpGap ) = 0; virtual int DpCoupledNet( int aNet ) = 0; virtual int DpNetPolarity( int aNet ) = 0; virtual bool DpNetPair( ITEM* aItem, int& aNetP, int& aNetN ) = 0;