KiCad PCB EDA Suite
DRC_TEST_PROVIDER Class Referenceabstract

DRC_TEST_PROVIDER is a base class that represents a DRC "provider" which runs some DRC functions over a BOARD and spits out #DRC_ITEMs and positions as needed. More...

#include <drc_test_provider.h>

Inheritance diagram for DRC_TEST_PROVIDER:
DRC_TEST_PROVIDER_ANNULUS DRC_TEST_PROVIDER_CLEARANCE_BASE DRC_TEST_PROVIDER_CONNECTIVITY DRC_TEST_PROVIDER_DISALLOW DRC_TEST_PROVIDER_HOLE_SIZE DRC_TEST_PROVIDER_LVS DRC_TEST_PROVIDER_MATCHED_LENGTH DRC_TEST_PROVIDER_MISC DRC_TEST_PROVIDER_SILK_CLEARANCE DRC_TEST_PROVIDER_SILK_TO_MASK DRC_TEST_PROVIDER_TRACK_WIDTH DRC_TEST_PROVIDER_VIA_DIAMETER test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING

Public Member Functions

 DRC_TEST_PROVIDER ()
 
virtual ~DRC_TEST_PROVIDER ()=default
 
void SetDRCEngine (DRC_ENGINE *engine)
 
virtual bool Run ()=0
 Runs this provider against the given PCB with configured options (if any). More...
 
virtual const wxString GetName () const
 
virtual const wxString GetDescription () const
 
virtual std::set< DRC_CONSTRAINT_TGetConstraintTypes () const =0
 
virtual int GetNumPhases () const =0
 
virtual bool IsRuleDriven () const
 
bool IsEnabled () const
 
void Enable (bool aEnable)
 

Protected Member Functions

int forEachGeometryItem (const std::vector< KICAD_T > &aTypes, LSET aLayers, const std::function< bool(BOARD_ITEM *)> &aFunc)
 
virtual void reportAux (wxString fmt,...)
 
virtual void reportViolation (std::shared_ptr< DRC_ITEM > &item, wxPoint aMarkerPos)
 
virtual bool reportProgress (int aCount, int aSize, int aDelta)
 
virtual bool reportPhase (const wxString &aStageName)
 
virtual void reportRuleStatistics ()
 
virtual void accountCheck (const DRC_RULE *ruleToTest)
 
virtual void accountCheck (const DRC_CONSTRAINT &constraintToTest)
 
bool isInvisibleText (const BOARD_ITEM *aItem) const
 
EDA_UNITS userUnits () const
 

Protected Attributes

DRC_ENGINEm_drcEngine
 
std::unordered_map< const DRC_RULE *, int > m_stats
 
bool m_isRuleDriven = true
 
bool m_enabled = true
 
wxString m_msg
 

Static Protected Attributes

static std::vector< KICAD_Ts_allBasicItems
 
static std::vector< KICAD_Ts_allBasicItemsButZones
 

Detailed Description

DRC_TEST_PROVIDER is a base class that represents a DRC "provider" which runs some DRC functions over a BOARD and spits out #DRC_ITEMs and positions as needed.

Definition at line 72 of file drc_test_provider.h.

Constructor & Destructor Documentation

◆ DRC_TEST_PROVIDER()

DRC_TEST_PROVIDER::DRC_TEST_PROVIDER ( )

Definition at line 46 of file drc_test_provider.cpp.

46  :
47  m_drcEngine( nullptr )
48 {
49 }
DRC_ENGINE * m_drcEngine

◆ ~DRC_TEST_PROVIDER()

virtual DRC_TEST_PROVIDER::~DRC_TEST_PROVIDER ( )
virtualdefault

Member Function Documentation

◆ accountCheck() [1/2]

void DRC_TEST_PROVIDER::accountCheck ( const DRC_RULE ruleToTest)
protectedvirtual

Definition at line 102 of file drc_test_provider.cpp.

103 {
104  auto it = m_stats.find( ruleToTest );
105 
106  if( it == m_stats.end() )
107  m_stats[ ruleToTest ] = 1;
108  else
109  m_stats[ ruleToTest ] += 1;
110 }
std::unordered_map< const DRC_RULE *, int > m_stats

References m_stats.

Referenced by accountCheck(), and reportViolation().

◆ accountCheck() [2/2]

void DRC_TEST_PROVIDER::accountCheck ( const DRC_CONSTRAINT constraintToTest)
protectedvirtual

Definition at line 113 of file drc_test_provider.cpp.

114 {
115  accountCheck( constraintToTest.GetParentRule() );
116 }
DRC_RULE * GetParentRule() const
Definition: drc_rule.h:125
virtual void accountCheck(const DRC_RULE *ruleToTest)

References accountCheck(), and DRC_CONSTRAINT::GetParentRule().

◆ Enable()

void DRC_TEST_PROVIDER::Enable ( bool  aEnable)
inline

Definition at line 106 of file drc_test_provider.h.

107  {
108  m_enabled = aEnable;
109  }

References m_enabled.

◆ forEachGeometryItem()

int DRC_TEST_PROVIDER::forEachGeometryItem ( const std::vector< KICAD_T > &  aTypes,
LSET  aLayers,
const std::function< bool(BOARD_ITEM *)> &  aFunc 
)
protected

Definition at line 138 of file drc_test_provider.cpp.

140 {
141  BOARD *brd = m_drcEngine->GetBoard();
142  std::bitset<MAX_STRUCT_TYPE_ID> typeMask;
143  int n = 0;
144 
145  if( s_allBasicItems.size() == 0 )
146  {
147  for( int i = 0; i < MAX_STRUCT_TYPE_ID; i++ )
148  {
149  if( i != PCB_FOOTPRINT_T && i != PCB_GROUP_T )
150  {
151  s_allBasicItems.push_back( (KICAD_T) i );
152 
153  if( i != PCB_ZONE_T && i != PCB_FP_ZONE_T )
154  s_allBasicItemsButZones.push_back( (KICAD_T) i );
155  }
156  }
157  }
158 
159  if( aTypes.size() == 0 )
160  {
161  for( int i = 0; i < MAX_STRUCT_TYPE_ID; i++ )
162  typeMask[ i ] = true;
163  }
164  else
165  {
166  for( KICAD_T aType : aTypes )
167  typeMask[ aType ] = true;
168  }
169 
170  for( TRACK* item : brd->Tracks() )
171  {
172  if( (item->GetLayerSet() & aLayers).any() )
173  {
174  if( typeMask[ PCB_TRACE_T ] && item->Type() == PCB_TRACE_T )
175  {
176  aFunc( item );
177  n++;
178  }
179  else if( typeMask[ PCB_VIA_T ] && item->Type() == PCB_VIA_T )
180  {
181  aFunc( item );
182  n++;
183  }
184  else if( typeMask[ PCB_ARC_T ] && item->Type() == PCB_ARC_T )
185  {
186  aFunc( item );
187  n++;
188  }
189  }
190  }
191 
192  for( BOARD_ITEM* item : brd->Drawings() )
193  {
194  if( (item->GetLayerSet() & aLayers).any() )
195  {
196  if( typeMask[PCB_DIMENSION_T] && BaseType( item->Type() ) == PCB_DIMENSION_T )
197  {
198  if( !aFunc( item ) )
199  return n;
200 
201  n++;
202  }
203  else if( typeMask[ PCB_SHAPE_T ] && item->Type() == PCB_SHAPE_T )
204  {
205  if( !aFunc( item ) )
206  return n;
207 
208  n++;
209  }
210  else if( typeMask[ PCB_TEXT_T ] && item->Type() == PCB_TEXT_T )
211  {
212  if( !aFunc( item ) )
213  return n;
214 
215  n++;
216  }
217  else if( typeMask[ PCB_TARGET_T ] && item->Type() == PCB_TARGET_T )
218  {
219  if( !aFunc( item ) )
220  return n;
221 
222  n++;
223  }
224  }
225  }
226 
227  if( typeMask[ PCB_ZONE_T ] )
228  {
229  for( ZONE* item : brd->Zones() )
230  {
231  if( ( item->GetLayerSet() & aLayers ).any() )
232  {
233  if( !aFunc( item ) )
234  return n;
235 
236  n++;
237  }
238  }
239  }
240 
241  for( FOOTPRINT* footprint : brd->Footprints() )
242  {
243  if( typeMask[ PCB_FP_TEXT_T ] )
244  {
245  if( ( footprint->Reference().GetLayerSet() & aLayers ).any() )
246  {
247  if( !aFunc( &footprint->Reference() ) )
248  return n;
249 
250  n++;
251  }
252 
253  if( ( footprint->Value().GetLayerSet() & aLayers ).any() )
254  {
255  if( !aFunc( &footprint->Value() ) )
256  return n;
257 
258  n++;
259  }
260  }
261 
262  if( typeMask[ PCB_PAD_T ] )
263  {
264  for( PAD* pad : footprint->Pads() )
265  {
266  // Careful: if a pad has a hole then it pierces all layers
267  if( ( pad->GetDrillSizeX() > 0 && pad->GetDrillSizeY() > 0 )
268  || ( pad->GetLayerSet() & aLayers ).any() )
269  {
270  if( !aFunc( pad ) )
271  return n;
272 
273  n++;
274  }
275  }
276  }
277 
278  for( BOARD_ITEM* dwg : footprint->GraphicalItems() )
279  {
280  if( (dwg->GetLayerSet() & aLayers).any() )
281  {
282  if( typeMask[ PCB_FP_TEXT_T ] && dwg->Type() == PCB_FP_TEXT_T )
283  {
284  if( !aFunc( dwg ) )
285  return n;
286 
287  n++;
288  }
289  else if( typeMask[ PCB_FP_SHAPE_T ] && dwg->Type() == PCB_FP_SHAPE_T )
290  {
291  if( !aFunc( dwg ) )
292  return n;
293 
294  n++;
295  }
296  }
297  }
298 
299  if( typeMask[ PCB_FP_ZONE_T ] )
300  {
301  for( ZONE* zone : footprint->Zones() )
302  {
303  if( (zone->GetLayerSet() & aLayers).any() )
304  {
305  if( !aFunc( zone ) )
306  return n;
307 
308  n++;
309  }
310  }
311  }
312 
313  if( typeMask[ PCB_FOOTPRINT_T ] )
314  {
315  if( !aFunc( footprint ) )
316  return n;
317 
318  n++;
319  }
320  }
321 
322  return n;
323 }
class FP_TEXT, text in a footprint
Definition: typeinfo.h:92
ZONES & Zones()
Definition: board.h:311
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:82
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:108
constexpr KICAD_T BaseType(const KICAD_T aType)
Returns the underlying type of the given type.
Definition: typeinfo.h:235
class PCB_TEXT, text on a layer
Definition: typeinfo.h:91
class ARC, an arc track segment on a copper layer
Definition: typeinfo.h:97
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
class PAD, a pad in a footprint
Definition: typeinfo.h:89
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
BOARD * GetBoard() const
Definition: drc_engine.h:87
FOOTPRINTS & Footprints()
Definition: board.h:305
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
class ZONE, a copper pour area
Definition: typeinfo.h:105
class DIMENSION_BASE: abstract dimension meta-type
Definition: typeinfo.h:99
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:104
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
static std::vector< KICAD_T > s_allBasicItems
static std::vector< KICAD_T > s_allBasicItemsButZones
DRC_ENGINE * m_drcEngine
class ZONE, managed by a footprint
Definition: typeinfo.h:94
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
Definition: pad.h:60
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
DRAWINGS & Drawings()
Definition: board.h:308
TRACKS & Tracks()
Definition: board.h:302
Definition: track.h:83

References BaseType(), BOARD::Drawings(), BOARD::Footprints(), DRC_ENGINE::GetBoard(), m_drcEngine, MAX_STRUCT_TYPE_ID, pad, PCB_ARC_T, PCB_DIMENSION_T, PCB_FOOTPRINT_T, PCB_FP_SHAPE_T, PCB_FP_TEXT_T, PCB_FP_ZONE_T, PCB_GROUP_T, PCB_PAD_T, PCB_SHAPE_T, PCB_TARGET_T, PCB_TEXT_T, PCB_TRACE_T, PCB_VIA_T, PCB_ZONE_T, s_allBasicItems, s_allBasicItemsButZones, BOARD::Tracks(), and BOARD::Zones().

Referenced by DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal(), DRC_TEST_PROVIDER_MISC::testDisabledLayers(), and DRC_TEST_PROVIDER_MISC::testTextVars().

◆ GetConstraintTypes()

◆ GetDescription()

◆ GetName()

◆ GetNumPhases()

◆ IsEnabled()

bool DRC_TEST_PROVIDER::IsEnabled ( ) const
inline

Definition at line 101 of file drc_test_provider.h.

102  {
103  return m_enabled;
104  }

References m_enabled.

◆ isInvisibleText()

bool DRC_TEST_PROVIDER::isInvisibleText ( const BOARD_ITEM aItem) const
protected

Definition at line 326 of file drc_test_provider.cpp.

327 {
328 
329  if( const FP_TEXT* text = dyn_cast<const FP_TEXT*>( aItem ) )
330  {
331  if( !text->IsVisible() )
332  return true;
333  }
334 
335  if( const PCB_TEXT* text = dyn_cast<const PCB_TEXT*>( aItem ) )
336  {
337  if( !text->IsVisible() )
338  return true;
339  }
340 
341  return false;
342 }

References text.

Referenced by DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), and DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run().

◆ IsRuleDriven()

virtual bool DRC_TEST_PROVIDER::IsRuleDriven ( ) const
inlinevirtual

Definition at line 96 of file drc_test_provider.h.

97  {
98  return m_isRuleDriven;
99  }

References m_isRuleDriven.

◆ reportAux()

◆ reportPhase()

◆ reportProgress()

◆ reportRuleStatistics()

void DRC_TEST_PROVIDER::reportRuleStatistics ( )
protectedvirtual

Definition at line 119 of file drc_test_provider.cpp.

120 {
121  if( !m_isRuleDriven )
122  return;
123 
124  m_drcEngine->ReportAux( "Rule hit statistics: " );
125 
126  for( const std::pair<const DRC_RULE* const, int>& stat : m_stats )
127  {
128  if( stat.first )
129  {
130  m_drcEngine->ReportAux( wxString::Format( " - rule '%s': %d hits ",
131  stat.first->m_Name,
132  stat.second ) );
133  }
134  }
135 }
std::unordered_map< const DRC_RULE *, int > m_stats
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
void ReportAux(const wxString &aStr)
DRC_ENGINE * m_drcEngine

References Format(), m_drcEngine, m_isRuleDriven, m_stats, and DRC_ENGINE::ReportAux().

Referenced by DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_HOLE_SIZE::Run(), DRC_TEST_PROVIDER_ANNULUS::Run(), DRC_TEST_PROVIDER_CONNECTIVITY::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), DRC_TEST_PROVIDER_LVS::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), and DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal().

◆ reportViolation()

void DRC_TEST_PROVIDER::reportViolation ( std::shared_ptr< DRC_ITEM > &  item,
wxPoint  aMarkerPos 
)
protectedvirtual

Definition at line 56 of file drc_test_provider.cpp.

57 {
58  if( item->GetViolatingRule() )
59  accountCheck( item->GetViolatingRule() );
60 
61  item->SetViolatingTest( this );
62  m_drcEngine->ReportViolation( item, aMarkerPos );
63 }
virtual void accountCheck(const DRC_RULE *ruleToTest)
DRC_ENGINE * m_drcEngine
void ReportViolation(const std::shared_ptr< DRC_ITEM > &aItem, wxPoint aPos)

References accountCheck(), m_drcEngine, and DRC_ENGINE::ReportViolation().

Referenced by DRC_TEST_PROVIDER_MATCHED_LENGTH::checkLengthViolations(), DRC_TEST_PROVIDER_HOLE_SIZE::checkPad(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkSkewViolations(), DRC_TEST_PROVIDER_HOLE_SIZE::checkVia(), DRC_TEST_PROVIDER_MATCHED_LENGTH::checkViaCountViolations(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_ANNULUS::Run(), DRC_TEST_PROVIDER_CONNECTIVITY::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::testAgainstEdge(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances(), DRC_TEST_PROVIDER_MISC::testDisabledLayers(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testFootprintCourtyardDefinitions(), DRC_TEST_PROVIDER_LVS::testFootprints(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::testHoleAgainstHole(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_MISC::testOutline(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_MISC::testTextVars(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), and DRC_TEST_PROVIDER_COPPER_CLEARANCE::testZones().

◆ Run()

◆ SetDRCEngine()

void DRC_TEST_PROVIDER::SetDRCEngine ( DRC_ENGINE engine)
inline

Definition at line 78 of file drc_test_provider.h.

79  {
80  m_drcEngine = engine;
81  m_stats.clear();
82  }
std::unordered_map< const DRC_RULE *, int > m_stats
DRC_ENGINE * m_drcEngine

References m_drcEngine, and m_stats.

◆ userUnits()

Member Data Documentation

◆ m_drcEngine

DRC_ENGINE* DRC_TEST_PROVIDER::m_drcEngine
protected

Definition at line 131 of file drc_test_provider.h.

Referenced by DRC_TEST_PROVIDER_HOLE_SIZE::checkPad(), DRC_TEST_PROVIDER_HOLE_SIZE::checkVia(), forEachGeometryItem(), DRC_TEST_PROVIDER_LVS::GetNumPhases(), reportAux(), reportPhase(), reportProgress(), reportRuleStatistics(), reportViolation(), DRC_TEST_PROVIDER_VIA_DIAMETER::Run(), DRC_TEST_PROVIDER_DISALLOW::Run(), DRC_TEST_PROVIDER_TRACK_WIDTH::Run(), DRC_TEST_PROVIDER_HOLE_SIZE::Run(), DRC_TEST_PROVIDER_ANNULUS::Run(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::Run(), DRC_TEST_PROVIDER_CONNECTIVITY::Run(), DRC_TEST_PROVIDER_SILK_TO_MASK::Run(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::Run(), DRC_TEST_PROVIDER_MISC::Run(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), DRC_TEST_PROVIDER_LVS::Run(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::Run(), test::DRC_TEST_PROVIDER_DIFF_PAIR_COUPLING::Run(), DRC_TEST_PROVIDER_MATCHED_LENGTH::runInternal(), SetDRCEngine(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::testAgainstEdge(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testCourtyardClearances(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testFootprintCourtyardDefinitions(), DRC_TEST_PROVIDER_LVS::testFootprints(), DRC_TEST_PROVIDER_HOLE_CLEARANCE::testHoleAgainstHole(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DRC_TEST_PROVIDER_MISC::testTextVars(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackAgainstItem(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testZones(), and userUnits().

◆ m_enabled

bool DRC_TEST_PROVIDER::m_enabled = true
protected

Definition at line 134 of file drc_test_provider.h.

Referenced by Enable(), and IsEnabled().

◆ m_isRuleDriven

◆ m_msg

◆ m_stats

std::unordered_map<const DRC_RULE*, int> DRC_TEST_PROVIDER::m_stats
protected

Definition at line 132 of file drc_test_provider.h.

Referenced by accountCheck(), reportRuleStatistics(), and SetDRCEngine().

◆ s_allBasicItems

std::vector< KICAD_T > DRC_TEST_PROVIDER::s_allBasicItems
staticprotected

◆ s_allBasicItemsButZones

std::vector< KICAD_T > DRC_TEST_PROVIDER::s_allBasicItemsButZones
staticprotected

The documentation for this class was generated from the following files: