qa/drc_proto: updated DRC rule file format to the last version, post-rebase fixes too

This commit is contained in:
Tomasz Wlostowski 2020-08-13 00:19:34 +02:00
parent e0ffdc8fe7
commit f582783b27
7 changed files with 68 additions and 49 deletions

View File

@ -37,6 +37,17 @@
#include <drc_proto/drc_test_provider.h> #include <drc_proto/drc_test_provider.h>
void drcPrintDebugMessage( int level, wxString msg, const char *function, int line )
{
wxString valueStr;
if( wxGetEnv( "DRC_DEBUG", &valueStr ) )
{
int setLevel = wxAtoi( valueStr );
if( level <= setLevel )
fprintf(stderr,"[%-30s:%-5d] %s", function, line, (const char *) msg.c_str() );
}
}
test::DRC_ENGINE::DRC_ENGINE( BOARD* aBoard, BOARD_DESIGN_SETTINGS *aSettings ) : test::DRC_ENGINE::DRC_ENGINE( BOARD* aBoard, BOARD_DESIGN_SETTINGS *aSettings ) :
m_board( aBoard ), m_board( aBoard ),
m_designSettings ( aSettings ), m_designSettings ( aSettings ),
@ -125,29 +136,32 @@ bool test::DRC_ENGINE::CompileRules()
for( auto provider : m_testProviders ) for( auto provider : m_testProviders )
{ {
ReportAux( wxString::Format( "- Provider: '%s': ", provider->GetName() ) ); ReportAux( wxString::Format( "- Provider: '%s': ", provider->GetName() ) );
drc_dbg(11, "do prov %s", provider->GetName() );
for ( auto id : provider->GetMatchingConstraintIds() ) for ( auto id : provider->GetMatchingConstraintIds() )
{ {
if( m_ruleMap.find(id) == m_ruleMap.end() ) drc_dbg(11, "do id %d", id);
m_ruleMap[id] = new RULE_SET; if( m_constraintMap.find(id) == m_constraintMap.end() )
m_constraintMap[id] = new CONSTRAINT_SET;
m_ruleMap[ id ]->provider = provider; m_constraintMap[ id ]->provider = provider;
for( auto rule : m_rules ) for( auto rule : m_rules )
{ {
drc_dbg(10, "Scan provider %s rule %s", provider->GetName() ); drc_dbg(11, "Scan provider %s, rule %s", provider->GetName(), rule->GetName() );
if( ! rule->IsEnabled() ) if( ! rule->IsEnabled() )
continue; continue;
for( auto& constraint : rule->Constraints() ) for( auto& constraint : rule->Constraints() )
{ {
drc_dbg(11, "scan constraint id %d\n", constraint.GetType() );
if( constraint.GetType() != id ) if( constraint.GetType() != id )
continue; continue;
ReportAux( wxString::Format( " |- Rule: '%s' ", rule->m_Name ) ); ReportAux( wxString::Format( " |- Rule: '%s' ", rule->GetName() ) );
auto rcons = new RULE_WITH_CONDITIONS; auto rcons = new CONSTRAINT_WITH_CONDITIONS;
if( rule->IsConditional() ) if( rule->IsConditional() )
{ {
@ -159,8 +173,9 @@ bool test::DRC_ENGINE::CompileRules()
ReportAux( wxString::Format( " |- condition: '%s' compile: %s", condition->GetExpression(), compileOk ? "OK" : "ERROR") ); ReportAux( wxString::Format( " |- condition: '%s' compile: %s", condition->GetExpression(), compileOk ? "OK" : "ERROR") );
} }
rcons->rule = rule; rcons->constraint = constraint;
m_ruleMap[ id ]->sortedRules.push_back( rcons ); rcons->parentRule = rule;
m_constraintMap[ id ]->sortedConstraints.push_back( rcons );
} }
} }
@ -215,10 +230,17 @@ void test::DRC_ENGINE::RunTests( )
const test::DRC_CONSTRAINT& test::DRC_ENGINE::EvalRulesForItems( test::DRC_CONSTRAINT_TYPE_T aConstraintId, BOARD_ITEM* a, BOARD_ITEM* b, PCB_LAYER_ID aLayer ) const test::DRC_CONSTRAINT& test::DRC_ENGINE::EvalRulesForItems( test::DRC_CONSTRAINT_TYPE_T aConstraintId, BOARD_ITEM* a, BOARD_ITEM* b, PCB_LAYER_ID aLayer )
{ {
test::DRC_RULE* rv; test::DRC_RULE* rv;
auto ruleset = m_ruleMap[ aConstraintId ]; auto ruleset = m_constraintMap[ aConstraintId ];
for( auto rcond : ruleset->sortedRules ) for( auto rcond : ruleset->sortedConstraints )
{ {
if( rcond->conditions.size() == 0 ) // uconditional
{
drc_dbg( 8, " -> rule '%s' matches (unconditional)\n",
rcond->constraint.GetParentRule()->GetName()
);
return rcond->constraint;
}
for( auto condition : rcond->conditions ) for( auto condition : rcond->conditions )
{ {
drc_dbg( 8, " -> check condition '%s'\n", drc_dbg( 8, " -> check condition '%s'\n",
@ -228,13 +250,10 @@ const test::DRC_CONSTRAINT& test::DRC_ENGINE::EvalRulesForItems( test::DRC_CONST
if( result ) if( result )
{ {
drc_dbg( 8, " -> rule '%s' matches, triggered by condition '%s'\n", drc_dbg( 8, " -> rule '%s' matches, triggered by condition '%s'\n",
rcond->rule->GetName(), rcond->constraint.GetParentRule()->GetName(),
condition->GetExpression() ); condition->GetExpression() );
for( const DRC_CONSTRAINT& c : rcond->rule->Constraints() )
{ return rcond->constraint;
if( c.GetType() == aConstraintId )
return c;
}
} }
} }
} }
@ -313,24 +332,16 @@ test::DRC_CONSTRAINT test::DRC_ENGINE::GetWorstGlobalConstraint( test::DRC_CONST
std::vector<test::DRC_CONSTRAINT> test::DRC_ENGINE::QueryConstraintsById( test::DRC_CONSTRAINT_TYPE_T constraintID ) std::vector<test::DRC_CONSTRAINT> test::DRC_ENGINE::QueryConstraintsById( test::DRC_CONSTRAINT_TYPE_T constraintID )
{ {
std::vector<test::DRC_CONSTRAINT> rv; std::vector<test::DRC_CONSTRAINT> rv;
for ( auto c : m_constraintMap[constraintID]->sortedConstraints )
for( auto rule : m_ruleMap[constraintID]->sortedRules ) rv.push_back(c->constraint);
{
assert( rule );
assert( rule->rule );
for( const DRC_CONSTRAINT& c : rule->constraints )
if( c.GetType() == constraintID )
rv.push_back( c );
}
return rv; return rv;
} }
bool test::DRC_ENGINE::HasCorrectRulesForId( test::DRC_CONSTRAINT_TYPE_T ruleID ) bool test::DRC_ENGINE::HasCorrectRulesForId( test::DRC_CONSTRAINT_TYPE_T constraintID )
{ {
return m_ruleMap[ruleID]->sortedRules.size() != 0; //drc_dbg(10,"hascorrect id %d size %d\n", ruleID, m_ruleMap[ruleID]->sortedRules.size( ) );
return m_constraintMap[constraintID]->sortedConstraints.size() != 0;
} }

View File

@ -53,12 +53,11 @@ class NETLIST;
class PROGRESS_REPORTER; class PROGRESS_REPORTER;
class REPORTER; class REPORTER;
//#ifdef DEBUG
void drcPrintDebugMessage( int level, wxString msg, const char *function, int line );
#define drc_dbg(level, fmt, ...) \ #define drc_dbg(level, fmt, ...) \
wxLogTrace( "drc_proto", fmt, __VA_ARGS__ ); drcPrintDebugMessage(level, wxString::Format( fmt, __VA_ARGS__ ), __FUNCTION__, __LINE__ );
//#else
//#define drc_dbg(level, fmt, ...)
//#endif
namespace test namespace test
{ {
@ -213,20 +212,20 @@ private:
void freeCompiledRules(); void freeCompiledRules();
struct RULE_WITH_CONDITIONS struct CONSTRAINT_WITH_CONDITIONS
{ {
std::vector<test::DRC_RULE_CONDITION*> conditions; std::vector<test::DRC_RULE_CONDITION*> conditions;
test::DRC_RULE* rule; test::DRC_RULE* parentRule;
std::vector<test::DRC_CONSTRAINT> constraints; test::DRC_CONSTRAINT constraint;
}; };
struct RULE_SET struct CONSTRAINT_SET
{ {
std::vector<RULE_WITH_CONDITIONS*> sortedRules; std::vector<CONSTRAINT_WITH_CONDITIONS*> sortedConstraints;
DRC_TEST_PROVIDER* provider; DRC_TEST_PROVIDER* provider;
}; };
typedef std::unordered_map<test::DRC_CONSTRAINT_TYPE_T, RULE_SET*> RULE_MAP; typedef std::unordered_map<test::DRC_CONSTRAINT_TYPE_T, CONSTRAINT_SET*> CONSTRAINT_MAP;
void inferImplicitRules(); void inferImplicitRules();
@ -240,8 +239,8 @@ private:
std::vector<DRC_RULE_CONDITION*> m_ruleConditions; std::vector<DRC_RULE_CONDITION*> m_ruleConditions;
std::vector<DRC_RULE*> m_rules; std::vector<DRC_RULE*> m_rules;
std::vector<DRC_TEST_PROVIDER*> m_testProviders; std::vector<DRC_TEST_PROVIDER*> m_testProviders;
std::unordered_map<EDA_ITEM*, RULE_SET*> m_implicitRules; std::unordered_map<EDA_ITEM*, CONSTRAINT_SET*> m_implicitRules;
RULE_MAP m_ruleMap; CONSTRAINT_MAP m_constraintMap;
REPORTER* m_reporter; REPORTER* m_reporter;
PROGRESS_REPORTER* m_progressReporter; PROGRESS_REPORTER* m_progressReporter;

View File

@ -44,8 +44,9 @@ test::DRC_RULE::~DRC_RULE()
{ {
} }
void test::DRC_RULE::AddConstraint( const DRC_CONSTRAINT& aConstraint ) void test::DRC_RULE::AddConstraint( DRC_CONSTRAINT& aConstraint )
{ {
aConstraint.SetParentRule( this );
m_constraints.push_back( aConstraint ); m_constraints.push_back( aConstraint );
} }

View File

@ -122,6 +122,7 @@ class DRC_CONSTRAINT
// fixme: needed? // fixme: needed?
bool Allowed() const { return m_Allow; } bool Allowed() const { return m_Allow; }
void SetParentRule( DRC_RULE *aParentRule ) { m_parentRule = aParentRule; }
DRC_RULE* GetParentRule() const { return m_parentRule; } DRC_RULE* GetParentRule() const { return m_parentRule; }
DRC_CONSTRAINT_TYPE_T GetType() const { return m_Type; } DRC_CONSTRAINT_TYPE_T GetType() const { return m_Type; }
@ -160,7 +161,7 @@ public:
return m_constraints; return m_constraints;
} }
void AddConstraint( const DRC_CONSTRAINT& aConstraint ); void AddConstraint( DRC_CONSTRAINT& aConstraint );
bool IsConditional() const bool IsConditional() const
{ {

View File

@ -401,6 +401,8 @@ void test::DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
parseUnknown(); parseUnknown();
} }
} }
aRule->AddConstraint( constraint );
} }

View File

@ -126,12 +126,12 @@ bool test::DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run()
for( auto outlineItem : boardOutline ) for( auto outlineItem : boardOutline )
{ {
//printf("RefT %d\n", outlineItem->Type() ); drc_dbg(12, "RefT %d %p\n", outlineItem->Type(), outlineItem );
auto refShape = outlineItem->GetEffectiveShape(); auto refShape = outlineItem->GetEffectiveShape();
for( auto boardItem : boardItems ) for( auto boardItem : boardItems )
{ {
// printf("BoardT %d\n", boardItem->Type() ); drc_dbg(12, "BoardT %d %p\n", boardItem->Type(), boardItem );
auto shape = boardItem->GetEffectiveShape(); auto shape = boardItem->GetEffectiveShape();

View File

@ -1,6 +1,11 @@
(version 20200610) (version 20200610)
(condition (expression "A.type == 'Pad' && B.type == 'Pad' && (A.onlayer('B.Cu'))") (rule "pad2pad_clearance_back") )
(rule "pad2pad_clearance_back" (type "clearance") (priority 1) (severity error) (min "1mm") ) (rule "pad2pad_clearance_back"
(rule "default" (type "clearance") (priority 0) (severity error) (min "0.2mm") ) (condition "A.type == 'Pad' && B.type == 'Pad' && (A.onlayer('B.Cu'))" )
(constraint clearance (min "1mm") )
)
(rule "default"
(constraint clearance (min "0.2mm") )
)