Allow soldermask bridging between nettie items

Previously we only allowed graphical items but within the net-tie we
need to allow bridging for connected items as well

Fixes https://gitlab.com/kicad/code/kicad/-/issues/19288
This commit is contained in:
Seth Hillbrand 2025-08-18 06:49:28 -07:00
parent 54085c4e50
commit 8faf1b4d0e
3 changed files with 560 additions and 5 deletions

View File

@ -432,14 +432,27 @@ bool DRC_TEST_PROVIDER_SOLDER_MASK::checkItemMask( BOARD_ITEM* aMaskItem, int aT
if( fp->AllowSolderMaskBridges() )
return false;
// Graphic items are used to implement net-ties between pads of a group within a net-tie
// footprint. They must be allowed to intrude into their pad's mask aperture.
if( aTestNet < 0 && aMaskItem->Type() == PCB_PAD_T && fp->IsNetTie() )
// Items belonging to a net-tie may share the mask aperture of pads in the same group.
if( aMaskItem->Type() == PCB_PAD_T && fp->IsNetTie() )
{
PAD* pad = static_cast<PAD*>( aMaskItem );
std::map<wxString, int> padNumberToGroupIdxMap = fp->MapPadNumbersToNetTieGroups();
int groupIdx = padNumberToGroupIdxMap[ pad->GetNumber() ];
if( padNumberToGroupIdxMap[ static_cast<PAD*>( aMaskItem )->GetNumber() ] >= 0 )
return false;
if( groupIdx >= 0 )
{
if( aTestNet < 0 )
return false;
if( pad->GetNetCode() == aTestNet )
return false;
for( PAD* other : fp->GetNetTiePads( pad ) )
{
if( other->GetNetCode() == aTestNet )
return false;
}
}
}
}
@ -498,6 +511,22 @@ void DRC_TEST_PROVIDER_SOLDER_MASK::testItemAgainstItems( BOARD_ITEM* aItem, con
return false;
}
if( itemFP && itemFP->IsNetTie() )
{
const std::set<int>& nets = itemFP->GetNetTieCache( aItem );
if( otherNet < 0 || nets.count( otherNet ) )
return false;
}
if( FOOTPRINT* otherFP = other->GetParentFootprint(); otherFP && otherFP->IsNetTie() )
{
const std::set<int>& nets = otherFP->GetNetTieCache( other );
if( itemNet < 0 || nets.count( itemNet ) )
return false;
}
BOARD_ITEM* a = aItem;
BOARD_ITEM* b = other;

View File

@ -0,0 +1,525 @@
(kicad_pcb
(version 20240108)
(generator "pcbnew")
(generator_version "8.0")
(general
(thickness 1.6)
(legacy_teardrops no)
)
(paper "A4")
(layers
(0 "F.Cu" signal)
(31 "B.Cu" signal)
(32 "B.Adhes" user "B.Adhesive")
(33 "F.Adhes" user "F.Adhesive")
(34 "B.Paste" user)
(35 "F.Paste" user)
(36 "B.SilkS" user "B.Silkscreen")
(37 "F.SilkS" user "F.Silkscreen")
(38 "B.Mask" user)
(39 "F.Mask" user)
(40 "Dwgs.User" user "User.Drawings")
(41 "Cmts.User" user "User.Comments")
(42 "Eco1.User" user "User.Eco1")
(43 "Eco2.User" user "User.Eco2")
(44 "Edge.Cuts" user)
(45 "Margin" user)
(46 "B.CrtYd" user "B.Courtyard")
(47 "F.CrtYd" user "F.Courtyard")
(48 "B.Fab" user)
(49 "F.Fab" user)
(50 "User.1" user)
(51 "User.2" user)
(52 "User.3" user)
(53 "User.4" user)
(54 "User.5" user)
(55 "User.6" user)
(56 "User.7" user)
(57 "User.8" user)
(58 "User.9" user)
)
(setup
(pad_to_mask_clearance 0)
(allow_soldermask_bridges_in_footprints no)
(pcbplotparams
(layerselection 0x00010fc_ffffffff)
(plot_on_all_layers_selection 0x0000000_00000000)
(disableapertmacros no)
(usegerberextensions no)
(usegerberattributes yes)
(usegerberadvancedattributes yes)
(creategerberjobfile yes)
(dashed_line_dash_ratio 12.000000)
(dashed_line_gap_ratio 3.000000)
(svgprecision 4)
(plotframeref no)
(viasonmask no)
(mode 1)
(useauxorigin no)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15.000000)
(pdf_front_fp_property_popups yes)
(pdf_back_fp_property_popups yes)
(dxfpolygonmode yes)
(dxfimperialunits yes)
(dxfusepcbnewfont yes)
(psnegative no)
(psa4output no)
(plotreference yes)
(plotvalue yes)
(plotfptext yes)
(plotinvisibletext no)
(sketchpadsonfab no)
(subtractmaskfromsilk no)
(outputformat 1)
(mirror no)
(drillshape 1)
(scaleselection 1)
(outputdirectory "")
)
)
(net 0 "")
(net 1 "A")
(net 2 "B")
(footprint "Resistor_SMD:R_0603_1608Metric"
(layer "F.Cu")
(uuid "d9b59bb9-ea66-4968-a8ed-9e8861d1f85f")
(at 144.5 95.9 90)
(descr "Resistor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator")
(tags "resistor")
(property "Reference" "R1705"
(at 0 -1.43 -90)
(layer "F.SilkS")
(hide yes)
(uuid "208427d9-9695-4703-b884-8631727932ab")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Value" "3.32k"
(at 0 1.43 -90)
(layer "F.Fab")
(hide yes)
(uuid "a073d624-ac2a-4fcf-bb28-b1dce589b938")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Footprint" "Resistor_SMD:R_0603_1608Metric"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "823aaa7f-6c9b-4288-888c-47aab4ebeb4a")
(effects
(font
(size 1.27 1.27)
(thickness 0.15)
)
)
)
(property "Datasheet" ""
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "1f94f8f1-543d-4534-9b0e-6353b46b8f31")
(effects
(font
(size 1.27 1.27)
(thickness 0.15)
)
)
)
(property "Description" "RES SMD 3.32KOHM 0.1% 1/10W 0603"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "e6681fc6-9a85-409d-a2bf-f8b901f4a7ba")
(effects
(font
(size 1.27 1.27)
(thickness 0.15)
)
)
)
(property "Manufacturer" "Yageo"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "4a241eb4-e7df-4a3e-b62a-fd0ecdcfd19b")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "MPN" "RT0603BRD073K32L"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "0b92285d-e617-41f2-ba68-1efb51c29d2e")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "PartNumber" "102264"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "775c309c-dc76-459e-a2d7-8ff2d65c7a82")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Resistance" "3.32k"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "3b95c72c-b1fc-4318-9af8-8877b2440a1a")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Tolerance" "0.1%"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "b514c82e-7c8d-41e1-9b01-5b0a4f6ed154")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Power Rating" "100 mW"
(at 0 0 90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "c5f46fd5-e505-41e5-9a46-5fb0a1226d8e")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(attr smd)
(fp_line
(start -0.237258 -0.5225)
(end 0.237258 -0.5225)
(stroke
(width 0.12)
(type solid)
)
(layer "F.SilkS")
(uuid "1d60ba04-5eb1-45ed-96d0-52d57a6a5586")
)
(fp_line
(start -0.237258 0.5225)
(end 0.237258 0.5225)
(stroke
(width 0.12)
(type solid)
)
(layer "F.SilkS")
(uuid "40e82a61-2220-44ec-af2f-7eba8f8e9c96")
)
(fp_line
(start 1.48 -0.73)
(end 1.48 0.73)
(stroke
(width 0.05)
(type solid)
)
(layer "F.CrtYd")
(uuid "b9fde486-22eb-4477-997b-23708d25ae7c")
)
(fp_line
(start -1.48 -0.73)
(end 1.48 -0.73)
(stroke
(width 0.05)
(type solid)
)
(layer "F.CrtYd")
(uuid "6692e1c6-2938-4398-a504-4f0024db0c86")
)
(fp_line
(start 1.48 0.73)
(end -1.48 0.73)
(stroke
(width 0.05)
(type solid)
)
(layer "F.CrtYd")
(uuid "f8672a91-f813-44fd-b8d9-a53842e81f52")
)
(fp_line
(start -1.48 0.73)
(end -1.48 -0.73)
(stroke
(width 0.05)
(type solid)
)
(layer "F.CrtYd")
(uuid "fcbff2e9-fc0d-4f95-969a-0ca80522edbc")
)
(fp_line
(start 0.8 -0.4125)
(end 0.8 0.4125)
(stroke
(width 0.1)
(type solid)
)
(layer "F.Fab")
(uuid "44624371-e972-45b7-8e0f-28ac68ac4707")
)
(fp_line
(start -0.8 -0.4125)
(end 0.8 -0.4125)
(stroke
(width 0.1)
(type solid)
)
(layer "F.Fab")
(uuid "ff9baace-fdef-441a-8aa6-42800c31fef3")
)
(fp_line
(start 0.8 0.4125)
(end -0.8 0.4125)
(stroke
(width 0.1)
(type solid)
)
(layer "F.Fab")
(uuid "30d41fa8-cd79-48fc-b70f-19104d58a20b")
)
(fp_line
(start -0.8 0.4125)
(end -0.8 -0.4125)
(stroke
(width 0.1)
(type solid)
)
(layer "F.Fab")
(uuid "501cf06a-593d-472f-801e-072e0ac2aa43")
)
(fp_text user "${REFERENCE}"
(at 0 -0.9 -90)
(layer "F.Fab")
(uuid "94fea0c4-fec9-4142-8c52-727a72709f39")
(effects
(font
(size 0.4 0.4)
(thickness 0.06)
)
)
)
(pad "1" smd roundrect
(at -0.825 0 90)
(size 0.8 0.95)
(layers "F.Cu" "F.Paste" "F.Mask")
(roundrect_rratio 0.25)
(pintype "passive")
(uuid "74956c22-2ba0-4390-84e3-0add0309ea64")
)
(pad "2" smd roundrect
(at 0.825 0 90)
(size 0.8 0.95)
(layers "F.Cu" "F.Paste" "F.Mask")
(roundrect_rratio 0.25)
(net 1 "A")
(pintype "passive")
(uuid "e028ffbe-bfb8-419b-ba9e-27d8006b3c43")
)
(model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0603_1608Metric.wrl"
(offset
(xyz 0 0 0)
)
(scale
(xyz 1 1 1)
)
(rotate
(xyz 0 0 0)
)
)
)
(footprint "NetTie:NetTie-2_SMD_Pad0.5mm"
(layer "F.Cu")
(uuid "f039e421-b476-4481-b42f-733b0b81bb4b")
(at 144.5 94.5 -90)
(descr "Net tie, 2 pin, 0.5mm square SMD pads")
(tags "net tie")
(property "Reference" "NT1701"
(at 0 -1.2 90)
(layer "F.SilkS")
(hide yes)
(uuid "8f9eeb6e-e6a9-43c1-9e6c-cb717d66b719")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Value" "NetTie_2"
(at 0 1.2 90)
(layer "F.Fab")
(hide yes)
(uuid "380516d9-443e-4cbf-88a6-023342bcc06f")
(effects
(font
(size 1 1)
(thickness 0.15)
)
)
)
(property "Footprint" "NetTie:NetTie-2_SMD_Pad0.5mm"
(at 0 0 -90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "a48dcfff-1929-4557-a687-f609525f01a3")
(effects
(font
(size 1.27 1.27)
(thickness 0.15)
)
)
)
(property "Datasheet" ""
(at 0 0 -90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "ac076432-ade5-4f7d-9eea-0befbf91a423")
(effects
(font
(size 1.27 1.27)
(thickness 0.15)
)
)
)
(property "Description" "Net tie, 2 pins"
(at 0 0 -90)
(unlocked yes)
(layer "F.Fab")
(hide yes)
(uuid "5fdb3e89-0980-40b4-8667-2c2d6e6fec09")
(effects
(font
(size 1.27 1.27)
(thickness 0.15)
)
)
)
(attr exclude_from_pos_files exclude_from_bom allow_missing_courtyard allow_soldermask_bridges)
(net_tie_pad_groups "1, 2")
(fp_poly
(pts
(xy -0.5 -0.25) (xy 0.5 -0.25) (xy 0.5 0.25) (xy -0.5 0.25)
)
(stroke
(width 0)
(type solid)
)
(fill solid)
(layer "F.Cu")
(uuid "9a9e2914-1292-48cc-aa1d-2d4292da6e54")
)
(pad "1" smd circle
(at -0.5 0 270)
(size 0.5 0.5)
(layers "F.Cu")
(net 2 "B")
(pinfunction "1")
(pintype "passive")
(uuid "16ee3534-48c0-44b3-b649-f8b24a84f4ed")
)
(pad "2" smd circle
(at 0.5 0 270)
(size 0.5 0.5)
(layers "F.Cu")
(net 1 "A")
(pinfunction "2")
(pintype "passive")
(uuid "d3c8b6d3-a993-413b-909d-c43940be048b")
)
)
(gr_rect
(start 137.5 90)
(end 152 104.5)
(stroke
(width 0.05)
(type default)
)
(fill none)
(layer "Edge.Cuts")
(uuid "bead2996-4868-48a3-919e-3743e6296f6b")
)
(via
(at 144.5 94)
(size 0.5)
(drill 0.3)
(layers "F.Cu" "B.Cu")
(free yes)
(net 2)
(uuid "4b8d3731-6cd8-4f67-a659-7cbd9fcf0604")
)
(zone
(net 2)
(net_name "B")
(layer "B.Cu")
(uuid "0a20124f-74b0-4055-a6e6-e87b035a7722")
(hatch edge 0.5)
(connect_pads
(clearance 0.5)
)
(min_thickness 0.25)
(filled_areas_thickness no)
(fill yes
(thermal_gap 0.5)
(thermal_bridge_width 0.5)
)
(polygon
(pts
(xy 152 90) (xy 137.5 90) (xy 137.5 104.5) (xy 152 104.5)
)
)
(filled_polygon
(layer "B.Cu")
(pts
(xy 151.442539 90.520185) (xy 151.488294 90.572989) (xy 151.4995 90.6245) (xy 151.4995 103.8755)
(xy 151.479815 103.942539) (xy 151.427011 103.988294) (xy 151.3755 103.9995) (xy 138.1245 103.9995)
(xy 138.057461 103.979815) (xy 138.011706 103.927011) (xy 138.0005 103.8755) (xy 138.0005 90.6245)
(xy 138.020185 90.557461) (xy 138.072989 90.511706) (xy 138.1245 90.5005) (xy 151.3755 90.5005)
)
)
)
)

View File

@ -68,6 +68,7 @@ BOOST_FIXTURE_TEST_CASE( DRCFalsePositiveRegressions, DRC_REGRESSION_TEST_FIXTUR
"issue17967/issue17967", // Arc dp coupling
"issue18203", // DRC error due to colliding arc and circle
"unconnected-netnames/unconnected-netnames", // Raised false schematic partity error
"net_tie_drc" // Net tie bridging soldermask DRC test
};
for( const wxString& relPath : tests )