kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #20426
Re: Eeschema ERC should detect unmatched local labels
@JP,
Attached you can find the patch file for the improvement of optional
ERC's detecting local labels.
Short description:
With this patch, there is an added extra check box inside ERC
pop-up window, which by default is "un-checked".
This extra check box has a name "Check Unmatched Labels". When
it is "un-checked", ERC's "Run" will just function as normal as it used
to be, so to avoid un-wanted noises for some people who don't bother
detecting; when it is "checked", ERC's "Run" will detect the "unmatched"
local labels.
I also attached a new test schematic tar ball that can be used for
testing the patch functions.
Thank you for all your valuable comments and insights.
I would appreciate anyone could test this patch out and provide comments
and inputs.
--JC
On 09/14/2015 03:30 AM, jp charras wrote:
Le 14/09/2015 06:17, Joseph Chen a écrit :
@Wayne and @JP,
Could try ERC on this simple schematic file?
Attached, you can find a test schematic file that has an unintended
unmatched local labels, and current kicad ERC does not detect them.
In the test schematic file, there is a mis-spelled local label on the
right hand side. The local labels are constructed with an intention of
using them to serve as ratnets, not just a convenient text.
With this kind of mis-detected errors, the PCB will not have the
intended ratnet at all and thus no copper track will be laid out, and
thus the manufactured boards will be bad.
--Joe
The test schematic looks good for a reader.
You said:
"The local labels are constructed with an intention of using them to
serve as ratnets, not just a convenient text"
But only the designer (you) knows that.
Detecting mis-spelled local labels is not so easy, if you want to avoid
noise. And if there is noise, this feature is useless.
Many designers widely use a local label (and only one) to name a net for
many reasons.
This is not necessary a design error (in fact 99% of cases are not an error)
Having said that, I think you could send us a patch, at least to try
this feature, and see how useful it is in many different designs, and
perhaps improve it to avoid noise.
But keep in mind testing a patch and include it in a stable release are
not the same thing.
diff --git a/eeschema/class_drc_erc_item.cpp b/eeschema/class_drc_erc_item.cpp
index 9071dc8..7a3e9de 100644
--- a/eeschema/class_drc_erc_item.cpp
+++ b/eeschema/class_drc_erc_item.cpp
@@ -54,6 +54,8 @@ wxString DRC_ITEM::GetErrorText() const
return wxString( _("A no connect symbol is connected to more than 1 pin"));
case ERCE_GLOBLABEL:
return wxString( _("Global label not connected to any other global label") );
+ case ERCE_LABEL:
+ return wxString( _("Local label not connected to any other local label of the same sheet") );
default:
return wxString( wxT("Unkown.") );
diff --git a/eeschema/class_netlist_object.cpp b/eeschema/class_netlist_object.cpp
index 5d7ca6b..aaf6867 100644
--- a/eeschema/class_netlist_object.cpp
+++ b/eeschema/class_netlist_object.cpp
@@ -212,7 +212,7 @@ bool NETLIST_OBJECT::IsLabelType() const
|| m_Type == NET_PINLABEL;
}
-bool NETLIST_OBJECT::IsLabelConnected( NETLIST_OBJECT* aNetItem )
+bool NETLIST_OBJECT::IsLabelConnected( NETLIST_OBJECT* aNetItem, bool checkUnmatchedLabel )
{
if( aNetItem == this ) // Don't compare the same net list object.
return false;
@@ -233,6 +233,20 @@ bool NETLIST_OBJECT::IsLabelConnected( NETLIST_OBJECT* aNetItem )
if( m_Label == aNetItem->m_Label )
return true; //connected!
}
+ else if( checkUnmatchedLabel )
+ {
+ if ( ( at == NET_LABEL ) &&
+ ( bt == NET_LABEL ) &&
+ ( m_SheetPath == aNetItem->m_SheetPath ) &&
+ ( m_Label == aNetItem->m_Label ) )
+ return true; //connected!
+ }
+ else if( !checkUnmatchedLabel )
+ {
+ if ( ( at == NET_LABEL ) ||
+ ( bt == NET_LABEL ) )
+ return true; //connected!
+ }
return false; //these two are unconnected
}
diff --git a/eeschema/class_netlist_object.h b/eeschema/class_netlist_object.h
index f97fe77..2c79741 100644
--- a/eeschema/class_netlist_object.h
+++ b/eeschema/class_netlist_object.h
@@ -206,10 +206,11 @@ public:
* connected to an associated hierarchical label or sheet label of \a aNetItem.
*
* @param aNetItem A pointer to a NETLIST_OBJECT to test against.
+ * @param checkUnmatchedLabel A bool value to check unmatched label.
* @return A bool value of true if there is a connection with \a aNetItem or false
* if no connection to \a aNetItem.
*/
- bool IsLabelConnected( NETLIST_OBJECT* aNetItem );
+ bool IsLabelConnected( NETLIST_OBJECT* aNetItem, bool checkUnmatchedLabel );
/**
* Function IsLabelGlobal
diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp
index c6792ea..3419c3b 100644
--- a/eeschema/dialogs/dialog_erc.cpp
+++ b/eeschema/dialogs/dialog_erc.cpp
@@ -50,6 +50,7 @@
bool DIALOG_ERC::m_writeErcFile = false;
+bool DIALOG_ERC::m_checkUnmatchedLabel = false;
BEGIN_EVENT_TABLE( DIALOG_ERC, DIALOG_ERC_BASE )
@@ -86,6 +87,7 @@ void DIALOG_ERC::Init()
}
m_WriteResultOpt->SetValue( m_writeErcFile );
+ m_CheckUnmatchedLabelOpt->SetValue( m_checkUnmatchedLabel );
SCH_SCREENS screens;
updateMarkerCounts( &screens );
@@ -439,6 +441,7 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
}
m_writeErcFile = m_WriteResultOpt->GetValue();
+ m_checkUnmatchedLabel = m_CheckUnmatchedLabelOpt->GetValue();
// Build the whole sheet list in hierarchy (sheet, not screen)
SCH_SHEET_LIST sheets;
@@ -501,7 +504,6 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
case NET_SEGMENT:
case NET_BUS:
case NET_JUNCTION:
- case NET_LABEL:
case NET_BUSLABELMEMBER:
case NET_PINLABEL:
case NET_GLOBBUSLABELMEMBER:
@@ -512,11 +514,12 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
case NET_SHEETLABEL:
case NET_SHEETBUSLABELMEMBER:
case NET_GLOBLABEL:
+ case NET_LABEL:
// ERC problems when pin sheets do not match hierarchical labels.
// Each pin sheet must match a hierarchical label
// Each hierarchical label must match a pin sheet
- TestLabel( objectsConnectedList.get(), net, nextNet );
+ TestLabel( objectsConnectedList.get(), net, nextNet, m_checkUnmatchedLabel );
break;
case NET_NOCONNECT:
diff --git a/eeschema/dialogs/dialog_erc.h b/eeschema/dialogs/dialog_erc.h
index e086166..3da4e7e 100644
--- a/eeschema/dialogs/dialog_erc.h
+++ b/eeschema/dialogs/dialog_erc.h
@@ -54,6 +54,7 @@ private:
bool m_initialized;
const SCH_MARKER* m_lastMarkerFound;
static bool m_writeErcFile;
+ static bool m_checkUnmatchedLabel;
public:
DIALOG_ERC( SCH_EDIT_FRAME* parent );
diff --git a/eeschema/dialogs/dialog_erc_base.cpp b/eeschema/dialogs/dialog_erc_base.cpp
index fc37976..93c3ac9 100644
--- a/eeschema/dialogs/dialog_erc_base.cpp
+++ b/eeschema/dialogs/dialog_erc_base.cpp
@@ -58,6 +58,8 @@ DIALOG_ERC_BASE::DIALOG_ERC_BASE( wxWindow* parent, wxWindowID id, const wxStrin
m_WriteResultOpt = new wxCheckBox( sdiagSizer->GetStaticBox(), wxID_ANY, _("Create ERC file report"), wxDefaultPosition, wxDefaultSize, 0 );
sdiagSizer->Add( m_WriteResultOpt, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
+ m_CheckUnmatchedLabelOpt = new wxCheckBox( sdiagSizer->GetStaticBox(), wxID_ANY, _("Check Unmatched Labels"), wxDefaultPosition, wxDefaultSize, 0 );
+ sdiagSizer->Add( m_CheckUnmatchedLabelOpt, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
bupperSizer->Add( sdiagSizer, 0, wxEXPAND|wxTOP, 5 );
diff --git a/eeschema/dialogs/dialog_erc_base.fbp b/eeschema/dialogs/dialog_erc_base.fbp
index 4d0702b..b67490c 100644
--- a/eeschema/dialogs/dialog_erc_base.fbp
+++ b/eeschema/dialogs/dialog_erc_base.fbp
@@ -857,6 +857,7 @@
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_WriteResultOpt</property>
+ <property name="name">m_CheckUnmatchedLabelOpt</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
diff --git a/eeschema/dialogs/dialog_erc_base.h b/eeschema/dialogs/dialog_erc_base.h
index 007f946..e9b57f2 100644
--- a/eeschema/dialogs/dialog_erc_base.h
+++ b/eeschema/dialogs/dialog_erc_base.h
@@ -57,6 +57,7 @@ class DIALOG_ERC_BASE : public DIALOG_SHIM
wxStaticText* m_LastErrCountText;
wxTextCtrl* m_LastErrCount;
wxCheckBox* m_WriteResultOpt;
+ wxCheckBox* m_CheckUnmatchedLabelOpt;
wxStaticText* m_titleMessages;
wxTextCtrl* m_MessagesList;
wxStaticText* m_textMarkers;
diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp
index 099249c..700a2ee 100644
--- a/eeschema/erc.cpp
+++ b/eeschema/erc.cpp
@@ -265,6 +265,15 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
msg,
aNetItemRef->m_Start );
}
+ else if( (aNetItemRef->m_Type == NET_LABEL) )
+ {
+ msg.Printf( _( "Local label %s is not connected to any other local label of the same sheet." ),
+ GetChars( aNetItemRef->m_Label ) );
+ marker->SetData( ERCE_LABEL,
+ aNetItemRef->m_Start,
+ msg,
+ aNetItemRef->m_Start );
+ }
else
{
msg.Printf( _( "Sheet label %s is not connected to a hierarchical label." ),
@@ -582,7 +591,7 @@ bool WriteDiagnosticERC( const wxString& aFullFileName )
}
-void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStartNet )
+void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStartNet, bool checkUnmatchedLabel )
{
unsigned netItemTst = aStartNet;
int erc = 1;
@@ -607,11 +616,11 @@ void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStar
return;
}
- if( aList->GetItem( aNetItemRef )->IsLabelConnected( aList->GetItem( netItemTst ) ) )
+ if( aList->GetItem( aNetItemRef )->IsLabelConnected( aList->GetItem( netItemTst ), checkUnmatchedLabel ) )
erc = 0;
//same thing, different order.
- if( aList->GetItem( netItemTst )->IsLabelConnected( aList->GetItem( aNetItemRef ) ) )
+ if( aList->GetItem( netItemTst )->IsLabelConnected( aList->GetItem( aNetItemRef ), checkUnmatchedLabel ) )
erc = 0;
}
}
diff --git a/eeschema/erc.h b/eeschema/erc.h
index 708fb6a..72fa4f0 100644
--- a/eeschema/erc.h
+++ b/eeschema/erc.h
@@ -58,6 +58,7 @@ extern const wxString CommentERC_V[];
#define ERCE_HIERACHICAL_LABEL 6 // mismatch between hierarchical labels and pins sheets
#define ERCE_NOCONNECT_CONNECTED 7 // a no connect symbol is connected to more than 1 pin
#define ERCE_GLOBLABEL 8 // global label not connected to any other global label
+#define ERCE_LABEL 9 // local label not connected to any other local label of the same sheet
/* Minimal connection table */
#define NPI 4 // Net with Pin isolated, this pin has type Not Connected and must be left N.C.
@@ -111,7 +112,7 @@ int CountPinsInNet( NETLIST_OBJECT_LIST* aList, unsigned aNetStart );
* performs an ERC on a sheet labels to verify that it is connected to a corresponding
* sub sheet global label.
*/
-extern void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStartNet );
+extern void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStartNet, bool checkUnmatchedLabel );
/**
* Function TestDuplicateSheetNames( )
Attachment:
kicad-unmatched-local-labels-schematic.tar.gz
Description: application/gzip
Follow ups
References