From 471f72a340230082a3dcdb3bb10195e9f7c8d372 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Thu, 30 May 2024 16:10:39 -0700 Subject: [PATCH] Handle arcs dp coupling Calculate coupled arcs and spacing Fixes https://gitlab.com/kicad/code/kicad/-/issues/17967 (cherry picked from commit 75ab3d9e8b123c8d9728082a90721b58fb2b97fd) --- libs/kimath/include/geometry/shape_arc.h | 19 + .../drc_test_provider_diff_pair_coupling.cpp | 184 ++- .../pcbnew/issue17967/issue17967.kicad_dru | 28 + .../pcbnew/issue17967/issue17967.kicad_pcb | 1291 +++++++++++++++++ .../pcbnew/issue17967/issue17967.kicad_pro | 702 +++++++++ qa/tests/pcbnew/drc/test_drc_regressions.cpp | 3 +- 6 files changed, 2209 insertions(+), 18 deletions(-) create mode 100644 qa/data/pcbnew/issue17967/issue17967.kicad_dru create mode 100644 qa/data/pcbnew/issue17967/issue17967.kicad_pcb create mode 100644 qa/data/pcbnew/issue17967/issue17967.kicad_pro diff --git a/libs/kimath/include/geometry/shape_arc.h b/libs/kimath/include/geometry/shape_arc.h index ce306c44fd..bf2a6243d5 100644 --- a/libs/kimath/include/geometry/shape_arc.h +++ b/libs/kimath/include/geometry/shape_arc.h @@ -258,6 +258,25 @@ private: void update_bbox(); + /** + * @return true if the arc is counter-clockwise. + */ + bool IsCCW() const + { + VECTOR2L mid = m_mid; + VECTOR2L v1 = m_end - mid; + VECTOR2L v2 = m_start - mid; + + return v1.Cross( v2 ) > 0; + } + + /** + * @return true if the arc is clockwise. + */ + bool IsClockwise() const { return !IsCCW(); } + +private: + bool sliceContainsPoint( const VECTOR2I& p ) const; private: diff --git a/pcbnew/drc/drc_test_provider_diff_pair_coupling.cpp b/pcbnew/drc/drc_test_provider_diff_pair_coupling.cpp index 488817d13f..868646d2c3 100644 --- a/pcbnew/drc/drc_test_provider_diff_pair_coupling.cpp +++ b/pcbnew/drc/drc_test_provider_diff_pair_coupling.cpp @@ -122,6 +122,76 @@ static bool commonParallelProjection( SEG p, SEG n, SEG &pClip, SEG& nClip ) } +static bool commonParallelProjection( const PCB_ARC& p, const PCB_ARC& n, SHAPE_ARC &pClip, SHAPE_ARC& nClip ) +{ + VECTOR2I p_center = p.GetCenter(); + VECTOR2I n_center = n.GetCenter(); + double p_radius = p.GetRadius(); + double n_radius = n.GetRadius(); + + VECTOR2I p_start( p.GetStart() ); + VECTOR2I p_end( p.GetEnd() ); + + if( p.IsCCW() ) + std::swap( p_start, p_end ); + + VECTOR2I n_start( n.GetStart() ); + VECTOR2I n_end( n.GetEnd() ); + + if( n.IsCCW() ) + std::swap( n_start, n_end ); + + SHAPE_ARC p_arc( p_start, p.GetMid(), p_end, 0 ); + SHAPE_ARC n_arc( n_start, n.GetMid(), n_end, 0 ); + + EDA_ANGLE p_start_angle = p_arc.GetStartAngle(); + + // Rotate the arcs to a common 0 starting angle + p_arc.Rotate( -p_start_angle, p_center ); + n_arc.Rotate( -p_start_angle, n_center ); + + EDA_ANGLE p_end_angle = p_arc.GetEndAngle(); + EDA_ANGLE n_start_angle = n_arc.GetStartAngle(); + EDA_ANGLE n_end_angle = n_arc.GetEndAngle(); + + + EDA_ANGLE clip_total_angle; + EDA_ANGLE clip_start_angle; + + if( n_start_angle > p_end_angle ) + { + // n is fully outside of p + if( n_end_angle > p_end_angle ) + return false; + + // n starts before angle 0 and ends in the middle of p + clip_total_angle = n_end_angle + p_start_angle; + clip_start_angle = p_start_angle; + } + else + { + clip_start_angle = n_start_angle + p_start_angle; + + // n is fully inside of p + if( n_end_angle < p_end_angle ) + clip_total_angle = n_end_angle - n_start_angle; + else // n starts after 0 and ends after p + clip_total_angle = p_end_angle - n_start_angle; + } + + VECTOR2I n_start_pt = n_center + VECTOR2I( KiROUND( n_radius ), 0 ); + VECTOR2I p_start_pt = p_center + VECTOR2I( KiROUND( p_radius ), 0 ); + + RotatePoint( n_start_pt, n_center, clip_start_angle ); + RotatePoint( p_start_pt, p_center, clip_start_angle ); + + pClip = SHAPE_ARC( p_center, p_start_pt, clip_start_angle ); + nClip = SHAPE_ARC( n_center, n_start_pt, clip_start_angle ); + + return true; +} + + struct DIFF_PAIR_KEY { bool operator<( const DIFF_PAIR_KEY& b ) const @@ -160,6 +230,9 @@ struct DIFF_PAIR_COUPLED_SEGMENTS { SEG coupledN; SEG coupledP; + bool isArc; + SHAPE_ARC coupledArcN; + SHAPE_ARC coupledArcP; PCB_TRACK* parentN; PCB_TRACK* parentP; int computedGap; @@ -168,6 +241,7 @@ struct DIFF_PAIR_COUPLED_SEGMENTS bool couplingFailMax; DIFF_PAIR_COUPLED_SEGMENTS() : + isArc( false ), parentN( nullptr ), parentP( nullptr ), computedGap( 0 ), @@ -224,11 +298,95 @@ static void extractDiffPairCoupledItems( DIFF_PAIR_ITEMS& aDp ) cpair.parentP = sp; cpair.parentN = sn; cpair.layer = sp->GetLayer(); + cpair.computedGap = (cpair.coupledP.A - cpair.coupledN.A).EuclideanNorm(); + cpair.computedGap -= ( sp->GetWidth() + sn->GetWidth() ) / 2; - int gap = (cpair.coupledP.A - cpair.coupledN.A).EuclideanNorm(); - if( gap < bestGap ) + if( cpair.computedGap < bestGap ) { - bestGap = gap; + bestGap = cpair.computedGap; + bestCoupled = cpair; + } + } + + } + } + + if( bestCoupled ) + { + auto excludeSelf = [&]( BOARD_ITEM* aItem ) + { + if( aItem == bestCoupled->parentN || aItem == bestCoupled->parentP ) + return false; + + if( aItem->Type() == PCB_TRACE_T || aItem->Type() == PCB_VIA_T + || aItem->Type() == PCB_ARC_T ) + { + BOARD_CONNECTED_ITEM* bci = static_cast( aItem ); + + if( bci->GetNetCode() == bestCoupled->parentN->GetNetCode() + || bci->GetNetCode() == bestCoupled->parentP->GetNetCode() ) + { + return false; + } + } + + return true; + }; + + SHAPE_SEGMENT checkSegStart( bestCoupled->coupledP.A, bestCoupled->coupledN.A ); + SHAPE_SEGMENT checkSegEnd( bestCoupled->coupledP.B, bestCoupled->coupledN.B ); + DRC_RTREE* tree = bestCoupled->parentP->GetBoard()->m_CopperItemRTreeCache.get(); + + // check if there's anything in between the segments suspected to be coupled. If + // there's nothing, assume they are really coupled. + + if( !tree->CheckColliding( &checkSegStart, sp->GetLayer(), 0, excludeSelf ) + && !tree->CheckColliding( &checkSegEnd, sp->GetLayer(), 0, excludeSelf ) ) + { + aDp.coupled.push_back( *bestCoupled ); + } + } + } + + for( BOARD_CONNECTED_ITEM* itemP : aDp.itemsP ) + { + PCB_ARC* sp = dyn_cast( itemP ); + std::optional bestCoupled; + int bestGap = std::numeric_limits::max(); + + if( !sp ) + continue; + + for ( BOARD_CONNECTED_ITEM* itemN : aDp.itemsN ) + { + PCB_ARC* sn = dyn_cast ( itemN ); + + if( !sn ) + continue; + + if( ( sn->GetLayerSet() & sp->GetLayerSet() ).none() ) + continue; + + // Segments that are ~ 1 IU in length per side are approximately parallel (tolerance is 1 IU) + // with everything and their parallel projection is < 1 IU, leading to bad distance calculations + if( sp->GetLength() > 2 && sn->GetLength() > 2 && ( sp->GetCenter() - sn->GetCenter() ).SquaredEuclideanNorm() < 4 ) + { + DIFF_PAIR_COUPLED_SEGMENTS cpair; + cpair.isArc = true; + bool coupled = commonParallelProjection( *sp, *sn, cpair.coupledArcP, cpair.coupledArcN ); + + if( coupled ) + { + cpair.parentP = sp; + cpair.parentN = sn; + cpair.layer = sp->GetLayer(); + cpair.computedGap = KiROUND( std::abs( cpair.coupledArcP.GetRadius() + - cpair.coupledArcN.GetRadius() ) ); + cpair.computedGap -= ( sp->GetWidth() + sn->GetWidth() ) / 2; + + if( cpair.computedGap < bestGap ) + { + bestGap = cpair.computedGap; bestCoupled = cpair; } } @@ -246,7 +404,7 @@ static void extractDiffPairCoupledItems( DIFF_PAIR_ITEMS& aDp ) return false; } - if( aItem->Type() == PCB_TRACE_T || aItem->Type() == PCB_VIA_T ) + if( aItem->Type() == PCB_TRACE_T || aItem->Type() == PCB_VIA_T || aItem->Type() == PCB_ARC_T ) { auto bci = static_cast( aItem ); @@ -375,30 +533,22 @@ bool test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run() for( BOARD_CONNECTED_ITEM* item : itemSet.itemsN ) { - // fixme: include vias - if( PCB_TRACK* track = dyn_cast( item ) ) + if( PCB_TRACK* track = dynamic_cast( item ) ) itemSet.totalLengthN += track->GetLength(); } for( BOARD_CONNECTED_ITEM* item : itemSet.itemsP ) { - // fixme: include vias - if( PCB_TRACK* track = dyn_cast( item ) ) + if( PCB_TRACK* track = dynamic_cast( item ) ) itemSet.totalLengthP += track->GetLength(); } for( DIFF_PAIR_COUPLED_SEGMENTS& dp : itemSet.coupled ) { int length = dp.coupledN.Length(); - int gap = dp.coupledN.Distance( dp.coupledP ); wxCHECK2( dp.parentN && dp.parentP, continue ); - gap -= dp.parentN->GetWidth() / 2; - gap -= dp.parentP->GetWidth() / 2; - - dp.computedGap = gap; - std::shared_ptr overlay = m_drcEngine->GetDebugOverlay(); if( overlay ) @@ -414,21 +564,21 @@ bool test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run() drc_dbg( 10, wxT( " len %d gap %d l %d\n" ), length, - gap, + dp.computedGap, dp.parentP->GetLayer() ); if( key.gapConstraint ) { if( key.gapConstraint->HasMin() && key.gapConstraint->Min() >= 0 - && ( gap < key.gapConstraint->Min() - epsilon ) ) + && ( dp.computedGap < key.gapConstraint->Min() - epsilon ) ) { dp.couplingFailMin = true; } if( key.gapConstraint->HasMax() && key.gapConstraint->Max() >= 0 - && ( gap > key.gapConstraint->Max() + epsilon ) ) + && ( dp.computedGap > key.gapConstraint->Max() + epsilon ) ) { dp.couplingFailMax = true; } diff --git a/qa/data/pcbnew/issue17967/issue17967.kicad_dru b/qa/data/pcbnew/issue17967/issue17967.kicad_dru new file mode 100644 index 0000000000..c2cf77f979 --- /dev/null +++ b/qa/data/pcbnew/issue17967/issue17967.kicad_dru @@ -0,0 +1,28 @@ +(version 1) +(rule "csi_outer" + (layer outer) + (condition "(A.NetClass == 'csi_diff100R')") + (constraint track_width (opt 0.065mm)) + (constraint diff_pair_gap (min "0.065mm") (opt 0.15mm) (max "0.35mm")) + (constraint diff_pair_uncoupled (max 15mm)) +) +(rule "csi_clearance" + (layer outer) + (condition "(A.NetClass == 'csi_diff100R' && !AB.isCoupledDiffPair() && A.Type == 'Track' && B.Type == 'Track')") + (constraint clearance (min 0.3mm)) +) + +(rule "csi_GND_clearance" + (layer outer) + (condition "A.NetClass == 'csi_diff100R' && B.NetName == 'GND'") + (constraint clearance (min 0.15mm)) +) + +(rule "connector_clearance" + (condition "(A.Type == 'Pad' || A.Type == 'Via') && ( A.insideCourtyard('J1') || A.insideCourtyard('J2') || A.insideCourtyard('J3')) ") + (constraint clearance (min 0.15mm)) +) + + + + diff --git a/qa/data/pcbnew/issue17967/issue17967.kicad_pcb b/qa/data/pcbnew/issue17967/issue17967.kicad_pcb new file mode 100644 index 0000000000..d5b6964c49 --- /dev/null +++ b/qa/data/pcbnew/issue17967/issue17967.kicad_pcb @@ -0,0 +1,1291 @@ +(kicad_pcb + (version 20240225) + (generator "pcbnew") + (generator_version "8.99") + (general + (thickness 0.122) + (legacy_teardrops yes) + ) + (paper "A3") + (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) + ) + (setup + (stackup + (layer "F.SilkS" + (type "Top Silk Screen") + ) + (layer "F.Paste" + (type "Top Solder Paste") + ) + (layer "F.Mask" + (type "Top Solder Mask") + (thickness 0.0455) + ) + (layer "F.Cu" + (type "copper") + (thickness 0.012) + ) + (layer "dielectric 1" + (type "core") + (thickness 0.025) + (material "FR4") + (epsilon_r 3.3) + (loss_tangent 0.02) + ) + (layer "B.Cu" + (type "copper") + (thickness 0.012) + ) + (layer "B.Mask" + (type "Bottom Solder Mask") + (thickness 0.0275) + ) + (layer "B.Paste" + (type "Bottom Solder Paste") + ) + (layer "B.SilkS" + (type "Bottom Silk Screen") + ) + (copper_finish "None") + (dielectric_constraints yes) + ) + (pad_to_mask_clearance 0) + (allow_soldermask_bridges_in_footprints no) + (aux_axis_origin 65.228337 169.967332) + (grid_origin 65.228337 169.967332) + (pcbplotparams + (layerselection 0x00012fc_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 6) + (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) + (pdf_metadata yes) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plotreference yes) + (plotvalue yes) + (plotfptext yes) + (plotinvisibletext no) + (sketchpadsonfab no) + (plotpadnumbers no) + (subtractmaskfromsilk no) + (outputformat 3) + (mirror no) + (drillshape 0) + (scaleselection 1) + (outputdirectory "Gerber/") + ) + ) + (net 0 "") + (net 1 "/D_CLK_N") + (net 2 "/D_CLK_P") + (net 3 "/D_D0_N") + (footprint "Resistor_SMD:R_0201_0603Metric" + (layer "F.Cu") + (uuid "9d857968-bfc9-40ab-b509-0b04253495f3") + (at 293.728337 135.967332 90) + (descr "Resistor SMD 0201 (0603 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: https://www.vishay.com/docs/20052/crcw0201e3.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "REF**" + (at 0 -1.05 90) + (layer "F.SilkS") + (uuid "6d373a27-66e0-4b37-b5ad-0702aab0dfdc") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "R_0201_0603Metric" + (at 0 1.05 90) + (layer "F.Fab") + (uuid "cffdf57c-b7ec-4e8d-8102-2e4e83cf375b") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_0201_0603Metric" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "d5fa4c38-a300-439f-82fa-d859ec8b1c7d") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "e092c0e9-3fe8-4667-816d-13cc6d0f15ae") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "06785f25-d003-444e-90c9-f60d35a94c5e") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start 0.7 -0.35) + (end 0.7 0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ef787673-552a-4cd7-b159-c2f9210dadb6") + ) + (fp_line + (start -0.7 -0.35) + (end 0.7 -0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "619896d8-44ec-4a25-b65c-db0d9cadb746") + ) + (fp_line + (start 0.7 0.35) + (end -0.7 0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f2378ac4-ffb1-4530-b2b6-e56cb3cb6e1d") + ) + (fp_line + (start -0.7 0.35) + (end -0.7 -0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "360e54d1-1137-4a29-b4e7-d9641fbcfba5") + ) + (fp_line + (start 0.3 -0.15) + (end 0.3 0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "b2484c17-7cd0-42a9-85f4-0b82c087bc0e") + ) + (fp_line + (start -0.3 -0.15) + (end 0.3 -0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "16c37884-42f7-4f82-8ce0-00b17bb004a9") + ) + (fp_line + (start 0.3 0.15) + (end -0.3 0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7574763b-288c-4432-aa8a-fca93718879c") + ) + (fp_line + (start -0.3 0.15) + (end -0.3 -0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "4ae0d690-97aa-4f76-aa11-3c49c8031861") + ) + (fp_text user "${REFERENCE}" + (at 0 -0.68 90) + (layer "F.Fab") + (uuid "b5d95f5e-777f-466f-86c6-25115bc2e732") + (effects + (font + (size 0.25 0.25) + (thickness 0.04) + ) + ) + ) + (pad "" smd roundrect + (at -0.345 0 90) + (size 0.318 0.36) + (layers "F.Paste") + (roundrect_rratio 0.25) + (uuid "202fc902-0fed-41be-96f2-fb9e85a0c2da") + ) + (pad "" smd roundrect + (at 0.345 0 90) + (size 0.318 0.36) + (layers "F.Paste") + (roundrect_rratio 0.25) + (uuid "f6438119-d008-456e-8864-dde1159f0c8b") + ) + (pad "1" smd roundrect + (at -0.32 0 90) + (size 0.46 0.4) + (layers "F.Cu" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "/D_CLK_N") + (uuid "2bfd6421-9ab4-4592-9ffc-0e630f953ceb") + ) + (pad "2" smd roundrect + (at 0.32 0 90) + (size 0.46 0.4) + (layers "F.Cu" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "/D_CLK_P") + (uuid "a2af6c39-f2ae-4c43-8cfb-221fd3b526bc") + ) + (model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0201_0603Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0201_0603Metric" + (layer "B.Cu") + (uuid "6f091ac2-7b4a-4ab5-9a59-8edce806093b") + (at 296.487546 170.44068 -65) + (descr "Resistor SMD 0201 (0603 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: https://www.vishay.com/docs/20052/crcw0201e3.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "REF**" + (at 0 1.05 115) + (layer "B.SilkS") + (uuid "d1ada1b6-63bd-4c49-a10e-3e5eb6ae7537") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (property "Value" "R_0201_0603Metric" + (at 0 -1.05 115) + (layer "B.Fab") + (uuid "7d5e7c33-2b93-4b99-aeb0-3303d5643099") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (property "Footprint" "Resistor_SMD:R_0201_0603Metric" + (at 0 0 115) + (unlocked yes) + (layer "B.Fab") + (hide yes) + (uuid "bdbc0b74-1836-498b-bbff-e393d936ede4") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (property "Datasheet" "" + (at 0 0 115) + (unlocked yes) + (layer "B.Fab") + (hide yes) + (uuid "c9fbeb10-0d8c-49c2-b3ed-9caa46668792") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (property "Description" "" + (at 0 0 115) + (unlocked yes) + (layer "B.Fab") + (hide yes) + (uuid "0b5dd4d0-db1c-4a46-bcfc-733014f9611c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (attr smd) + (fp_line + (start -0.699999 0.350001) + (end -0.7 -0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "B.CrtYd") + (uuid "02858f69-aabf-4f3c-8280-93992471ab19") + ) + (fp_line + (start 0.7 0.35) + (end -0.699999 0.350001) + (stroke + (width 0.05) + (type solid) + ) + (layer "B.CrtYd") + (uuid "f53dbde5-0d0b-4b81-9475-fff181e8a10e") + ) + (fp_line + (start -0.7 -0.35) + (end 0.699999 -0.350001) + (stroke + (width 0.05) + (type solid) + ) + (layer "B.CrtYd") + (uuid "8e57c5cf-d85f-48fd-b80a-4ec10c77eab1") + ) + (fp_line + (start 0.699999 -0.350001) + (end 0.7 0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "B.CrtYd") + (uuid "d7f157bf-c6a7-4c35-a1fc-a46dc83e2103") + ) + (fp_line + (start -0.300001 0.15) + (end -0.3 -0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "B.Fab") + (uuid "af053957-8f6c-487e-8b64-9db3638c8968") + ) + (fp_line + (start 0.3 0.15) + (end -0.300001 0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "B.Fab") + (uuid "eccca533-4aed-4131-8daf-ead8d4514e7d") + ) + (fp_line + (start -0.3 -0.15) + (end 0.300001 -0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "B.Fab") + (uuid "26818ed0-f1ea-4a26-ba21-1c7b46e32d95") + ) + (fp_line + (start 0.300001 -0.15) + (end 0.3 0.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "B.Fab") + (uuid "07fd152e-b2e3-4088-8181-8cf933c554cf") + ) + (fp_text user "${REFERENCE}" + (at 0 0.680001 115) + (layer "B.Fab") + (uuid "bb0e9367-4e9e-4f3d-bc05-c96b53c25e39") + (effects + (font + (size 0.25 0.25) + (thickness 0.04) + ) + (justify mirror) + ) + ) + (pad "" smd roundrect + (at -0.345001 -0.000001 295) + (size 0.318 0.36) + (layers "B.Paste") + (roundrect_rratio 0.25) + (uuid "60d7800f-24b3-44ea-be57-3900cef4c1bb") + ) + (pad "" smd roundrect + (at 0.345001 0.000001 295) + (size 0.318 0.36) + (layers "B.Paste") + (roundrect_rratio 0.25) + (uuid "976cb6be-6c5f-4ec8-91a6-6321e9a3d2f4") + ) + (pad "1" smd roundrect + (at -0.319999 0.000001 295) + (size 0.46 0.4) + (layers "B.Cu" "B.Mask") + (roundrect_rratio 0.25) + (net 1 "/D_CLK_N") + (uuid "6f415f8c-f5ab-4204-b16e-5a4d929a4354") + ) + (pad "2" smd roundrect + (at 0.319999 -0.000001 295) + (size 0.46 0.4) + (layers "B.Cu" "B.Mask") + (roundrect_rratio 0.25) + (net 2 "/D_CLK_P") + (uuid "d2f3a6c4-df8d-4a93-a782-001a77aed9a0") + ) + (model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0201_0603Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (gr_rect + (start 289.228337 127.967332) + (end 313.228337 177.467332) + (stroke + (width 0.1) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "d7163838-6521-47bb-80db-03a3618c8abe") + ) + (segment + (start 303.826993 140.690372) + (end 303.826994 141.188693) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "0ec57ca8-3b3a-4a96-bad8-4fe537b21d40") + ) + (segment + (start 303.695962 150.785238) + (end 303.695968 150.869185) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "1e2fbd24-6e25-4b5a-b090-e5bbc2c9e6bf") + ) + (segment + (start 303.695968 149.925237) + (end 303.69597 150.009191) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "21c5c64b-2b3c-4577-a8b0-852bfee42725") + ) + (segment + (start 303.761496 150.289719) + (end 303.761492 150.289714) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "2b181e6d-93e9-49a5-a586-c72b063cad1d") + ) + (segment + (start 305.635101 166.062702) + (end 295.976827 170.566432) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "2d6d6896-8161-41e9-9f5c-18c574dc96f7") + ) + (segment + (start 306.783331 162.907969) + (end 305.635101 166.062702) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "3339be68-8972-440d-877e-a7443d2fa2dc") + ) + (segment + (start 303.695968 151.215242) + (end 303.695965 151.299184) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "3a239a8c-9ab1-458b-b1f1-13bda483eabd") + ) + (segment + (start 293.903337 136.167331) + (end 294.465838 136.167331) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "43476c3a-9137-4d9a-9a1f-57818f773efa") + ) + (segment + (start 303.416525 149.071193) + (end 303.63452 149.071197) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "4572a93e-9e1f-456f-8944-6d635a21570d") + ) + (segment + (start 303.827019 151.084183) + (end 303.82702 151.084187) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "4afdf569-c425-416b-ab22-c90eb6b8fcb9") + ) + (segment + (start 295.976825 170.566427) + (end 295.721011 170.473318) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "51388339-32ed-48ea-bb7c-de14387a555e") + ) + (segment + (start 295.948324 135.499373) + (end 297.152544 135.499373) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "69cabc8a-9b42-4e9a-ab36-4fd92997646e") + ) + (segment + (start 303.695967 150.355239) + (end 303.695963 150.439187) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "69fda6f5-17c7-4c38-ad63-2b9cc0eacaa6") + ) + (segment + (start 303.761497 150.07471) + (end 303.761493 150.074711) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "814a4abf-6740-4cf6-89eb-1beb980f7299") + ) + (segment + (start 297.152544 135.499373) + (end 298.635994 135.499371) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "82c4dbdb-6e69-4235-902c-bccd41911442") + ) + (segment + (start 303.827019 156.462183) + (end 303.82702 151.43024) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "8644be78-1779-43cf-bc00-255f733c3025") + ) + (segment + (start 303.827019 156.462183) + (end 303.828528 156.463687) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "8c02cb85-1452-43e9-9f77-b3857da71212") + ) + (segment + (start 303.827019 141.188695) + (end 303.827019 148.063689) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "94995cba-411f-42e0-960b-46268cfd9e83") + ) + (segment + (start 303.827021 150.140234) + (end 303.827019 150.140234) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "959c5121-97f6-4e5e-9425-7bc2388b90b3") + ) + (segment + (start 295.976827 170.566432) + (end 295.976825 170.566427) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "97bbe5d2-1040-44f5-a73e-41debcb23d99") + ) + (segment + (start 294.558338 136.074831) + (end 295.372866 136.074831) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "a2689633-df4d-4e5b-ae63-ec08e96011cd") + ) + (segment + (start 294.465838 136.167331) + (end 294.558338 136.074831) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "a71b43ea-3c07-48dd-b311-a0b3def1ca5f") + ) + (segment + (start 295.372866 136.074831) + (end 295.948324 135.499373) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "b1bbf8ae-5119-4c47-a2f1-422741047761") + ) + (segment + (start 303.634521 148.256189) + (end 303.41652 148.25619) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "b4980deb-e3a9-4a79-a93b-66a0adff347b") + ) + (segment + (start 303.827019 150.140234) + (end 303.827023 150.224189) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "b5900829-1695-4d73-8629-224d768af73b") + ) + (segment + (start 303.828528 156.463687) + (end 303.828536 156.571389) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "ba1bd12a-fccd-43fb-b18b-5fc870edc0fe") + ) + (segment + (start 303.828536 156.571389) + (end 306.783331 162.907969) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "d0ad0868-1695-4992-ac78-4f6eb1a4d9c8") + ) + (segment + (start 303.826994 141.188693) + (end 303.827019 141.188695) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "d5cc1786-511b-4f53-8597-a123bba49e59") + ) + (segment + (start 303.827018 151.000232) + (end 303.827019 151.084183) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "d8c4b92d-cd56-4ec9-b31e-73ca3c3346fa") + ) + (segment + (start 303.827016 150.570234) + (end 303.827017 150.654185) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "e52e03e1-2918-46a6-851b-3911879efd3e") + ) + (segment + (start 303.827018 149.263692) + (end 303.827015 149.794189) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "e5d64398-91e0-4ea6-8261-d6a051b71124") + ) + (via + (at 295.721011 170.473318) + (size 0.45) + (drill 0.25) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "ab47e888-407e-4dae-86f7-50f084b9477b") + ) + (arc + (start 303.761491 150.719712) + (mid 303.715159 150.7389) + (end 303.695962 150.785238) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "0890b462-1b15-4424-8c34-30307991f562") + ) + (arc + (start 303.761493 150.504712) + (mid 303.807829 150.523902) + (end 303.827016 150.570234) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "10e911c3-e344-46e5-a2e5-a43d1bb04a06") + ) + (arc + (start 303.695968 150.869185) + (mid 303.715158 150.915521) + (end 303.76149 150.93471) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "23f09697-f242-40a4-b5d2-d88472933518") + ) + (arc + (start 303.827015 149.794189) + (mid 303.807827 149.840523) + (end 303.761493 149.859714) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "4da54692-0005-4a40-b059-e3f6e6dec1c1") + ) + (arc + (start 303.695965 151.299184) + (mid 303.715157 151.34552) + (end 303.761492 151.36471) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "5097a116-86d0-436f-8485-c819df202c6e") + ) + (arc + (start 303.41652 148.25619) + (mid 303.128372 148.375544) + (end 303.009021 148.663693) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "5b808362-4a0d-41a0-8c70-2979f7ff7fbd") + ) + (arc + (start 303.761493 149.859714) + (mid 303.715161 149.878904) + (end 303.695968 149.925237) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "5cac4542-991d-4599-804a-5e1b1e5f6b0d") + ) + (arc + (start 303.761493 150.074711) + (mid 303.807826 150.093904) + (end 303.827021 150.140234) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "6bfcea7f-0ae7-41d8-98a6-e70aa0d69ad0") + ) + (arc + (start 303.761492 151.36471) + (mid 303.807826 151.383901) + (end 303.82702 151.43024) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "6d775bac-d4b4-4bba-af71-a885159c5181") + ) + (arc + (start 303.761491 151.149709) + (mid 303.715157 151.168904) + (end 303.695968 151.215242) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "74466028-33dc-49d2-803f-fdfe13922c98") + ) + (arc + (start 303.827019 148.063689) + (mid 303.770636 148.199803) + (end 303.634521 148.256189) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "77c78d56-6a53-4eff-915a-7ceaf11812b2") + ) + (arc + (start 303.009021 148.663693) + (mid 303.128374 148.951835) + (end 303.416525 149.071193) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "785aff33-a805-451b-b36e-1ffa54a8bc1c") + ) + (arc + (start 303.69597 150.009191) + (mid 303.715165 150.055521) + (end 303.761497 150.07471) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "7b32d0c4-cd88-4333-b460-54486932e9f3") + ) + (arc + (start 303.76149 150.93471) + (mid 303.807827 150.953903) + (end 303.827018 151.000232) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "8023dd72-7fb0-4c75-8db0-c5965abff5b0") + ) + (arc + (start 303.82702 151.084187) + (mid 303.807825 151.130523) + (end 303.761494 151.149711) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "949fae51-57be-4b30-849a-04e01b9ce86e") + ) + (arc + (start 303.827017 150.654185) + (mid 303.807827 150.700522) + (end 303.761492 150.719716) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "95f9b2ad-12d2-4a77-b6bf-19f8f553b02d") + ) + (arc + (start 303.695963 150.439187) + (mid 303.715156 150.485523) + (end 303.761493 150.504712) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "af5954b5-13f0-465e-8968-b5d9c06a82a6") + ) + (arc + (start 298.635994 135.499371) + (mid 302.306582 137.019788) + (end 303.826993 140.690372) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "b4d73e60-e170-4170-a304-76b7451e773b") + ) + (arc + (start 303.827023 150.224189) + (mid 303.80783 150.270521) + (end 303.761496 150.289719) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "ec3e2d2f-74c0-414a-af4e-3b321caaa91b") + ) + (arc + (start 303.63452 149.071197) + (mid 303.770637 149.127573) + (end 303.827018 149.263692) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "f99cd856-b30a-46aa-93fe-36c9f45ced7e") + ) + (arc + (start 303.761492 150.289714) + (mid 303.715158 150.308906) + (end 303.695967 150.355239) + (width 0.065) + (layer "F.Cu") + (net 1) + (uuid "fa197179-72dd-49ef-9930-4b1725df104d") + ) + (segment + (start 296.012866 170.454255) + (end 295.721011 170.473318) + (width 0.2) + (layer "B.Cu") + (net 1) + (uuid "487ae89e-c8b2-4871-ab86-0a3c7788003e") + ) + (segment + (start 296.489739 170.225188) + (end 296.012866 170.454255) + (width 0.2) + (layer "B.Cu") + (net 1) + (uuid "7448b9ac-9ad2-4fd0-ac6b-1dbedbf60641") + ) + (segment + (start 304.04283 156.381414) + (end 304.043747 156.523738) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "02e5e4e8-e6e3-4c36-ae79-de1a7b030e29") + ) + (segment + (start 296.067687 170.761287) + (end 295.974579 171.0171) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "132bb726-f536-4764-b888-1bf4780de11e") + ) + (segment + (start 304.042025 149.263693) + (end 304.042021 152.123944) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "29d48686-7436-4270-acf9-492abca5dab4") + ) + (segment + (start 305.806679 166.219921) + (end 296.067691 170.761285) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "2ad85be1-5470-4fa3-ba9e-2fc565be691a") + ) + (segment + (start 307.015825 162.897819) + (end 305.806679 166.219921) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "4c1a2302-3523-406b-80e9-9c103e7a945d") + ) + (segment + (start 294.465838 135.767331) + (end 294.558338 135.859831) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "4e04074d-bb87-49d9-9ced-79c435af2b7c") + ) + (segment + (start 304.043747 156.523738) + (end 307.015825 162.897819) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "51f6040f-a86e-44a5-b926-31a84d66ff18") + ) + (segment + (start 296.067691 170.761285) + (end 296.067687 170.761287) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "5c777086-53ca-4599-bf1f-a4cf48cffc0a") + ) + (segment + (start 294.558338 135.859831) + (end 295.28381 135.859831) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "63aa8e4f-c708-449b-8a9a-15288b540a7e") + ) + (segment + (start 304.041994 140.690375) + (end 304.041997 141.013688) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "646f1e16-1674-407a-aca4-30cb67b190c8") + ) + (segment + (start 304.042025 141.01369) + (end 304.042027 148.063691) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "8b52bd2a-8256-4ea4-9467-1dc686de0fc5") + ) + (segment + (start 304.041997 141.013688) + (end 304.042025 141.01369) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "8c5d265c-5164-4884-b441-31287d6ae020") + ) + (segment + (start 297.153006 135.284375) + (end 298.635999 135.284378) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "8f14069c-b09a-4290-afd8-fd01f0f3385f") + ) + (segment + (start 295.28381 135.859831) + (end 295.859266 135.284375) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "a04ce76d-bac1-41eb-b3ad-600a9c9f213e") + ) + (segment + (start 303.634523 148.471197) + (end 303.416525 148.471193) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "ab33d97f-8933-4029-b035-60a0d656006e") + ) + (segment + (start 303.416523 148.856189) + (end 303.634523 148.85619) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "b49d3e14-90f5-43b0-bd9e-56a277803474") + ) + (segment + (start 293.903337 135.767331) + (end 294.465838 135.767331) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "da18bbb8-85af-4844-8374-34f96dfba7dc") + ) + (segment + (start 304.042021 152.123944) + (end 304.042024 156.380612) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "f0e0aadb-ffa3-40d8-8ae7-73359b6efb8a") + ) + (segment + (start 304.042024 156.380612) + (end 304.04283 156.381414) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "fca57839-8932-4de8-8982-4b1e15cf4733") + ) + (segment + (start 295.859266 135.284375) + (end 297.153006 135.284375) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "ff4532f7-08fb-4dac-8d66-b6d3a6a133f2") + ) + (via + (at 295.974579 171.0171) + (size 0.45) + (drill 0.25) + (layers "F.Cu" "B.Cu") + (net 2) + (uuid "8145d633-7909-4195-acb7-ddb4c2300879") + ) + (arc + (start 303.634523 148.85619) + (mid 303.922673 148.975543) + (end 304.042025 149.263693) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "154c88a2-d6fd-4b4d-9c0b-8904e32dd71d") + ) + (arc + (start 304.042027 148.063691) + (mid 303.922669 148.351835) + (end 303.634523 148.471197) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "20baa73e-384d-4b97-81aa-4514f787d3c2") + ) + (arc + (start 303.224024 148.663691) + (mid 303.280406 148.799808) + (end 303.416523 148.856189) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "4fa38a37-4c1a-4ac7-b6b0-1d4d4438f57a") + ) + (arc + (start 298.635999 135.284378) + (mid 302.458614 136.867756) + (end 304.041994 140.690375) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "82289cdd-029c-497b-8087-57139519a237") + ) + (arc + (start 303.416525 148.471193) + (mid 303.280408 148.527574) + (end 303.224024 148.663691) + (width 0.065) + (layer "F.Cu") + (net 2) + (uuid "f1f9f6aa-25b7-4bc9-8f54-beb0c2f19d2f") + ) + (segment + (start 296.400491 170.708161) + (end 296.146936 170.822949) + (width 0.2) + (layer "B.Cu") + (net 2) + (uuid "100a7686-91f8-428c-9223-162d638dd304") + ) + (segment + (start 296.146936 170.822949) + (end 295.974579 171.0171) + (width 0.2) + (layer "B.Cu") + (net 2) + (uuid "ab3a5da0-60f6-496f-95e1-410acf715018") + ) + (zone + (net 3) + (net_name "/D_D0_N") + (layer "F.Cu") + (uuid "7624d9a1-56cb-4427-b580-ca10263a0719") + (name "$teardrop_track$") + (hatch edge 0.5) + (priority 30093) + (attr + (teardrop + (type track_end) + ) + ) + (connect_pads yes + (clearance 0) + ) + (min_thickness 0.0254) + (filled_areas_thickness no) + (fill yes + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 1) + (island_area_min 10) + ) + (polygon + (pts + (xy 70.857645 167.377956) (xy 70.843 167.314628) (xy 70.628337 167.282628) (xy 70.627363 167.397853) + (xy 70.709654 167.478945) + ) + ) + ) + (zone + (net 3) + (net_name "/D_D0_N") + (layer "F.Cu") + (uuid "81083e6b-d89b-4fd5-be19-3b56b4858bed") + (name "$teardrop_track$") + (hatch edge 0.5) + (priority 30094) + (attr + (teardrop + (type track_end) + ) + ) + (connect_pads yes + (clearance 0) + ) + (min_thickness 0.0254) + (filled_areas_thickness no) + (fill yes + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 1) + (island_area_min 10) + ) + (polygon + (pts + (xy 70.857645 167.377956) (xy 70.843 167.314628) (xy 70.628337 167.282628) (xy 70.627363 167.397853) + (xy 70.709654 167.478945) + ) + ) + ) +) diff --git a/qa/data/pcbnew/issue17967/issue17967.kicad_pro b/qa/data/pcbnew/issue17967/issue17967.kicad_pro new file mode 100644 index 0000000000..aa88ec79a7 --- /dev/null +++ b/qa/data/pcbnew/issue17967/issue17967.kicad_pro @@ -0,0 +1,702 @@ +{ + "board": { + "3dviewports": [], + "design_settings": { + "defaults": { + "apply_defaults_to_fp_fields": false, + "apply_defaults_to_fp_shapes": false, + "apply_defaults_to_fp_text": false, + "board_outline_line_width": 0.1, + "copper_line_width": 0.2, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.05, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": false, + "text_position": 0, + "units_format": 1 + }, + "fab_line_width": 0.1, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.15, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.0, + "height": 0.4, + "width": 0.46 + }, + "silk_line_width": 0.15, + "silk_text_italic": false, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.15, + "silk_text_upright": false, + "zones": { + "45_degree_only": false, + "min_clearance": 0.15 + } + }, + "diff_pair_dimensions": [ + { + "gap": 0.0, + "via_gap": 0.0, + "width": 0.0 + } + ], + "drc_exclusions": [], + "meta": { + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "connection_width": "warning", + "copper_edge_clearance": "error", + "copper_sliver": "warning", + "courtyards_overlap": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint": "error", + "footprint_symbol_mismatch": "warning", + "footprint_type_mismatch": "error", + "hole_clearance": "error", + "hole_near_hole": "error", + "hole_to_hole": "warning", + "holes_co_located": "warning", + "invalid_outline": "error", + "isolated_copper": "warning", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "lib_footprint_issues": "ignore", + "lib_footprint_mismatch": "warning", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "net_conflict": "warning", + "npth_inside_courtyard": "ignore", + "padstack": "error", + "pth_inside_courtyard": "ignore", + "shorting_items": "error", + "silk_edge_clearance": "warning", + "silk_over_copper": "warning", + "silk_overlap": "warning", + "skew_out_of_range": "error", + "solder_mask_bridge": "error", + "starved_thermal": "error", + "text_height": "warning", + "text_thickness": "warning", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_dangling": "warning", + "track_width": "error", + "tracks_crossing": "error", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zones_intersect": "error" + }, + "rules": { + "allow_blind_buried_vias": false, + "allow_microvias": false, + "max_error": 0.005, + "min_clearance": 0.127, + "min_connection": 0.0, + "min_copper_edge_clearance": 0.2, + "min_hole_clearance": 0.127, + "min_hole_to_hole": 0.25, + "min_microvia_diameter": 0.2, + "min_microvia_drill": 0.1, + "min_resolved_spokes": 2, + "min_silk_clearance": 0.0, + "min_text_height": 0.8, + "min_text_thickness": 0.08, + "min_through_hole_diameter": 0.15, + "min_track_width": 0.052, + "min_via_annular_width": 0.1, + "min_via_diameter": 0.35, + "solder_mask_clearance": 0.0, + "solder_mask_min_width": 0.0, + "solder_mask_to_copper_clearance": 0.0, + "use_height_for_length_calcs": true + }, + "teardrop_options": [ + { + "td_onpadsmd": true, + "td_onroundshapesonly": false, + "td_ontrackend": true, + "td_onviapad": true + } + ], + "teardrop_parameters": [ + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 10, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_round_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 10, + "td_height_ratio": 1.0, + "td_length_ratio": 1.0, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_rect_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_track_end", + "td_width_to_size_filter_ratio": 0.9 + } + ], + "track_widths": [ + 0.0, + 0.065, + 0.072, + 0.095, + 0.101, + 0.15, + 0.2, + 0.25, + 0.3, + 0.3556, + 0.38, + 0.4064, + 0.51, + 0.6, + 0.8, + 1.0, + 1.5, + 2.0 + ], + "tuning_pattern_settings": { + "diff_pair_defaults": { + "corner_radius_percentage": 100, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.1, + "single_sided": false, + "spacing": 0.6 + }, + "diff_pair_skew_defaults": { + "corner_radius_percentage": 100, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.1, + "single_sided": false, + "spacing": 0.6 + }, + "single_track_defaults": { + "corner_radius_percentage": 100, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.1, + "single_sided": false, + "spacing": 0.6 + } + }, + "via_dimensions": [ + { + "diameter": 0.0, + "drill": 0.0 + }, + { + "diameter": 0.35, + "drill": 0.15 + }, + { + "diameter": 0.4, + "drill": 0.2 + }, + { + "diameter": 0.45, + "drill": 0.25 + }, + { + "diameter": 0.55, + "drill": 0.3 + } + ], + "zones_allow_external_fillets": true, + "zones_use_no_outline": true + }, + "ipc2581": { + "dist": "", + "distpn": "", + "internal_id": "", + "mfg": "", + "mpn": "" + }, + "layer_presets": [], + "viewports": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "conflicting_netclasses": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "endpoint_off_grid": "warning", + "extra_units": "error", + "global_label_dangling": "warning", + "hier_label_mismatch": "error", + "label_dangling": "error", + "lib_symbol_issues": "warning", + "missing_bidi_pin": "warning", + "missing_input_pin": "warning", + "missing_power_pin": "error", + "missing_unit": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "error", + "pin_not_driven": "error", + "pin_to_pin": "warning", + "power_pin_not_driven": "error", + "similar_labels": "warning", + "simulation_model_issue": "ignore", + "unannotated": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "issue17967.kicad_pro", + "version": 1 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12, + "clearance": 0.15, + "diff_pair_gap": 0.15, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.072, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.076, + "via_diameter": 0.4, + "via_drill": 0.2, + "wire_width": 6 + }, + { + "bus_width": 12, + "clearance": 0.15, + "diff_pair_gap": 0.15, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.072, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "PWR", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.2, + "via_diameter": 0.5, + "via_drill": 0.3, + "wire_width": 6 + }, + { + "bus_width": 12, + "clearance": 0.15, + "diff_pair_gap": 0.15, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.072, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Signal", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.1, + "via_diameter": 0.45, + "via_drill": 0.25, + "wire_width": 6 + }, + { + "bus_width": 12, + "clearance": 0.15, + "diff_pair_gap": 0.15, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.065, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "csi_diff100R", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.065, + "via_diameter": 0.45, + "via_drill": 0.25, + "wire_width": 6 + } + ], + "meta": { + "version": 3 + }, + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [ + { + "netclass": "csi_diff100R", + "pattern": ".*_[PN]" + } + ] + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "plot": "", + "pos_files": "", + "specctra_dsn": "", + "step": "", + "svg": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "bom_fmt_presets": [], + "bom_fmt_settings": { + "field_delimiter": ",", + "keep_line_breaks": false, + "keep_tabs": false, + "name": "CSV", + "ref_delimiter": ",", + "ref_range_delimiter": "", + "string_delimiter": "\"" + }, + "bom_presets": [], + "bom_settings": { + "exclude_dnp": false, + "fields_ordered": [ + { + "group_by": false, + "label": "Reference", + "name": "Reference", + "show": true + }, + { + "group_by": true, + "label": "Value", + "name": "Value", + "show": true + }, + { + "group_by": false, + "label": "Datasheet", + "name": "Datasheet", + "show": true + }, + { + "group_by": false, + "label": "Footprint", + "name": "Footprint", + "show": true + }, + { + "group_by": false, + "label": "Qty", + "name": "${QUANTITY}", + "show": true + }, + { + "group_by": true, + "label": "DNP", + "name": "${DNP}", + "show": true + } + ], + "filter_string": "", + "group_symbols": true, + "name": "Grouped By Value", + "sort_asc": true, + "sort_field": "位号" + }, + "connection_grid_size": 50.0, + "drawing": { + "dashed_lines_dash_length_ratio": 12.0, + "dashed_lines_gap_length_ratio": 3.0, + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.375, + "operating_point_overlay_i_precision": 3, + "operating_point_overlay_i_range": "~A", + "operating_point_overlay_v_precision": 3, + "operating_point_overlay_v_range": "~V", + "overbar_offset_ratio": 1.23, + "pin_symbol_size": 25.0, + "text_offset_ratio": 0.15 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "net_format_name": "", + "ngspice": { + "fix_include_paths": true, + "fix_passive_vals": false, + "meta": { + "version": 0 + }, + "model_mode": 0, + "workbook_filename": "" + }, + "page_layout_descr_file": "", + "plot_directory": "", + "spice_adjust_passive_values": false, + "spice_current_sheet_as_root": false, + "spice_external_command": "spice \"%I\"", + "spice_model_current_sheet_as_root": true, + "spice_save_all_currents": false, + "spice_save_all_dissipations": false, + "spice_save_all_voltages": false, + "subpart_first_id": 65, + "subpart_id_separator": 0 + }, + "sheets": [ + [ + "811c9aa7-2999-4b11-a823-3df1e2e79d8b", + "根目录" + ] + ], + "text_variables": {} +} diff --git a/qa/tests/pcbnew/drc/test_drc_regressions.cpp b/qa/tests/pcbnew/drc/test_drc_regressions.cpp index 31015a6652..34a7ed2bbf 100644 --- a/qa/tests/pcbnew/drc/test_drc_regressions.cpp +++ b/qa/tests/pcbnew/drc/test_drc_regressions.cpp @@ -141,7 +141,8 @@ BOOST_FIXTURE_TEST_CASE( DRCFalseNegativeRegressions, DRC_REGRESSION_TEST_FIXTUR { "issue16566", 6 }, // Pad_Shape vs Shape property { "reverse_via", 3 }, // Via/track ordering { "intersectingzones", 1 }, // zones are too close to each other - { "fill_bad", 1 } // zone max BBox was too small + { "fill_bad", 1 }, // zone max BBox was too small + { "issue17967/issue17967", 1} // Arc dp coupling }; for( const auto& [testName, expectedErrors] : tests )