Update router sizes when switching layers.

We may have layer-specific rules involved.  Note that at some point
we also need to do something similar on every "fix route" step to
handle area-specific rules.

Fixes https://gitlab.com/kicad/code/kicad/issues/12576
This commit is contained in:
Jeff Young 2022-10-05 16:44:25 +01:00
parent 44799c830d
commit d8a3ba7917
2 changed files with 46 additions and 2 deletions

View File

@ -600,8 +600,8 @@ bool PNS_KICAD_IFACE_BASE::ImportSizes( PNS::SIZES_SETTINGS& aSizes, PNS::ITEM*
viaDiameter = std::max( viaDiameter, constraint.m_Value.Opt() );
}
if( m_ruleResolver->QueryConstraint( PNS::CONSTRAINT_TYPE::CT_VIA_HOLE, aStartItem, nullptr,
m_startLayer, &constraint ) )
if( m_ruleResolver->QueryConstraint( PNS::CONSTRAINT_TYPE::CT_VIA_HOLE, aStartItem,
nullptr, m_startLayer, &constraint ) )
{
viaDrill = std::max( viaDrill, constraint.m_Value.Opt() );
}

View File

@ -654,6 +654,50 @@ void ROUTER_TOOL::switchLayerOnViaPlacement()
m_router->SwitchLayer( *newLayer );
m_lastTargetLayer = *newLayer;
// NB: track and diff-pair values may have changed if layer-specific rules are in play
PCB_LAYER_ID targetLayer = ToLAYER_ID( *newLayer );
std::vector<int> nets = m_router->GetCurrentNets();
PNS::SIZES_SETTINGS sizes = m_router->Sizes();
BOARD_DESIGN_SETTINGS& bds = board()->GetDesignSettings();
std::shared_ptr<DRC_ENGINE>& drcEngine = bds.m_DRCEngine;
DRC_CONSTRAINT constraint;
PCB_TRACK dummyTrack( board() );
dummyTrack.SetLayer( targetLayer );
dummyTrack.SetNetCode( nets.empty() ? 0 : nets[0] );
if( bds.UseNetClassTrack() || !sizes.TrackWidthIsExplicit() )
{
constraint = drcEngine->EvalRules( TRACK_WIDTH_CONSTRAINT, &dummyTrack, nullptr,
targetLayer );
if( !constraint.IsNull() )
sizes.SetTrackWidth( std::max( bds.m_TrackMinWidth, constraint.m_Value.Opt() ) );
}
if( nets.size() >= 2 && ( bds.UseNetClassDiffPair() || !sizes.TrackWidthIsExplicit() ) )
{
PCB_TRACK dummyTrackB( board() );
dummyTrackB.SetLayer( targetLayer );
dummyTrackB.SetNetCode( nets[1] );
constraint = drcEngine->EvalRules( TRACK_WIDTH_CONSTRAINT, &dummyTrack, &dummyTrackB,
targetLayer );
if( !constraint.IsNull() )
sizes.SetDiffPairWidth( std::max( bds.m_TrackMinWidth, constraint.m_Value.Opt() ) );
constraint = drcEngine->EvalRules( DIFF_PAIR_GAP_CONSTRAINT, &dummyTrack, &dummyTrackB,
targetLayer );
if( !constraint.IsNull() )
sizes.SetDiffPairGap( std::max( bds.m_MinClearance, constraint.m_Value.Opt() ) );
}
m_router->UpdateSizes( sizes );
}