Check physical_clearance rules in the router.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16007
This commit is contained in:
Jeff Young 2023-11-01 14:11:40 +00:00
parent fb59f83683
commit 2ce4adc739
2 changed files with 22 additions and 13 deletions

View File

@ -325,18 +325,19 @@ bool PNS_PCBNEW_RULE_RESOLVER::QueryConstraint( PNS::CONSTRAINT_TYPE aType,
switch ( aType ) switch ( aType )
{ {
case PNS::CONSTRAINT_TYPE::CT_CLEARANCE: hostType = CLEARANCE_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_CLEARANCE: hostType = CLEARANCE_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_WIDTH: hostType = TRACK_WIDTH_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_WIDTH: hostType = TRACK_WIDTH_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_DIFF_PAIR_GAP: hostType = DIFF_PAIR_GAP_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_DIFF_PAIR_GAP: hostType = DIFF_PAIR_GAP_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_LENGTH: hostType = LENGTH_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_LENGTH: hostType = LENGTH_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_DIFF_PAIR_SKEW: hostType = SKEW_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_DIFF_PAIR_SKEW: hostType = SKEW_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_MAX_UNCOUPLED: hostType = MAX_UNCOUPLED_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_MAX_UNCOUPLED: hostType = MAX_UNCOUPLED_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_VIA_DIAMETER: hostType = VIA_DIAMETER_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_VIA_DIAMETER: hostType = VIA_DIAMETER_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_VIA_HOLE: hostType = HOLE_SIZE_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_VIA_HOLE: hostType = HOLE_SIZE_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_HOLE_CLEARANCE: hostType = HOLE_CLEARANCE_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_HOLE_CLEARANCE: hostType = HOLE_CLEARANCE_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_EDGE_CLEARANCE: hostType = EDGE_CLEARANCE_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_EDGE_CLEARANCE: hostType = EDGE_CLEARANCE_CONSTRAINT; break;
case PNS::CONSTRAINT_TYPE::CT_HOLE_TO_HOLE: hostType = HOLE_TO_HOLE_CONSTRAINT; break; case PNS::CONSTRAINT_TYPE::CT_HOLE_TO_HOLE: hostType = HOLE_TO_HOLE_CONSTRAINT; break;
default: return false; // should not happen case PNS::CONSTRAINT_TYPE::CT_PHYSICAL_CLEARANCE: hostType = PHYSICAL_CLEARANCE_CONSTRAINT; break;
default: return false; // should not happen
} }
BOARD_ITEM* parentA = aItemA ? aItemA->BoardItem() : nullptr; BOARD_ITEM* parentA = aItemA ? aItemA->BoardItem() : nullptr;
@ -439,6 +440,7 @@ bool PNS_PCBNEW_RULE_RESOLVER::QueryConstraint( PNS::CONSTRAINT_TYPE aType,
case PNS::CONSTRAINT_TYPE::CT_LENGTH: case PNS::CONSTRAINT_TYPE::CT_LENGTH:
case PNS::CONSTRAINT_TYPE::CT_DIFF_PAIR_SKEW: case PNS::CONSTRAINT_TYPE::CT_DIFF_PAIR_SKEW:
case PNS::CONSTRAINT_TYPE::CT_MAX_UNCOUPLED: case PNS::CONSTRAINT_TYPE::CT_MAX_UNCOUPLED:
case PNS::CONSTRAINT_TYPE::CT_PHYSICAL_CLEARANCE:
aConstraint->m_Value = hostConstraint.GetValue(); aConstraint->m_Value = hostConstraint.GetValue();
aConstraint->m_RuleName = hostConstraint.GetName(); aConstraint->m_RuleName = hostConstraint.GetName();
aConstraint->m_Type = aType; aConstraint->m_Type = aType;
@ -544,6 +546,12 @@ int PNS_PCBNEW_RULE_RESOLVER::Clearance( const PNS::ITEM* aA, const PNS::ITEM* a
rv = constraint.m_Value.Min(); rv = constraint.m_Value.Min();
} }
} }
if( QueryConstraint( PNS::CONSTRAINT_TYPE::CT_PHYSICAL_CLEARANCE, aA, aB, layer, &constraint ) )
{
if( constraint.m_Value.Min() > rv )
rv = constraint.m_Value.Min();
}
} }
if( aUseClearanceEpsilon && rv > 0 ) if( aUseClearanceEpsilon && rv > 0 )

View File

@ -60,7 +60,8 @@ enum class CONSTRAINT_TYPE
CT_EDGE_CLEARANCE = 8, CT_EDGE_CLEARANCE = 8,
CT_HOLE_TO_HOLE = 9, CT_HOLE_TO_HOLE = 9,
CT_DIFF_PAIR_SKEW = 10, CT_DIFF_PAIR_SKEW = 10,
CT_MAX_UNCOUPLED = 11 CT_MAX_UNCOUPLED = 11,
CT_PHYSICAL_CLEARANCE = 12
}; };
/** /**