diff --git a/eeschema/class_netlist_object.cpp b/eeschema/class_netlist_object.cpp
index e5e73c7e46..73fd102103 100644
--- a/eeschema/class_netlist_object.cpp
+++ b/eeschema/class_netlist_object.cpp
@@ -1,9 +1,9 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
- * Copyright (C) 2011 Wayne Stambaugh
- * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 2013 Wayne Stambaugh
+ * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -32,8 +32,8 @@
#include
#include
-#include
#include
+#include
#include
@@ -175,7 +175,7 @@ NETLIST_OBJECT::NETLIST_OBJECT()
m_Flag = 0; /* flag used in calculations */
m_ElectricalType = 0; /* Has meaning only for Pins and hierarchical pins: electrical
* type */
- m_NetCode = 0; /* net code for all items except BUS labels because a BUS
+ m_netCode = 0; /* net code for all items except BUS labels because a BUS
* label has as many net codes as bus members
*/
m_BusNetCode = 0; /* Used for BUS connections */
@@ -184,7 +184,7 @@ NETLIST_OBJECT::NETLIST_OBJECT()
*/
m_FlagOfConnection = UNCONNECTED;
m_PinNum = 0; /* pin number ( 1 long = 4 bytes -> 4 ascii codes) */
- m_NetNameCandidate = NULL; /* a pointer to a NETLIST_OBJECT type label connected to this
+ m_netNameCandidate = NULL; /* a pointer to a NETLIST_OBJECT type label connected to this
* object used to give a name to the net
*/
}
@@ -201,6 +201,15 @@ NETLIST_OBJECT::~NETLIST_OBJECT()
{
}
+// return true if the object is a label of any type
+bool NETLIST_OBJECT::IsLabelType() const
+{
+ return m_Type == NET_LABEL
+ || m_Type == NET_GLOBLABEL || m_Type == NET_HIERLABEL
+ || m_Type == NET_BUSLABELMEMBER || m_Type == NET_GLOBBUSLABELMEMBER
+ || m_Type == NET_HIERBUSLABELMEMBER
+ || m_Type == NET_PINLABEL;
+}
bool NETLIST_OBJECT::IsLabelConnected( NETLIST_OBJECT* aNetItem )
{
@@ -299,3 +308,80 @@ void NETLIST_OBJECT::ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItem
aNetListItems.push_back( item );
}
}
+
+/*
+ * return the net name of the item
+ */
+wxString NETLIST_OBJECT::GetNetName() const
+{
+ if( m_netNameCandidate == NULL )
+ return wxEmptyString;
+
+ wxString netName;
+
+ if( m_netNameCandidate->m_Type == NET_PIN )
+ return GetShortNetName();
+
+ if( !m_netNameCandidate->IsLabelGlobal() )
+ {
+ // usual net name, prefix it by the sheet path
+ netName = m_netNameCandidate->m_SheetList.PathHumanReadable();
+ }
+
+ netName += m_netNameCandidate->m_Label;
+
+ return netName;
+}
+
+/**
+ * return the short net name of the item i.e. the net name
+ * from the "best" label without any prefix.
+ * 2 different nets can have the same short name
+ */
+wxString NETLIST_OBJECT::GetShortNetName() const
+{
+ if( m_netNameCandidate == NULL )
+ return wxEmptyString;
+
+ wxString netName;
+
+ if( m_netNameCandidate->m_Type == NET_PIN )
+ {
+ if( m_Link )
+ {
+ netName = wxT("Net-<");
+ netName << ( (SCH_COMPONENT*) m_Link )->GetRef( &m_SheetList );
+ netName << wxT("-Pad") << LIB_PIN::ReturnPinStringNum( m_PinNum );
+ netName << wxT(">");
+ }
+ }
+ else
+ netName = m_netNameCandidate->m_Label;
+
+ return netName;
+}
+
+/**
+ * Set m_netNameCandidate to a connected item which will
+ * be used to calcule the net name of the item
+ * Obviously the candidate can be only a label
+ * when there is no label on the net a pad which will
+ * used to build a net name (something like Cmp[_Pad
+ * @param aCandidate = the connected item candidate
+ */
+void NETLIST_OBJECT::SetNetNameCandidate( NETLIST_OBJECT* aCandidate )
+{
+ switch( aCandidate->m_Type )
+ {
+ case NET_HIERLABEL:
+ case NET_LABEL:
+ case NET_PINLABEL:
+ case NET_GLOBLABEL:
+ case NET_PIN:
+ m_netNameCandidate = aCandidate;
+ break;
+
+ default:
+ break;
+ }
+}
diff --git a/eeschema/class_netlist_object.h b/eeschema/class_netlist_object.h
index aca521468d..ce26caea09 100644
--- a/eeschema/class_netlist_object.h
+++ b/eeschema/class_netlist_object.h
@@ -1,9 +1,9 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
- * Copyright (C) 2011 Wayne Stambaugh
- * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 2013 Wayne Stambaugh
+ * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -33,15 +33,9 @@
#include
-
#include // LIB_PIN::ReturnPinStringNum( m_PinNum )
-
-class NETLIST_OBJECT;
-
-
-// Buffer to build the list of items used in netlist and erc calculations
-typedef std::vector NETLIST_OBJECT_LIST;
+class NETLIST_OBJECT_LIST;
/* Type of Net objects (wires, labels, pins...) */
@@ -89,53 +83,46 @@ enum NET_CONNECTION_T {
};
-/**
- * Function IsBusLabel
- * test if \a aLabel has a bus notation.
- *
- * @param aLabel A wxString object containing the label to test.
- * @return true if text is a bus notation format otherwise false is returned.
- */
-extern bool IsBusLabel( const wxString& aLabel );
-
-
class NETLIST_OBJECT
{
public:
NETLIST_ITEM_T m_Type; /* Type of item (see NETLIST_ITEM_T enum) */
- EDA_ITEM* m_Comp; /* Pointer on the library item that
+ EDA_ITEM* m_Comp; /* Pointer to the library item that
* created this net object (the parent)
*/
SCH_ITEM* m_Link; /* For SCH_SHEET_PIN:
- * Pointer to the hierarchy sheet that
- * contains this SCH_SHEET_PIN
- * For Pins: pointer to the component
- * that contains this pin
+ * Pointer to the hierarchy sheet that
+ * contains this SCH_SHEET_PIN
+ * For Pins: pointer to the schematic component
+ * that contains this pin
*/
int m_Flag; /* flag used in calculations */
SCH_SHEET_PATH m_SheetList;
int m_ElectricalType; /* Has meaning only for Pins and
* hierarchical pins: electrical type */
-private:
- int m_NetCode; /* net code for all items except BUS
- * labels because a BUS label has
- * as many net codes as bus members
- */
-public:
int m_BusNetCode; /* Used for BUS connections */
int m_Member; /* for labels type NET_BUSLABELMEMBER ( bus member
* created from the BUS label ) member number.
*/
NET_CONNECTION_T m_FlagOfConnection;
- SCH_SHEET_PATH m_SheetListInclude; /* sheet that the hierarchical label connects to.*/
- long m_PinNum; /* pin number ( 1 long = 4 bytes -> 4 ascii codes) */
- wxString m_Label; /* Label text. */
+ SCH_SHEET_PATH m_SheetListInclude; // sheet path which contains the hierarchical label
+ long m_PinNum; // pin number ( 1 long = 4 bytes -> 4 ascii codes)
+ wxString m_Label; // Label text (for labels) or Pin name (for pins)
wxPoint m_Start; // Position of object or for segments: starting point
wxPoint m_End; // For segments (wire and buses): ending point
- NETLIST_OBJECT* m_NetNameCandidate; /* a pointer to a label connected to the net,
- * that can be used to give a name to the net
- * NULL if no usable label
+
+private:
+ int m_netCode; /* net code for all items except BUS
+ * labels because a BUS label has
+ * as many net codes as bus members
*/
+ NETLIST_OBJECT* m_netNameCandidate; /* a pointer to a label connected to the net,
+ * that can be used to give a name to the net
+ * or a pin if there is no label in net
+ * When no label, the pin is used to build
+ * default net name.
+ */
+public:
#if defined(DEBUG)
void Show( std::ostream& out, int ndx ) const; // override
@@ -146,8 +133,19 @@ public:
~NETLIST_OBJECT();
- void SetNet( int aNetCode ) { m_NetCode = aNetCode; }
- int GetNet() const { return m_NetCode; }
+ // Accessors:
+ void SetNet( int aNetCode ) { m_netCode = aNetCode; }
+ int GetNet() const { return m_netCode; }
+
+ /**
+ * Set m_netNameCandidate to a connected item which will
+ * be used to calcule the net name of the item
+ * Obviously the candidate can be only a label
+ * when there is no label on the net a pad which will
+ * used to build a net name (something like Cmp][_Pad
+ * @param aCandidate = the connected item candidate
+ */
+ void SetNetNameCandidate( NETLIST_OBJECT* aCandidate );
/**
* Function GetPinNum
@@ -171,6 +169,38 @@ public:
*/
bool IsLabelConnected( NETLIST_OBJECT* aNetItem );
+ /**
+ * Function IsLabelGlobal
+ * @return true if the object is a global label
+ * (i.e. an real global label or a pin label coming
+ * from a power pin invisible
+ */
+ bool IsLabelGlobal() const
+ {
+ return ( m_Type == NET_PINLABEL ) || ( m_Type == NET_GLOBLABEL );
+ }
+
+ /**
+ * Function IsLabelType
+ * @return true if the object is a label of any type
+ */
+ bool IsLabelType() const;
+
+ /**
+ * Function GetNetName
+ * @return the full net name of the item, i.e. the net name
+ * from the "best" label, prefixed by the sheet path
+ */
+ wxString GetNetName() const;
+
+ /**
+ * Function GetShortNetName
+ * @return the short net name of the item i.e. the net name
+ * from the "best" label without any prefix.
+ * 2 different nets can have the same short name
+ */
+ wxString GetShortNetName() const;
+
/**
* Function ConvertBusToNetListItems
* breaks the text of a bus label type net list object into as many members as
@@ -184,4 +214,156 @@ public:
};
+
+/**
+ * NETLIST_OBJECT_LIST is a class to handle the list of connected items
+ * in a full shematic hierarchy for netlist and erc calculations
+ */
+class NETLIST_OBJECT_LIST: public std::vector
+{
+ bool m_isOwner; // = true if the objects in list are owned my me, and therefore
+ // the memory should be freed by the destructor and the list cleared
+public:
+ /**
+ * Constructor.
+ * NETLIST_OBJECT_LIST handle a list of connected items.
+ * the instance can be owner of items or not.
+ * If it is the owner, the items are freeed by the destructor
+ * @param aIsOwner true if the instance is the owner of item list
+ * (default = false)
+ */
+ NETLIST_OBJECT_LIST( bool aIsOwner = false ) { m_isOwner = aIsOwner; }
+ ~NETLIST_OBJECT_LIST();
+
+ void SetOwner( bool aIsOwner ) { m_isOwner = aIsOwner; }
+
+ /**
+ * Function BuildNetListInfo
+ * the master function of tgis class.
+ * Build the list of connected objects (pins, labels ...) and
+ * all info to generate netlists or run ERC diags
+ * @param aSheets = the flattened sheet list
+ * @return true if OK, false is not item found
+ */
+ bool BuildNetListInfo( SCH_SHEET_LIST& aSheets );
+
+ /*
+ * Acces to an item in list
+ */
+ NETLIST_OBJECT* GetItem( unsigned aIdx )
+ {
+ return *( this->begin() + aIdx );
+ }
+
+ /*
+ * Delete all objects in list and clear list
+ * (free memory used to store info about NETLIST_OBJECT items)
+ */
+ void ClearList();
+
+ /*
+ * Sorts the list of connected items by net code
+ */
+ void SortListbyNetcode();
+
+ /*
+ * Sorts the list of connected items by sheet.
+ * This sorting is used when searching "physical" connection between items
+ * because obviously only items inside the same sheet can be connected
+ */
+ void SortListbySheet();
+
+ /*
+ * Propagate net codes from a parent sheet to an include sheet,
+ * from a pin sheet connection
+ */
+ void SheetLabelConnect( NETLIST_OBJECT* aSheetLabel );
+
+ void PointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus, int start );
+
+ /*
+ * Search connections betweena junction and segments
+ * Propagate the junction net code to objects connected by this junction.
+ * The junction must have a valid net code
+ * The list of objects is expected sorted by sheets.
+ * Search is done from index aIdxStart to the last element of list
+ */
+ void SegmentToPointConnect( NETLIST_OBJECT* aJonction, bool aIsBus, int aIdxStart );
+
+ void ConnectBusLabels();
+
+ /*
+ * Set the m_FlagOfConnection member of items in list
+ * depending on the connection type:
+ * UNCONNECTED, PAD_CONNECT or NOCONNECT_SYMBOL_PRESENT
+ * The list is expected sorted by order of net code,
+ * i.e. items having the same net code are grouped
+ */
+ void SetUnconnectedFlag();
+
+ /**
+ * Function FindBestNetNameForEachNet
+ * fill the .m_NetNameCandidate member of each item of aNetItemBuffer
+ * with a reference to the "best" NETLIST_OBJECT usable to give a name to the net
+ * If no suitable object found, .m_NetNameCandidate is filled with 0.
+ * The "best" NETLIST_OBJECT is a NETLIST_OBJECT that have the type label
+ * and by priority order:
+ * the label is global or local
+ * the label is in the first sheet in a hierarchy (the root sheet has the most priority)
+ * alphabetic order.
+ */
+ void FindBestNetNameForEachNet();
+
+ #if defined(DEBUG)
+ void DumpNetTable()
+ {
+ for( unsigned idx = 0; idx < size(); ++idx )
+ {
+ GetItem( idx )->Show( std::cout, idx );
+ }
+ }
+ #endif
+private:
+ /*
+ * Propagate aNewNetCode to items having an internal netcode aOldNetCode
+ * used to interconnect group of items already physically connected,
+ * when a new connection is found between aOldNetCode and aNewNetCode
+ */
+ void propageNetCode( int aOldNetCode, int aNewNetCode, bool aIsBus );
+
+ /*
+ * This function merges the net codes of groups of objects already connected
+ * to labels (wires, bus, pins ... ) when 2 labels are equivalents
+ * (i.e. group objects connected by labels)
+ */
+ void labelConnect( NETLIST_OBJECT* aLabelRef );
+
+ /* Comparison function to sort by increasing Netcode the list of connected items
+ */
+ static bool sortItemsbyNetcode( const NETLIST_OBJECT* Objet1, const NETLIST_OBJECT* Objet2 )
+ {
+ return Objet1->GetNet() < Objet2->GetNet();
+ }
+
+
+ /* Comparison routine to sort items by Sheet Number
+ */
+ static bool sortItemsBySheet( const NETLIST_OBJECT* Objet1, const NETLIST_OBJECT* Objet2 )
+ {
+ return Objet1->m_SheetList.Cmp( Objet2->m_SheetList ) < 0;
+ }
+};
+
+
+extern NETLIST_OBJECT_LIST g_NetObjectslist;
+
+/**
+ * Function IsBusLabel
+ * test if \a aLabel has a bus notation.
+ *
+ * @param aLabel A wxString object containing the label to test.
+ * @return true if text is a bus notation format otherwise false is returned.
+ */
+extern bool IsBusLabel( const wxString& aLabel );
+
#endif // _CLASS_NETLIST_OBJECT_H_
diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp
index 3bc9498da5..939d342e4a 100644
--- a/eeschema/dialogs/dialog_erc.cpp
+++ b/eeschema/dialogs/dialog_erc.cpp
@@ -37,8 +37,8 @@
#include
#include
-#include
#include
+#include
#include
#include
#include
diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp
index bf42e23d0d..36e6349599 100644
--- a/eeschema/erc.cpp
+++ b/eeschema/erc.cpp
@@ -33,8 +33,8 @@
#include
#include
-#include
#include
+#include
#include
#include
#include
diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp
index 94d0356b48..8dde937bd9 100644
--- a/eeschema/files-io.cpp
+++ b/eeschema/files-io.cpp
@@ -35,12 +35,11 @@
#include
#include
-#include
-#include
#include
#include
#include
#include
+#include
#include
#include
diff --git a/eeschema/general.h b/eeschema/general.h
index 41f7f478cf..9c60345d0c 100644
--- a/eeschema/general.h
+++ b/eeschema/general.h
@@ -5,26 +5,20 @@
#ifndef _GENERAL_H_
#define _GENERAL_H_
-#include
-#include
+#include // for EDA_COLOR_T
-#include
-#include
-
-class SCH_SHEET;
class TRANSFORM;
+class SCH_SHEET;
#define EESCHEMA_VERSION 2
-
#define SCHEMATIC_HEAD_STRING "Schematic File Version"
#define TXTMARGE 10 // Offset in mils for placement of labels and pin numbers
#define DEFAULT_TEXT_SIZE 50 // Default size for field texts
+#define DANGLING_SYMBOL_SIZE 12
#define GR_DEFAULT_DRAWMODE GR_COPY
-#define DANGLING_SYMBOL_SIZE 12
-
// this enum is for color management
typedef enum {
LAYER_WIRE,
@@ -75,8 +69,6 @@ extern int g_RepeatDeltaLabel;
/* First and main (root) screen */
extern SCH_SHEET* g_RootSheet;
-extern NETLIST_OBJECT_LIST g_NetObjectslist;
-
/**
* Default line thickness used to draw/plot items having a
* default thickness line value (i.e. = 0 ).
diff --git a/eeschema/lib_draw_item.h b/eeschema/lib_draw_item.h
index 0e1d6d621f..786472eecb 100644
--- a/eeschema/lib_draw_item.h
+++ b/eeschema/lib_draw_item.h
@@ -32,6 +32,7 @@
#include
#include
+#include
#include
diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp
index 6cb15a3e6e..e36debda6d 100644
--- a/eeschema/libeditframe.cpp
+++ b/eeschema/libeditframe.cpp
@@ -43,6 +43,7 @@
#include
#include
#include
+#include
#include
#include
diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp
index 4cc33547c8..41571f1b43 100644
--- a/eeschema/netform.cpp
+++ b/eeschema/netform.cpp
@@ -35,8 +35,8 @@
#include
#include
-#include
#include
+#include
#include
#include
#include
@@ -121,7 +121,8 @@ class NETLIST_EXPORT_TOOL
* "/path/netname" for the usual nets
*
*/
- static void sprintPinNetName( wxString* aResult, const wxString& aNetNameFormat, NETLIST_OBJECT* aPin );
+ static void sprintPinNetName( wxString& aResult, const wxString& aNetNameFormat,
+ NETLIST_OBJECT* aPin );
/**
* Function findNextComponentAndCreatePinList
@@ -462,7 +463,7 @@ static bool sortPinsByNumber( LIB_PIN* aPin1, LIB_PIN* aPin2 )
}
-void NETLIST_EXPORT_TOOL::sprintPinNetName( wxString* aResult,
+void NETLIST_EXPORT_TOOL::sprintPinNetName( wxString& aResult,
const wxString& aNetNameFormat, NETLIST_OBJECT* aPin )
{
int netcode = aPin->GetNet();
@@ -470,34 +471,14 @@ void NETLIST_EXPORT_TOOL::sprintPinNetName( wxString* aResult,
// Not wxString::Clear(), which would free memory. We want the worst
// case wxString memory to grow to avoid reallocation from within the
// caller's loop.
- aResult->Empty();
+ aResult.Empty();
if( netcode != 0 && aPin->m_FlagOfConnection == PAD_CONNECT )
{
- NETLIST_OBJECT* netref = aPin->m_NetNameCandidate;
- if( netref )
- *aResult = netref->m_Label;
+ aResult = aPin->GetNetName();
- if( !aResult->IsEmpty() )
- {
- // prefix non global label names with the sheet path, to avoid name collisions
- if( netref->m_Type != NET_PINLABEL && netref->m_Type != NET_GLOBLABEL )
- {
- wxString lnet = *aResult;
-
- *aResult = netref->m_SheetList.PathHumanReadable();
-
- // If sheet path is too long, use the time stamp name instead
- if( aResult->Length() > 32 )
- *aResult = netref->m_SheetList.Path();
-
- *aResult += lnet;
- }
- }
- else
- {
- aResult->Printf( aNetNameFormat.GetData(), netcode );
- }
+ if( aResult.IsEmpty() ) // No net name: give a name from net code
+ aResult.Printf( aNetNameFormat.GetData(), netcode );
}
}
@@ -880,22 +861,7 @@ XNODE* NETLIST_EXPORT_TOOL::makeGenericListOfNets()
if( ( netCode = nitem->GetNet() ) != lastNetCode )
{
sameNetcodeCount = 0; // item count for this net
-
- netName.Empty();
-
- // Find a label for this net, if it exists.
- NETLIST_OBJECT* netref = nitem->m_NetNameCandidate;
- if( netref )
- {
- if( netref->m_Type != NET_PINLABEL && netref->m_Type != NET_GLOBLABEL )
- {
- // usual net name, prefix it by the sheet path
- netName = netref->m_SheetList.PathHumanReadable();
- }
-
- netName += netref->m_Label;
- }
-
+ netName = nitem->GetNetName();
lastNetCode = netCode;
}
@@ -1316,7 +1282,7 @@ bool NETLIST_EXPORT_TOOL::WriteNetListPspice( FILE* f, bool aUsePrefix )
if( !pin )
continue;
- sprintPinNetName( &netName , wxT( "N-%.6d" ), pin );
+ sprintPinNetName( netName , wxT( "N-%.6d" ), pin );
if( netName.IsEmpty() )
netName = wxT( "?" );
@@ -1470,7 +1436,7 @@ bool NETLIST_EXPORT_TOOL::WriteNetListPCBNEW( FILE* f, bool with_pcbnew )
if( !pin )
continue;
- sprintPinNetName( &netName, wxT( "N-%.6d" ), pin );
+ sprintPinNetName( netName, wxT( "N-%.6d" ), pin );
if( netName.IsEmpty() )
netName = wxT( "?" );
@@ -1682,49 +1648,33 @@ bool NETLIST_EXPORT_TOOL::writeGENERICListOfNets( FILE* f, NETLIST_OBJECT_LIST&
for( unsigned ii = 0; ii < aObjectsList.size(); ii++ )
{
SCH_COMPONENT* comp;
+ NETLIST_OBJECT* nitem = aObjectsList[ii];
// New net found, write net id;
- if( ( netCode = aObjectsList[ii]->GetNet() ) != lastNetCode )
+ if( ( netCode = nitem->GetNet() ) != lastNetCode )
{
sameNetcodeCount = 0; // Items count for this net
- netName.Empty();
-
- // Find a label (if exists) for this net.
- NETLIST_OBJECT* netref;
- netref = aObjectsList[ii]->m_NetNameCandidate;
- if( netref )
- netName = netref->m_Label;
+ netName = nitem->GetNetName();
netcodeName.Printf( wxT( "Net %d " ), netCode );
- netcodeName += wxT( "\"" );
- if( !netName.IsEmpty() )
- {
- if( ( netref->m_Type != NET_PINLABEL )
- && ( netref->m_Type != NET_GLOBLABEL ) )
- {
- // usual net name, prefix it by the sheet path
- netcodeName += netref->m_SheetList.PathHumanReadable();
- }
- netcodeName += netName;
- }
- netcodeName += wxT( "\"" );
+ netcodeName << wxT( "\"" ) << netName << wxT( "\"" );
// Add the netname without prefix, in cases we need only the
// "short" netname
- netcodeName += wxT( " \"" ) + netName + wxT( "\"" );
+ netcodeName += wxT( " \"" ) + nitem->GetShortNetName() + wxT( "\"" );
lastNetCode = netCode;
}
- if( aObjectsList[ii]->m_Type != NET_PIN )
+ if( nitem->m_Type != NET_PIN )
continue;
- if( aObjectsList[ii]->m_Flag != 0 ) // Redundant pin, skip it
+ if( nitem->m_Flag != 0 ) // Redundant pin, skip it
continue;
- comp = (SCH_COMPONENT*) aObjectsList[ii]->m_Link;
+ comp = (SCH_COMPONENT*) nitem->m_Link;
// Get the reference for the net name and the main parent component
- ref = comp->GetRef( &aObjectsList[ii]->m_SheetList );
+ ref = comp->GetRef( &nitem->m_SheetList );
if( ref[0] == wxChar( '#' ) )
continue; // Pseudo component (Like Power symbol)
@@ -1750,7 +1700,7 @@ bool NETLIST_EXPORT_TOOL::writeGENERICListOfNets( FILE* f, NETLIST_OBJECT_LIST&
if( sameNetcodeCount >= 2 )
ret |= fprintf( f, " %s %.4s\n", TO_UTF8( ref ),
- (const char*) &aObjectsList[ii]->m_PinNum );
+ (const char*) &nitem->m_PinNum );
}
return ret >= 0;
@@ -1841,48 +1791,37 @@ bool NETLIST_EXPORT_TOOL::writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST&
int print_ter = 0;
int NetCode, lastNetCode = -1;
SCH_COMPONENT* Cmp;
- wxString NetName;
+ wxString netName;
for( ii = 0; ii < g_NetObjectslist.size(); ii++ )
{
+ NETLIST_OBJECT* nitem = aObjectsList[ii];
+
// Get the NetName of the current net :
- if( ( NetCode = aObjectsList[ii]->GetNet() ) != lastNetCode )
+ if( ( NetCode = nitem->GetNet() ) != lastNetCode )
{
- NetName.Empty();
-
- NETLIST_OBJECT* netref;
- netref = aObjectsList[ii]->m_NetNameCandidate;
- if( netref )
- NetName = netref->m_Label;
-
+ netName = nitem->GetNetName();
netcodeName = wxT( "\"" );
- if( !NetName.IsEmpty() )
- {
- if( ( netref->m_Type != NET_PINLABEL )
- && ( netref->m_Type != NET_GLOBLABEL ) )
- {
- // usual net name, prefix it by the sheet path
- netcodeName +=
- netref->m_SheetList.PathHumanReadable();
- }
- netcodeName += NetName;
- }
+
+ if( !netName.IsEmpty() )
+ netcodeName << netName;
else // this net has no name: create a default name $
netcodeName << wxT( "$" ) << NetCode;
+
netcodeName += wxT( "\"" );
lastNetCode = NetCode;
print_ter = 0;
}
- if( aObjectsList[ii]->m_Type != NET_PIN )
+ if( nitem->m_Type != NET_PIN )
continue;
- if( aObjectsList[ii]->m_Flag != 0 )
+ if( nitem->m_Flag != 0 )
continue;
- Cmp = (SCH_COMPONENT*) aObjectsList[ii]->m_Link;
- wxString refstr = Cmp->GetRef( &(aObjectsList[ii]->m_SheetList) );
+ Cmp = (SCH_COMPONENT*) nitem->m_Link;
+ wxString refstr = Cmp->GetRef( &nitem->m_SheetList );
if( refstr[0] == '#' )
continue; // Power supply symbols.
@@ -1892,7 +1831,7 @@ bool NETLIST_EXPORT_TOOL::writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST&
{
char buf[5];
wxString str_pinnum;
- strncpy( buf, (char*) &aObjectsList[ii]->m_PinNum, 4 );
+ strncpy( buf, (char*) &nitem->m_PinNum, 4 );
buf[4] = 0;
str_pinnum = FROM_UTF8( buf );
InitNetDescLine.Printf( wxT( "\n%s %s %.4s %s" ),
@@ -1909,18 +1848,18 @@ bool NETLIST_EXPORT_TOOL::writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST&
ret |= fprintf( f, "%s %s %.4s\n",
TO_UTF8( StartNetDesc ),
TO_UTF8( refstr ),
- (char*) &aObjectsList[ii]->m_PinNum );
+ (char*) &nitem->m_PinNum );
print_ter++;
break;
default:
ret |= fprintf( f, " %s %.4s\n",
TO_UTF8( refstr ),
- (char*) &aObjectsList[ii]->m_PinNum );
+ (char*) &nitem->m_PinNum );
break;
}
- aObjectsList[ii]->m_Flag = 1;
+ nitem->m_Flag = 1;
}
return ret >= 0;
diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp
index 9ca38ee584..3ba0f26408 100644
--- a/eeschema/netlist.cpp
+++ b/eeschema/netlist.cpp
@@ -1,9 +1,9 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
- * Copyright (C) 2011 Wayne Stambaugh
- * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 2013 Wayne Stambaugh
+ * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -30,8 +30,8 @@
#include
#include
-#include
#include
+#include
#include
#include
#include
@@ -45,126 +45,113 @@
#include
-
-const SCH_SHEET_PATH BOM_LABEL::emptySheetPath;
-
-
-enum BUS_OR_WIRE
-{
- IS_WIRE = 0,
- IS_BUS = 1
-};
+#define IS_WIRE false
+#define IS_BUS true
// Buffer to build the list of items used in netlist and erc calculations
-NETLIST_OBJECT_LIST g_NetObjectslist;
+NETLIST_OBJECT_LIST g_NetObjectslist( true );
//#define NETLIST_DEBUG
-static void PropageNetCode( int OldNetCode, int NewNetCode, BUS_OR_WIRE IsBus );
-static void SheetLabelConnect( NETLIST_OBJECT* SheetLabel );
-static void PointToPointConnect( NETLIST_OBJECT* Ref, BUS_OR_WIRE IsBus, int start );
-static void SegmentToPointConnect( NETLIST_OBJECT* Jonction, BUS_OR_WIRE IsBus, int start );
-static void LabelConnect( NETLIST_OBJECT* Label );
-static void ConnectBusLabels( NETLIST_OBJECT_LIST& aNetItemBuffer );
-static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer );
-
-static void FindBestNetNameForEachNet( NETLIST_OBJECT_LIST& aNetItemBuffer );
-static NETLIST_OBJECT* FindBestNetName( NETLIST_OBJECT_LIST& aLabelItemBuffer );
-
-// Sort functions used here:
-static bool SortItemsbyNetcode( const NETLIST_OBJECT* Objet1, const NETLIST_OBJECT* Objet2 );
-static bool SortItemsBySheet( const NETLIST_OBJECT* Objet1, const NETLIST_OBJECT* Objet2 );
-
// Local variables
static int LastNetCode, LastBusNetCode;
-
-#if defined(DEBUG)
-
-void dumpNetTable()
+NETLIST_OBJECT_LIST::~NETLIST_OBJECT_LIST()
{
- for( unsigned idx = 0; idx < g_NetObjectslist.size(); ++idx )
- {
- g_NetObjectslist[idx]->Show( std::cout, idx );
- }
-}
-
-#endif
-
-
-wxString BOM_LABEL::GetText() const
-{
- const SCH_TEXT* tmp = (SCH_TEXT*) m_label;
-
- return tmp->GetText();
+ if( m_isOwner )
+ ClearList();
}
/*
- * Routine to free memory used to calculate the netlist TabNetItems = pointer
- * to the main table (list items)
+ * Delete all objects in list and clear list
+ * (free memory used to store info about NETLIST_OBJECT items)
*/
-static void FreeNetObjectsList( NETLIST_OBJECT_LIST& aNetObjectsBuffer )
+void NETLIST_OBJECT_LIST::ClearList()
{
- for( unsigned i = 0; i < aNetObjectsBuffer.size(); i++ )
- delete aNetObjectsBuffer[i];
+ std::vector::iterator iter;
- aNetObjectsBuffer.clear();
+ for( iter = begin(); iter != end(); iter++ )
+ {
+ NETLIST_OBJECT* item = *iter;
+ delete item;
+ }
+
+ clear();
+}
+
+void NETLIST_OBJECT_LIST::SortListbyNetcode()
+{
+ sort( this->begin(), this->end(), NETLIST_OBJECT_LIST::sortItemsbyNetcode );
+}
+
+void NETLIST_OBJECT_LIST::SortListbySheet()
+{
+ sort( this->begin(), this->end(), NETLIST_OBJECT_LIST::sortItemsBySheet );
}
/*
* Build net list connection table.
- *
- * Updates:
- * g_NetObjectslist
+ * Updates g_NetObjectslist
*/
void SCH_EDIT_FRAME::BuildNetListBase()
{
- int NetCode;
- SCH_SHEET_PATH* sheet;
- wxString msg, activity;
wxBusyCursor Busy;
- activity = _( "Building net list:" );
- SetStatusText( activity );
+ // Creates the flattened sheet list:
+ SCH_SHEET_LIST aSheets;
- FreeNetObjectsList( g_NetObjectslist );
+ // Build netlist info
+ bool success = g_NetObjectslist.BuildNetListInfo( aSheets );
- /* Build the sheet (not screen) list (flattened)*/
- SCH_SHEET_LIST sheets;
-
- /* Fill g_NetObjectslist with items used in connectivity calculation */
- for( sheet = sheets.GetFirst(); sheet != NULL; sheet = sheets.GetNext() )
+ if( !success )
{
- for( SCH_ITEM* item = sheet->LastScreen()->GetDrawItems(); item; item = item->Next() )
- {
- item->GetNetListItem( g_NetObjectslist, sheet );
- }
+ SetStatusText( _("No Objects" ) );
+ return;
}
- if( g_NetObjectslist.size() == 0 )
- return; // no objects
-
/* The new %zu specification is needed to properly format a size_t
* value (returned by size(), here) */
- activity += wxString::Format( _( " net count = %zu" ),
- g_NetObjectslist.size() );
- SetStatusText( activity );
+ wxString msg;
- /* Sort objects by Sheet */
+ msg.Printf( _( "Net count = %zu" ), g_NetObjectslist.size() );
+ SetStatusText( msg );
+}
- sort( g_NetObjectslist.begin(), g_NetObjectslist.end(), SortItemsBySheet );
+/* the master function of NETLIST_OBJECT_LIST class.
+ * Build the list of connected objects (pins, labels ...) and
+ * all info needed to generate netlists or run ERC diags
+ */
+bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets )
+{
+ g_NetObjectslist.SetOwner( true );
+ g_NetObjectslist.ClearList();
- activity += _( ", connections... " );
- SetStatusText( activity );
+ SCH_SHEET_PATH* sheet;
- sheet = &(g_NetObjectslist[0]->m_SheetList);
+ // Fill list with connected items from the flattened sheet list
+ for( sheet = aSheets.GetFirst(); sheet != NULL;
+ sheet = aSheets.GetNext() )
+ {
+ for( SCH_ITEM* item = sheet->LastScreen()->GetDrawItems(); item; item = item->Next() )
+ {
+ item->GetNetListItem( *this, sheet );
+ }
+ }
+
+ if( size() == 0 )
+ return false;
+
+ // Sort objects by Sheet
+ SortListbySheet();
+
+ sheet = &(GetItem( 0 )->m_SheetList);
LastNetCode = LastBusNetCode = 1;
- for( unsigned ii = 0, istart = 0; ii < g_NetObjectslist.size(); ii++ )
+ for( unsigned ii = 0, istart = 0; ii < size(); ii++ )
{
- NETLIST_OBJECT* net_item = g_NetObjectslist[ii];
+ NETLIST_OBJECT* net_item = GetItem( ii );
if( net_item->m_SheetList != *sheet ) // Sheet change
{
@@ -186,7 +173,7 @@ void SCH_EDIT_FRAME::BuildNetListBase()
break;
case NET_SEGMENT:
- /* Control connections point to point type without bus. */
+ // Test connections point to point type without bus.
if( net_item->GetNet() == 0 )
{
net_item->SetNet( LastNetCode );
@@ -197,7 +184,7 @@ void SCH_EDIT_FRAME::BuildNetListBase()
break;
case NET_JUNCTION:
- /* Control of the junction outside BUS. */
+ // Control of the junction outside BUS.
if( net_item->GetNet() == 0 )
{
net_item->SetNet( LastNetCode );
@@ -219,7 +206,7 @@ void SCH_EDIT_FRAME::BuildNetListBase()
case NET_LABEL:
case NET_HIERLABEL:
case NET_GLOBLABEL:
- /* Control connections type junction without bus. */
+ // Test connections type junction without bus.
if( net_item->GetNet() == 0 )
{
net_item->SetNet( LastNetCode );
@@ -261,22 +248,16 @@ void SCH_EDIT_FRAME::BuildNetListBase()
#if defined(NETLIST_DEBUG) && defined(DEBUG)
std::cout << "\n\nafter sheet local\n\n";
- dumpNetTable();
+ DumpNetTable();
#endif
- activity += _( "done" );
- SetStatusText( activity );
-
/* Updating the Bus Labels Netcode connected by Bus */
- ConnectBusLabels( g_NetObjectslist );
-
- activity += _( ", bus labels..." );
- SetStatusText( activity );
+ ConnectBusLabels();
/* Group objects by label. */
- for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ )
+ for( unsigned ii = 0; ii < size(); ii++ )
{
- switch( g_NetObjectslist[ii]->m_Type )
+ switch( GetItem( ii )->m_Type )
{
case NET_PIN:
case NET_SHEETLABEL:
@@ -291,7 +272,7 @@ void SCH_EDIT_FRAME::BuildNetListBase()
case NET_PINLABEL:
case NET_BUSLABELMEMBER:
case NET_GLOBBUSLABELMEMBER:
- LabelConnect( g_NetObjectslist[ii] );
+ labelConnect( GetItem( ii ) );
break;
case NET_SHEETBUSLABELMEMBER:
@@ -306,53 +287,106 @@ void SCH_EDIT_FRAME::BuildNetListBase()
#if defined(NETLIST_DEBUG) && defined(DEBUG)
std::cout << "\n\nafter sheet global\n\n";
- dumpNetTable();
+ DumpNetTable();
#endif
- activity += _( "done" );
- SetStatusText( activity );
-
- /* Connection hierarchy. */
- activity += _( ", hierarchy..." );
- SetStatusText( activity );
-
+ // Connection between hierarchy sheets
for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ )
{
- if( g_NetObjectslist[ii]->m_Type == NET_SHEETLABEL
- || g_NetObjectslist[ii]->m_Type == NET_SHEETBUSLABELMEMBER )
- SheetLabelConnect( g_NetObjectslist[ii] );
+ if( GetItem( ii )->m_Type == NET_SHEETLABEL
+ || GetItem( ii )->m_Type == NET_SHEETBUSLABELMEMBER )
+ SheetLabelConnect( GetItem( ii ) );
}
- /* Sort objects by NetCode */
- sort( g_NetObjectslist.begin(), g_NetObjectslist.end(), SortItemsbyNetcode );
+ // Sort objects by NetCode
+ SortListbyNetcode();
#if defined(NETLIST_DEBUG) && defined(DEBUG)
std::cout << "\n\nafter qsort()\n";
- dumpNetTable();
+ DumpNetTable();
#endif
- activity += _( "done" );
- SetStatusText( activity );
-
/* Compress numbers of Netcode having consecutive values. */
- LastNetCode = NetCode = 0;
+ int NetCode = 0;
+ LastNetCode = 0;
- for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ )
+ for( unsigned ii = 0; ii < size(); ii++ )
{
- if( g_NetObjectslist[ii]->GetNet() != LastNetCode )
+ if( GetItem( ii )->GetNet() != LastNetCode )
{
NetCode++;
- LastNetCode = g_NetObjectslist[ii]->GetNet();
+ LastNetCode = GetItem( ii )->GetNet();
}
- g_NetObjectslist[ii]->SetNet( NetCode );
+ GetItem( ii )->SetNet( NetCode );
}
- /* Assignment of m_FlagOfConnection based connection or not. */
- SetUnconnectedFlag( g_NetObjectslist );
+ // Set the minimal connection info:
+ SetUnconnectedFlag();
- /* find the best label object to give the best net name to each net */
- FindBestNetNameForEachNet( g_NetObjectslist );
+ // find the best label object to give the best net name to each net
+ FindBestNetNameForEachNet();
+
+ return true;
+}
+
+// Helper function to give a priority to sort labels:
+// NET_PINLABEL and NET_GLOBLABEL are global labels
+// and the priority is hight
+static int getPriority( const NETLIST_OBJECT* Objet )
+{
+ switch( Objet->m_Type )
+ {
+ case NET_PIN: return 1;
+ case NET_LABEL: return 2;
+ case NET_HIERLABEL: return 3;
+ case NET_PINLABEL: return 4;
+ case NET_GLOBLABEL: return 5;
+ default: break;
+ }
+
+ return 0;
+}
+
+/* function evalLabelsPriority used by FindBestNetNameForEachNet()
+ * evalLabelsPriority calculates the priority of alabel1 and aLabel2
+ * return true if alabel1 has a smaller priority than aLabel2
+ */
+static bool evalLabelsPriority( const NETLIST_OBJECT* aLabel1,
+ const NETLIST_OBJECT* aLabel2 )
+{
+ int priority1 = getPriority( aLabel1 );
+ int priority2 = getPriority( aLabel2 );
+
+ if( priority1 != priority2 )
+ return priority1 < priority2;
+
+ // Objects have here the same priority, therefore they have the same type.
+
+ // for global labels, we select the best candidate by alphabetic order
+ // because they have no sheetpath as prefix name
+ // for other labels, we select them before by sheet deep order
+ // because the actual name is /sheetpath/label
+ // and for a given path length, by alphabetic order
+
+ if( aLabel1->m_Type == NET_PINLABEL || aLabel1->m_Type == NET_GLOBLABEL )
+ return aLabel1->m_Label.Cmp( aLabel2->m_Label );
+
+ // not global: names are prefixed by their sheetpath
+ // use name defined in higher hierarchical sheet
+ // (i.e. shorter path because paths are ///...
+ // and timestamp = 8 letters.
+ if( aLabel1->m_SheetList.Path().Length() != aLabel2->m_SheetList.Path().Length() )
+ return aLabel1->m_SheetList.Path().Length() < aLabel2->m_SheetList.Path().Length();
+
+ // Sheet paths have the same length: use alphabetic label name order
+ // For labels on sheets having an equivalent deep in hierarchy, use
+ // alphabetic label name order:
+ if( aLabel1->m_Label.Cmp( aLabel2->m_Label ) != 0 )
+ return aLabel1->m_Label.Cmp( aLabel2->m_Label ) ;
+
+ return aLabel1->m_SheetList.PathHumanReadable().Cmp(
+ aLabel2->m_SheetList.PathHumanReadable() );
}
@@ -367,39 +401,37 @@ void SCH_EDIT_FRAME::BuildNetListBase()
* the label is in the first sheet in a hierarchy (the root sheet has the most priority)
* alphabetic order.
*/
-void FindBestNetNameForEachNet( NETLIST_OBJECT_LIST& aNetItemBuffer )
+void NETLIST_OBJECT_LIST::FindBestNetNameForEachNet()
{
- if( aNetItemBuffer.size() == 0 )
- return; // Should not occur: if this function is called, obviously some items exist in list
-
- NETLIST_OBJECT_LIST candidates;
int netcode = 0; // current netcode for tested items
- unsigned idxstart = 0; // index of the first item of this net
+ unsigned idxstart = 0; // index of the first item of this net
+ NETLIST_OBJECT* item;
+ NETLIST_OBJECT* candidate;
- for( unsigned ii = 0; ii <= aNetItemBuffer.size(); ii++ )
+ // Pass 1: find the best name for labelled nets:
+ item = NULL;
+ candidate = NULL;
+ for( unsigned ii = 0; ii <= size(); ii++ )
{
- NETLIST_OBJECT* item;
- if( ii == aNetItemBuffer.size() ) // last item already found
+ if( ii == size() ) // last item already found
netcode = -2;
else
- item = aNetItemBuffer[ii];
+ item = GetItem( ii );
- if( netcode != item->GetNet() ) // End of net found
+ if( netcode != item->GetNet() ) // End of net found
{
- if( candidates.size() ) // One or more labels exists, find the best
+ if( candidate ) // One or more labels exists, find the best
{
- NETLIST_OBJECT* bestlabel = FindBestNetName( candidates );
-
for (unsigned jj = idxstart; jj < ii; jj++ )
- aNetItemBuffer[jj]->m_NetNameCandidate = bestlabel;
+ GetItem( jj )->SetNetNameCandidate( candidate );
}
if( netcode == -2 )
break;
netcode = item->GetNet();
- candidates.clear();
+ candidate = NULL;
idxstart = ii;
}
@@ -409,138 +441,85 @@ void FindBestNetNameForEachNet( NETLIST_OBJECT_LIST& aNetItemBuffer )
case NET_LABEL:
case NET_PINLABEL:
case NET_GLOBLABEL:
- candidates.push_back( item );
+ // A candidate is found: select the better between the previous
+ // and this one
+ if( candidate == NULL )
+ candidate = item;
+ else
+ {
+ if( evalLabelsPriority( item, candidate ) )
+ candidate = item;
+ }
break;
default:
break;
}
}
-}
-
-/**
- * Function FindBestNetName
- * @return a reference to the "best" label that can be used to give a name
- * to a net.
- * @param aLabelItemBuffer = list of NETLIST_OBJECT type labels candidates.
- * labels are local labels, hierarchical labels or pin labels
- * labels in included sheets have a lower priority than labels in the current sheet.
- * so labels inside the root sheet have the higher priority.
- * pin labels are global labels and have the higher priority
- * local labels have the lower priority
- * labels having the same priority are sorted by alphabetic order.
- *
- */
-static NETLIST_OBJECT* FindBestNetName( NETLIST_OBJECT_LIST& aLabelItemBuffer )
-{
- if( aLabelItemBuffer.size() == 0 )
- return NULL;
-
- // Define a priority (from low to high) to sort labels:
- // NET_PINLABEL and NET_GLOBLABEL are global labels
- // and priority >= NET_PRIO_MAX-1 is for global connections
- // ( i.e. for labels that are not prefixed by a sheetpath)
- #define NET_PRIO_MAX 4
-
- static int priority_order[NET_PRIO_MAX+1] = {
- NET_ITEM_UNSPECIFIED,
- NET_LABEL,
- NET_HIERLABEL,
- NET_PINLABEL,
- NET_GLOBLABEL };
-
- NETLIST_OBJECT*item = aLabelItemBuffer[0];
-
- // Calculate item priority (initial priority)
- int item_priority = 0;
-
- for( unsigned ii = 0; ii <= NET_PRIO_MAX; ii++ )
+ // Pass 2: find the best name for not labelled nets:
+ // The "default" net name is Net-<][_Pad>
+ // (see NETLIST_OBJECT::GetShortNetName())
+ // therefore the "best" is the short net name alphabetically classed first
+ // (to avoid net names changes when the net is not modified,
+ // even if components are moved or deleted and undelete or replaced, as long
+ // the reference is kept)
+ netcode = 0;
+ idxstart = 0;
+ candidate = NULL;
+ item = NULL;
+ for( unsigned ii = 0; ii <= size(); ii++ )
{
- if ( item->m_Type == priority_order[ii] )
+ if( ii == size() ) // last item already found
+ netcode = -2;
+ else
+ item = GetItem( ii );
+
+ if( netcode != item->GetNet() ) // End of net found
{
- item_priority = ii;
- break;
- }
- }
-
- for( unsigned ii = 1; ii < aLabelItemBuffer.size(); ii++ )
- {
- NETLIST_OBJECT* candidate = aLabelItemBuffer[ii];
-
- // Calculate candidate priority
- int candidate_priority = 0;
-
- for( unsigned prio = 0; prio <= NET_PRIO_MAX; prio++ )
- {
- if ( candidate->m_Type == priority_order[prio] )
+ if( candidate )
{
- candidate_priority = prio;
+ for (unsigned jj = idxstart; jj < ii; jj++ )
+ GetItem( jj )->SetNetNameCandidate( candidate );
+ }
+
+ if( netcode == -2 )
break;
- }
- }
- if( candidate_priority > item_priority )
- {
- item = candidate;
- item_priority = candidate_priority;
- }
- else if( candidate_priority == item_priority )
- {
- // for global labels, we select the best candidate by alphabetic order
- // because they have no sheetpath as prefix name
- // for other labels, we select them before by sheet deep order
- // because the actual name is /sheetpath/label
- // and for a given path length, by alphabetic order
- if( item_priority >= NET_PRIO_MAX-1 ) // global label or pin label
- { // selection by alphabetic order:
- if( candidate->m_Label.Cmp( item->m_Label ) < 0 )
- item = candidate;
- }
- else // not global: names are prefixed by their sheetpath
+ netcode = item->GetNet();
+ candidate = NULL;
+ idxstart = ii;
+ }
+
+ if( item->m_Type == NET_PIN && item->GetShortNetName().IsEmpty() )
+ {
+ // A candidate is found: select the better between the previous
+ // and this one
+ item->SetNetNameCandidate( item ); // Needed to calculate GetShortNetName
+ if( candidate == NULL )
+ candidate = item;
+ else
{
- // use name defined in higher hierarchical sheet
- // (i.e. shorter path because paths are ///...
- // and timestamp = 8 letters.
- if( candidate->m_SheetList.Path().Length() < item->m_SheetList.Path().Length() )
- {
- item = candidate;
- }
- else if( candidate->m_SheetList.Path().Length() == item->m_SheetList.Path().Length() )
- {
- // For labels on sheets having an equivalent deep in hierarchy, use
- // alphabetic label name order:
- if( candidate->m_Label.Cmp( item->m_Label ) < 0 )
- item = candidate;
- else if( candidate->m_Label.Cmp( item->m_Label ) == 0 )
- {
- if( candidate->m_SheetList.PathHumanReadable().Cmp( item->m_SheetList.PathHumanReadable() ) < 0 )
- item = candidate;
- }
- }
+ if( item->GetShortNetName().Cmp( candidate->GetShortNetName() ) < 0 )
+ candidate = item;
}
}
}
-
- return item;
}
/*
- * Connect sheets by sheetLabels
+ * Propagate net codes from a parent sheet to an include sheet,
+ * from a pin sheet connection
*/
-static void SheetLabelConnect( NETLIST_OBJECT* SheetLabel )
+void NETLIST_OBJECT_LIST::SheetLabelConnect( NETLIST_OBJECT* SheetLabel )
{
if( SheetLabel->GetNet() == 0 )
return;
- /* Calculate the number of nodes in the corresponding sheetlabel */
-
- /* Comparison with SheetLabel GLABELS sub sheet to group Netcode */
-
- for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ )
+ for( unsigned ii = 0; ii < size(); ii++ )
{
- NETLIST_OBJECT* ObjetNet = g_NetObjectslist[ii];
+ NETLIST_OBJECT* ObjetNet = GetItem( ii );
if( ObjetNet->m_SheetList != SheetLabel->m_SheetListInclude )
continue; //use SheetInclude, not the sheet!!
@@ -554,9 +533,9 @@ static void SheetLabelConnect( NETLIST_OBJECT* SheetLabel )
if( ObjetNet->m_Label.CmpNoCase( SheetLabel->m_Label ) != 0 )
continue; //different names.
- /* Propagate Netcode having all the objects of the same Netcode. */
+ // Propagate Netcode having all the objects of the same Netcode.
if( ObjetNet->GetNet() )
- PropageNetCode( ObjetNet->GetNet(), SheetLabel->GetNet(), IS_WIRE );
+ propageNetCode( ObjetNet->GetNet(), SheetLabel->GetNet(), IS_WIRE );
else
ObjetNet->SetNet( SheetLabel->GetNet() );
}
@@ -564,17 +543,17 @@ static void SheetLabelConnect( NETLIST_OBJECT* SheetLabel )
/*
- * Routine that analyzes the type labels xxBUSLABELMEMBER
- * Propagate Netcode between the corresponding labels (ie when
- * Their member number is the same) when they are connected
- * Generally by their BusNetCode
+ * Analyzes the labels type bus member (
+ * Propagate net codes between the corresponding labels (ie when
+ * the is the same) when they are connected
+ * uqsually by their BusNetCode
* Uses and updates the variable LastNetCode
*/
-static void ConnectBusLabels( NETLIST_OBJECT_LIST& aNetItemBuffer )
+void NETLIST_OBJECT_LIST::ConnectBusLabels()
{
- for( unsigned ii = 0; ii < aNetItemBuffer.size(); ii++ )
+ for( unsigned ii = 0; ii < size(); ii++ )
{
- NETLIST_OBJECT* Label = aNetItemBuffer[ii];
+ NETLIST_OBJECT* Label = GetItem( ii );
if( (Label->m_Type == NET_SHEETBUSLABELMEMBER)
|| (Label->m_Type == NET_BUSLABELMEMBER)
@@ -586,9 +565,9 @@ static void ConnectBusLabels( NETLIST_OBJECT_LIST& aNetItemBuffer )
LastNetCode++;
}
- for( unsigned jj = ii + 1; jj < aNetItemBuffer.size(); jj++ )
+ for( unsigned jj = ii + 1; jj < size(); jj++ )
{
- NETLIST_OBJECT* LabelInTst = aNetItemBuffer[jj];
+ NETLIST_OBJECT* LabelInTst = GetItem( jj );
if( (LabelInTst->m_Type == NET_SHEETBUSLABELMEMBER)
|| (LabelInTst->m_Type == NET_BUSLABELMEMBER)
|| (LabelInTst->m_Type == NET_HIERBUSLABELMEMBER) )
@@ -602,7 +581,7 @@ static void ConnectBusLabels( NETLIST_OBJECT_LIST& aNetItemBuffer )
if( LabelInTst->GetNet() == 0 )
LabelInTst->SetNet( Label->GetNet() );
else
- PropageNetCode( LabelInTst->GetNet(), Label->GetNet(), IS_WIRE );
+ propageNetCode( LabelInTst->GetNet(), Label->GetNet(), IS_WIRE );
}
}
}
@@ -611,38 +590,34 @@ static void ConnectBusLabels( NETLIST_OBJECT_LIST& aNetItemBuffer )
/*
- * PropageNetCode propagates Netcode NewNetCode on all elements
- * belonging to the former Netcode OldNetCode
- * If IsBus == 0; Netcode is the member who is spreading
- * If IsBus != 0; is the member who is spreading BusNetCode
+ * propageNetCode propagates the net code NewNetCode to all elements
+ * having previously the net code OldNetCode
+ * If IsBus == false, m_Netcode is used to propagate the new net code
+ * If IsBus == true, m_BusNetCode is used to propagate the new net code
*/
-static void PropageNetCode( int OldNetCode, int NewNetCode, BUS_OR_WIRE IsBus )
+void NETLIST_OBJECT_LIST::propageNetCode( int aOldNetCode, int aNewNetCode, bool aIsBus )
{
- if( OldNetCode == NewNetCode )
+ if( aOldNetCode == aNewNetCode )
return;
- if( IsBus == IS_WIRE ) // Propagate NetCode
+ if( aIsBus == false ) // Propagate NetCode
{
- for( unsigned jj = 0; jj < g_NetObjectslist.size(); jj++ )
+ for( unsigned jj = 0; jj < size(); jj++ )
{
- NETLIST_OBJECT* Objet = g_NetObjectslist[jj];
+ NETLIST_OBJECT* objet = GetItem( jj );
- if( Objet->GetNet() == OldNetCode )
- {
- Objet->SetNet( NewNetCode );
- }
+ if( objet->GetNet() == aOldNetCode )
+ objet->SetNet( aNewNetCode );
}
}
- else /* Propagate BusNetCode */
+ else // Propagate BusNetCode
{
- for( unsigned jj = 0; jj < g_NetObjectslist.size(); jj++ )
+ for( unsigned jj = 0; jj < size(); jj++ )
{
- NETLIST_OBJECT* Objet = g_NetObjectslist[jj];
+ NETLIST_OBJECT* objet = GetItem( jj );
- if( Objet->m_BusNetCode == OldNetCode )
- {
- Objet->m_BusNetCode = NewNetCode;
- }
+ if( objet->m_BusNetCode == aOldNetCode )
+ objet->m_BusNetCode = aNewNetCode;
}
}
}
@@ -667,19 +642,20 @@ static void PropageNetCode( int OldNetCode, int NewNetCode, BUS_OR_WIRE IsBus )
* Leaf schema
* (There can be no physical connection between elements of different sheets)
*/
-static void PointToPointConnect( NETLIST_OBJECT* Ref, BUS_OR_WIRE IsBus, int start )
+void NETLIST_OBJECT_LIST::PointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus,
+ int start )
{
int netCode;
- if( IsBus == IS_WIRE ) // Objects other than BUS and BUSLABELS
+ if( aIsBus == false ) // Objects other than BUS and BUSLABELS
{
- netCode = Ref->GetNet();
+ netCode = aRef->GetNet();
- for( unsigned i = start; i < g_NetObjectslist.size(); i++ )
+ for( unsigned i = start; i < size(); i++ )
{
- NETLIST_OBJECT* item = g_NetObjectslist[i];
+ NETLIST_OBJECT* item = GetItem( i );
- if( item->m_SheetList != Ref->m_SheetList ) //used to be > (why?)
+ if( item->m_SheetList != aRef->m_SheetList ) //used to be > (why?)
continue;
switch( item->m_Type )
@@ -693,15 +669,15 @@ static void PointToPointConnect( NETLIST_OBJECT* Ref, BUS_OR_WIRE IsBus, int sta
case NET_PINLABEL:
case NET_JUNCTION:
case NET_NOCONNECT:
- if( Ref->m_Start == item->m_Start
- || Ref->m_Start == item->m_End
- || Ref->m_End == item->m_Start
- || Ref->m_End == item->m_End )
+ if( aRef->m_Start == item->m_Start
+ || aRef->m_Start == item->m_End
+ || aRef->m_End == item->m_Start
+ || aRef->m_End == item->m_End )
{
if( item->GetNet() == 0 )
item->SetNet( netCode );
else
- PropageNetCode( item->GetNet(), netCode, IS_WIRE );
+ propageNetCode( item->GetNet(), netCode, IS_WIRE );
}
break;
@@ -717,13 +693,13 @@ static void PointToPointConnect( NETLIST_OBJECT* Ref, BUS_OR_WIRE IsBus, int sta
}
else /* Object type BUS, BUSLABELS, and junctions. */
{
- netCode = Ref->m_BusNetCode;
+ netCode = aRef->m_BusNetCode;
- for( unsigned i = start; im_SheetList != Ref->m_SheetList )
+ if( item->m_SheetList != aRef->m_SheetList )
continue;
switch( item->m_Type )
@@ -745,15 +721,15 @@ static void PointToPointConnect( NETLIST_OBJECT* Ref, BUS_OR_WIRE IsBus, int sta
case NET_HIERBUSLABELMEMBER:
case NET_GLOBBUSLABELMEMBER:
case NET_JUNCTION:
- if( Ref->m_Start == item->m_Start
- || Ref->m_Start == item->m_End
- || Ref->m_End == item->m_Start
- || Ref->m_End == item->m_End )
+ if( aRef->m_Start == item->m_Start
+ || aRef->m_Start == item->m_End
+ || aRef->m_End == item->m_Start
+ || aRef->m_End == item->m_End )
{
if( item->m_BusNetCode == 0 )
item->m_BusNetCode = netCode;
else
- PropageNetCode( item->m_BusNetCode, netCode, IS_BUS );
+ propageNetCode( item->m_BusNetCode, netCode, IS_BUS );
}
break;
}
@@ -763,131 +739,111 @@ static void PointToPointConnect( NETLIST_OBJECT* Ref, BUS_OR_WIRE IsBus, int sta
/*
- * Search if a junction is connected to segments and propagate the junction Netcode
- * to objects connected by the junction.
- * The junction must have a valid Netcode
+ * Search connections betweena junction and segments
+ * Propagate the junction net code to objects connected by this junction.
+ * The junction must have a valid net code
* The list of objects is expected sorted by sheets.
- * Search is done from index aIdxStart to the last element of g_NetObjectslist
+ * Search is done from index aIdxStart to the last element of list
*/
-static void SegmentToPointConnect( NETLIST_OBJECT* aJonction, BUS_OR_WIRE aIsBus, int aIdxStart )
+void NETLIST_OBJECT_LIST::SegmentToPointConnect( NETLIST_OBJECT* aJonction,
+ bool aIsBus, int aIdxStart )
{
- for( unsigned i = aIdxStart; i < g_NetObjectslist.size(); i++ )
+ for( unsigned i = aIdxStart; i < size(); i++ )
{
- NETLIST_OBJECT* Segment = g_NetObjectslist[i];
+ NETLIST_OBJECT* segment = GetItem( i );
- // if different sheets, no physical connection between elements is possible.
- if( Segment->m_SheetList != aJonction->m_SheetList )
+ // if different sheets, obviously no physical connection between elements.
+ if( segment->m_SheetList != aJonction->m_SheetList )
continue;
if( aIsBus == IS_WIRE )
{
- if( Segment->m_Type != NET_SEGMENT )
+ if( segment->m_Type != NET_SEGMENT )
continue;
}
else
{
- if( Segment->m_Type != NET_BUS )
+ if( segment->m_Type != NET_BUS )
continue;
}
- if( SegmentIntersect( Segment->m_Start, Segment->m_End, aJonction->m_Start ) )
+ if( SegmentIntersect( segment->m_Start, segment->m_End, aJonction->m_Start ) )
{
- /* Propagation Netcode has all the objects of the same Netcode. */
+ // Propagation Netcode has all the objects of the same Netcode.
if( aIsBus == IS_WIRE )
{
- if( Segment->GetNet() )
- PropageNetCode( Segment->GetNet(), aJonction->GetNet(), aIsBus );
+ if( segment->GetNet() )
+ propageNetCode( segment->GetNet(), aJonction->GetNet(), aIsBus );
else
- Segment->SetNet( aJonction->GetNet() );
+ segment->SetNet( aJonction->GetNet() );
}
else
{
- if( Segment->m_BusNetCode )
- PropageNetCode( Segment->m_BusNetCode, aJonction->m_BusNetCode, aIsBus );
+ if( segment->m_BusNetCode )
+ propageNetCode( segment->m_BusNetCode, aJonction->m_BusNetCode, aIsBus );
else
- Segment->m_BusNetCode = aJonction->m_BusNetCode;
+ segment->m_BusNetCode = aJonction->m_BusNetCode;
}
}
}
}
-/*****************************************************************
- * Function which connects the groups of object which have the same label
- *******************************************************************/
-void LabelConnect( NETLIST_OBJECT* LabelRef )
+/*
+ * This function merges the net codes of groups of objects already connected
+ * to labels (wires, bus, pins ... ) when 2 labels are equivalents
+ * (i.e. group objects connected by labels)
+ */
+void NETLIST_OBJECT_LIST::labelConnect( NETLIST_OBJECT* aLabelRef )
{
- if( LabelRef->GetNet() == 0 )
+ if( aLabelRef->GetNet() == 0 )
return;
- for( unsigned i = 0; i < g_NetObjectslist.size(); i++ )
+ for( unsigned i = 0; i < size(); i++ )
{
- if( g_NetObjectslist[i]->GetNet() == LabelRef->GetNet() )
+ NETLIST_OBJECT* item = GetItem( i );
+
+ if( item->GetNet() == aLabelRef->GetNet() )
continue;
- if( g_NetObjectslist[i]->m_SheetList != LabelRef->m_SheetList )
+ if( item->m_SheetList != aLabelRef->m_SheetList )
{
- if( (g_NetObjectslist[i]->m_Type != NET_PINLABEL
- && g_NetObjectslist[i]->m_Type != NET_GLOBLABEL
- && g_NetObjectslist[i]->m_Type != NET_GLOBBUSLABELMEMBER) )
+ if( item->m_Type != NET_PINLABEL && item->m_Type != NET_GLOBLABEL
+ && item->m_Type != NET_GLOBBUSLABELMEMBER )
continue;
- if( (g_NetObjectslist[i]->m_Type == NET_GLOBLABEL
- || g_NetObjectslist[i]->m_Type == NET_GLOBBUSLABELMEMBER)
- && g_NetObjectslist[i]->m_Type != LabelRef->m_Type )
+ if( (item->m_Type == NET_GLOBLABEL
+ || item->m_Type == NET_GLOBBUSLABELMEMBER)
+ && item->m_Type != aLabelRef->m_Type )
//global labels only connect other global labels.
continue;
}
- // regular labels are sheet-local;
// NET_HIERLABEL are used to connect sheets.
- // NET_LABEL is sheet-local (***)
- // NET_GLOBLABEL is global.
+ // NET_LABEL are local to a sheet
+ // NET_GLOBLABEL are global.
// NET_PINLABEL is a kind of global label (generated by a power pin invisible)
- NETLIST_ITEM_T ntype = g_NetObjectslist[i]->m_Type;
-
- if( ntype == NET_LABEL
- || ntype == NET_GLOBLABEL
- || ntype == NET_HIERLABEL
- || ntype == NET_BUSLABELMEMBER
- || ntype == NET_GLOBBUSLABELMEMBER
- || ntype == NET_HIERBUSLABELMEMBER
- || ntype == NET_PINLABEL )
+ if( item->IsLabelType() )
{
- if( g_NetObjectslist[i]->m_Label.CmpNoCase( LabelRef->m_Label ) != 0 )
+ if( item->m_Label.CmpNoCase( aLabelRef->m_Label ) != 0 )
continue;
- if( g_NetObjectslist[i]->GetNet() )
- PropageNetCode( g_NetObjectslist[i]->GetNet(), LabelRef->GetNet(), IS_WIRE );
+ if( item->GetNet() )
+ propageNetCode( item->GetNet(), aLabelRef->GetNet(), IS_WIRE );
else
- g_NetObjectslist[i]->SetNet( LabelRef->GetNet() );
+ item->SetNet( aLabelRef->GetNet() );
}
}
}
-/* Comparison routine for sorting by increasing Netcode
- * table of elements connected (TabPinSort) by qsort ()
+/* Set the m_FlagOfConnection member of items in list
+ * depending on the connection type:
+ * UNCONNECTED, PAD_CONNECT or NOCONNECT_SYMBOL_PRESENT
+ * The list is expected sorted by order of net code,
+ * i.e. items having the same net code are grouped
*/
-bool SortItemsbyNetcode( const NETLIST_OBJECT* Objet1, const NETLIST_OBJECT* Objet2 )
-{
- return Objet1->GetNet() < Objet2->GetNet();
-}
-
-
-/* Comparison routine for sorting items by Sheet Number ( used by qsort )
- */
-
-bool SortItemsBySheet( const NETLIST_OBJECT* Objet1, const NETLIST_OBJECT* Objet2 )
-{
- return Objet1->m_SheetList.Cmp( Objet2->m_SheetList ) < 0;
-}
-
-
-/* Routine positioning member. FlagNoConnect ELEMENTS
- * List of objects NetList, sorted by order of Netcode
- */
-static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer )
+void NETLIST_OBJECT_LIST::SetUnconnectedFlag()
{
NETLIST_OBJECT* NetItemRef;
unsigned NetStart, NetEnd;
@@ -895,17 +851,17 @@ static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer )
NetStart = NetEnd = 0;
StateFlag = UNCONNECTED;
- for( unsigned ii = 0; ii < aNetItemBuffer.size(); ii++ )
+ for( unsigned ii = 0; ii < size(); ii++ )
{
- NetItemRef = aNetItemBuffer[ii];
+ NetItemRef = GetItem( ii );
if( NetItemRef->m_Type == NET_NOCONNECT && StateFlag != PAD_CONNECT )
StateFlag = NOCONNECT_SYMBOL_PRESENT;
/* Analysis of current net. */
unsigned idxtoTest = ii + 1;
- if( ( idxtoTest >= aNetItemBuffer.size() )
- || ( NetItemRef->GetNet() != aNetItemBuffer[idxtoTest]->GetNet() ) )
+ if( ( idxtoTest >= size() )
+ || ( NetItemRef->GetNet() != GetItem( idxtoTest )->GetNet() ) )
{
/* Net analysis to update m_FlagOfConnection */
NetEnd = idxtoTest;
@@ -913,9 +869,9 @@ static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer )
/* set m_FlagOfConnection member to StateFlag for all items of
* this net: */
for( unsigned kk = NetStart; kk < NetEnd; kk++ )
- aNetItemBuffer[kk]->m_FlagOfConnection = StateFlag;
+ GetItem( kk )->m_FlagOfConnection = StateFlag;
- if( idxtoTest >= aNetItemBuffer.size() )
+ if( idxtoTest >= size() )
return;
/* Start Analysis next Net */
@@ -934,11 +890,11 @@ static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer )
*/
for( ; ; idxtoTest++ )
{
- if( ( idxtoTest >= aNetItemBuffer.size() )
- || ( NetItemRef->GetNet() != aNetItemBuffer[idxtoTest]->GetNet() ) )
+ if( ( idxtoTest >= size() )
+ || ( NetItemRef->GetNet() != GetItem( idxtoTest )->GetNet() ) )
break;
- switch( aNetItemBuffer[idxtoTest]->m_Type )
+ switch( GetItem( idxtoTest )->m_Type )
{
case NET_ITEM_UNSPECIFIED:
wxMessageBox( wxT( "BuildNetListBase() error" ) );
@@ -973,3 +929,4 @@ static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer )
}
}
}
+
diff --git a/eeschema/netlist.h b/eeschema/netlist.h
index 2dd7f977e7..bed55d2c80 100644
--- a/eeschema/netlist.h
+++ b/eeschema/netlist.h
@@ -37,6 +37,7 @@
#include
#include
#include
+#include
/// netlist types
@@ -483,7 +484,7 @@ private:
/**
* Class BOM_LABEL
- * is used to build a BOM by handling the list of labels in schematic because in a
+ * is used to build a List of Labels by handling the list of labels in schematic because in a
* complex hierarchy, a label is used more than once and has more than one sheet path
* so we must create a flat list of labels.
*/
@@ -512,7 +513,11 @@ public:
const SCH_SHEET_PATH& GetSheetPath() const { return m_sheetPath; }
- wxString GetText() const;
+ wxString GetText() const
+ {
+ const SCH_TEXT* tmp = (SCH_TEXT*) m_label;
+ return tmp->GetText();
+ }
};
diff --git a/eeschema/onleftclick.cpp b/eeschema/onleftclick.cpp
index 6dfef208e6..9bf9dcea0e 100644
--- a/eeschema/onleftclick.cpp
+++ b/eeschema/onleftclick.cpp
@@ -34,7 +34,6 @@
#include
#include
-#include
#include
#include
#include
@@ -43,6 +42,7 @@
#include
#include
#include
+#include
#include
diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp
index a0f4554fad..6313b1dd52 100644
--- a/eeschema/sch_collectors.cpp
+++ b/eeschema/sch_collectors.cpp
@@ -28,7 +28,7 @@
#include
-#include
+#include
#include
#include
#include
diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp
index 9d59c7d1d9..34eed00ce4 100644
--- a/eeschema/sch_component.cpp
+++ b/eeschema/sch_component.cpp
@@ -1720,8 +1720,8 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData
}
-void SCH_COMPONENT::GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath )
+void SCH_COMPONENT::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath )
{
LIB_COMPONENT* component = CMP_LIBRARY::FindLibraryComponent( GetLibName() );
diff --git a/eeschema/sch_component.h b/eeschema/sch_component.h
index f315be39c9..63cd1562ac 100644
--- a/eeschema/sch_component.h
+++ b/eeschema/sch_component.h
@@ -40,7 +40,7 @@ class SCH_SHEET_PATH;
class LIB_ITEM;
class LIB_PIN;
class LIB_COMPONENT;
-
+class NETLIST_OBJECT_LIST;
/// A container for several SCH_FIELD items
typedef std::vector SCH_FIELDS;
@@ -384,8 +384,8 @@ public:
BITMAP_DEF GetMenuImage() const { return add_component_xpm; }
- void GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath );
+ void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath );
bool operator <( const SCH_ITEM& aItem ) const;
diff --git a/eeschema/sch_junction.cpp b/eeschema/sch_junction.cpp
index 7373f05337..41f4850e01 100644
--- a/eeschema/sch_junction.cpp
+++ b/eeschema/sch_junction.cpp
@@ -36,6 +36,7 @@
#include
#include
+#include
int SCH_JUNCTION::m_symbolSize = 40; // Default diameter of the junction symbol
@@ -173,7 +174,7 @@ void SCH_JUNCTION::GetConnectionPoints( vector< wxPoint >& aPoints ) const
}
-void SCH_JUNCTION::GetNetListItem( vector& aNetListItems,
+void SCH_JUNCTION::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
SCH_SHEET_PATH* aSheetPath )
{
NETLIST_OBJECT* item = new NETLIST_OBJECT();
diff --git a/eeschema/sch_junction.h b/eeschema/sch_junction.h
index 3466fdd79b..7371622887 100644
--- a/eeschema/sch_junction.h
+++ b/eeschema/sch_junction.h
@@ -31,6 +31,7 @@
#include
+class NETLIST_OBJECT_LIST;
class SCH_JUNCTION : public SCH_ITEM
{
@@ -86,7 +87,7 @@ public:
BITMAP_DEF GetMenuImage() const { return add_junction_xpm; }
- void GetNetListItem( vector& aNetListItems, SCH_SHEET_PATH* aSheetPath );
+ void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems, SCH_SHEET_PATH* aSheetPath );
wxPoint GetPosition() const { return m_pos; }
diff --git a/eeschema/sch_line.cpp b/eeschema/sch_line.cpp
index c95de0a913..4589411657 100644
--- a/eeschema/sch_line.cpp
+++ b/eeschema/sch_line.cpp
@@ -516,8 +516,8 @@ BITMAP_DEF SCH_LINE::GetMenuImage() const
}
-void SCH_LINE::GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath )
+void SCH_LINE::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath )
{
// Net list item not required for graphic lines.
if( (GetLayer() != LAYER_BUS) && (GetLayer() != LAYER_WIRE) )
diff --git a/eeschema/sch_line.h b/eeschema/sch_line.h
index 6288aab4eb..8ae7735f81 100644
--- a/eeschema/sch_line.h
+++ b/eeschema/sch_line.h
@@ -32,6 +32,7 @@
#include
+class NETLIST_OBJECT_LIST;
/**
* Class SCH_LINE
@@ -128,7 +129,7 @@ public:
BITMAP_DEF GetMenuImage() const;
- void GetNetListItem( vector& aNetListItems, SCH_SHEET_PATH* aSheetPath );
+ void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems, SCH_SHEET_PATH* aSheetPath );
bool operator <( const SCH_ITEM& aItem ) const;
diff --git a/eeschema/sch_no_connect.cpp b/eeschema/sch_no_connect.cpp
index 8225ee6e40..a033292666 100644
--- a/eeschema/sch_no_connect.cpp
+++ b/eeschema/sch_no_connect.cpp
@@ -188,8 +188,8 @@ void SCH_NO_CONNECT::GetConnectionPoints( vector< wxPoint >& aPoints ) const
}
-void SCH_NO_CONNECT::GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath )
+void SCH_NO_CONNECT::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath )
{
NETLIST_OBJECT* item = new NETLIST_OBJECT();
diff --git a/eeschema/sch_no_connect.h b/eeschema/sch_no_connect.h
index 31b04a0281..ccb71d47be 100644
--- a/eeschema/sch_no_connect.h
+++ b/eeschema/sch_no_connect.h
@@ -32,6 +32,7 @@
#include
+class NETLIST_OBJECT_LIST;
class SCH_NO_CONNECT : public SCH_ITEM
{
@@ -86,7 +87,7 @@ public:
BITMAP_DEF GetMenuImage() const { return noconn_xpm; }
- void GetNetListItem( vector& aNetListItems, SCH_SHEET_PATH* aSheetPath );
+ void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems, SCH_SHEET_PATH* aSheetPath );
wxPoint GetPosition() const { return m_pos; }
diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp
index 1ee074e744..7ab345f30b 100644
--- a/eeschema/sch_screen.cpp
+++ b/eeschema/sch_screen.cpp
@@ -40,9 +40,8 @@
#include
#include
-#include
-#include
#include
+#include
#include
#include
#include
@@ -52,6 +51,7 @@
#include
#include
#include
+#include
#include
diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp
index d655bf9fb7..e504c9e85e 100644
--- a/eeschema/sch_sheet.cpp
+++ b/eeschema/sch_sheet.cpp
@@ -37,7 +37,6 @@
#include
#include
-#include
#include
#include
#include
@@ -1073,8 +1072,8 @@ wxPoint SCH_SHEET::GetResizePosition() const
}
-void SCH_SHEET::GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath )
+void SCH_SHEET::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath )
{
SCH_SHEET_PATH sheetPath = *aSheetPath;
sheetPath.Push( this );
diff --git a/eeschema/sch_sheet.h b/eeschema/sch_sheet.h
index fd170da5e0..99a668e3bc 100644
--- a/eeschema/sch_sheet.h
+++ b/eeschema/sch_sheet.h
@@ -42,6 +42,7 @@ class SCH_SHEET_PIN;
class SCH_SHEET_PATH;
class DANGLING_END_ITEM;
class SCH_EDIT_FRAME;
+class NETLIST_OBJECT_LIST;
#define MIN_SHEET_WIDTH 500
@@ -541,8 +542,8 @@ public:
BITMAP_DEF GetMenuImage() const { return add_hierarchical_subsheet_xpm; }
- void GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath );
+ void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath );
SCH_ITEM& operator=( const SCH_ITEM& aSheet );
diff --git a/eeschema/sch_text.cpp b/eeschema/sch_text.cpp
index 77acb3d096..0a3356ff10 100644
--- a/eeschema/sch_text.cpp
+++ b/eeschema/sch_text.cpp
@@ -613,8 +613,8 @@ wxString SCH_TEXT::GetSelectMenuText() const
}
-void SCH_TEXT::GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath )
+void SCH_TEXT::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath )
{
if( GetLayer() == LAYER_NOTES || GetLayer() == LAYER_SHEETLABEL )
return;
diff --git a/eeschema/sch_text.h b/eeschema/sch_text.h
index dff401acc6..3b135d0265 100644
--- a/eeschema/sch_text.h
+++ b/eeschema/sch_text.h
@@ -37,6 +37,7 @@
class LINE_READER;
+class NETLIST_OBJECT_LIST;
/* Type of SCH_HIERLABEL and SCH_GLOBALLABEL
@@ -196,8 +197,8 @@ public:
virtual BITMAP_DEF GetMenuImage() const { return add_text_xpm; }
- virtual void GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath );
+ virtual void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath );
virtual wxPoint GetPosition() const { return m_Pos; }
diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp
index 3f6f9efce6..7254ec502a 100644
--- a/eeschema/schedit.cpp
+++ b/eeschema/schedit.cpp
@@ -47,6 +47,7 @@
#include
#include
#include
+#include
void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
diff --git a/include/sch_item_struct.h b/include/sch_item_struct.h
index 82e2e50eed..6d4d690235 100644
--- a/include/sch_item_struct.h
+++ b/include/sch_item_struct.h
@@ -44,6 +44,7 @@ class SCH_EDIT_FRAME;
class wxFindReplaceData;
class PLOTTER;
class NETLIST_OBJECT;
+class NETLIST_OBJECT_LIST;
typedef boost::ptr_vector< SCH_ITEM > SCH_ITEMS;
@@ -342,8 +343,8 @@ public:
* net list objects associated with them.
* ]
*/
- virtual void GetNetListItem( vector& aNetListItems,
- SCH_SHEET_PATH* aSheetPath ) { }
+ virtual void GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
+ SCH_SHEET_PATH* aSheetPath ) { }
/**
* Function GetPosition
diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h
index b74c6165e5..abe921852e 100644
--- a/include/wxBasePcbFrame.h
+++ b/include/wxBasePcbFrame.h
@@ -643,9 +643,12 @@ public:
* @param aDefaultLayer = Preselection (NB_PCB_LAYERS for "(Deselect)" layer)
* @param aNotAllowedLayersMask = a layer mask for not allowed layers
* (= 0 to show all layers in use)
+ * @param aDlgPosition = position of dialog ( defualt = centered)
* @return the selected layer id
*/
- LAYER_NUM SelectLayer( LAYER_NUM aDefaultLayer, LAYER_MSK aNotAllowedLayersMask = 0 );
+ LAYER_NUM SelectLayer( LAYER_NUM aDefaultLayer,
+ LAYER_MSK aNotAllowedLayersMask = 0,
+ wxPoint aDlgPosition = wxDefaultPosition );
/* Display a list of two copper layers to choose a pair of copper layers
* the layer pair is used to fast switch between copper layers when placing vias
diff --git a/pcbnew/dialogs/dialog_copper_zones.cpp b/pcbnew/dialogs/dialog_copper_zones.cpp
index c94d095333..1a4948bd8e 100644
--- a/pcbnew/dialogs/dialog_copper_zones.cpp
+++ b/pcbnew/dialogs/dialog_copper_zones.cpp
@@ -283,7 +283,7 @@ void DIALOG_COPPER_ZONE::initDialog()
ctrlWidth += 4; // add small margin between text and window borders
m_LayerSelectionCtrl->SetMinSize( wxSize(ctrlWidth, -1));
- wxString netNameDoNotShowFilter = wxT( "N-*" );
+ wxString netNameDoNotShowFilter = wxT( "Net-*" );
if( m_Config )
{
int opt = m_Config->Read( ZONE_NET_SORT_OPTION_KEY, 1l );
diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp
index 2007d3d1e6..2bae015cb9 100755
--- a/pcbnew/edit.cpp
+++ b/pcbnew/edit.cpp
@@ -60,18 +60,12 @@
void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
{
int id = event.GetId();
- wxPoint pos;
-
LAYER_NUM itmp;
INSTALL_UNBUFFERED_DC( dc, m_canvas );
MODULE* module;
m_canvas->CrossHairOff( &dc );
- wxGetMousePosition( &pos.x, &pos.y );
-
- pos.y += 20;
-
switch( id ) // Some (not all ) edit commands must be finished or aborted
{
case wxID_CUT:
@@ -246,7 +240,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
break;
case ID_PCB_GLOBAL_DELETE:
- InstallPcbGlobalDeleteFrame( pos );
+ InstallPcbGlobalDeleteFrame( wxDefaultPosition );
break;
case ID_POPUP_PLACE_BLOCK:
@@ -409,7 +403,10 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
id == ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA )
{
m_canvas->SetIgnoreMouseEvents( true );
- LAYER_NUM layer = SelectLayer( getActiveLayer(), ALL_NO_CU_LAYERS );
+ wxPoint dlgPosition;
+ wxGetMousePosition( &dlgPosition.x, &dlgPosition.y );
+ LAYER_NUM layer = SelectLayer( getActiveLayer(), ALL_NO_CU_LAYERS,
+ dlgPosition );
m_canvas->SetIgnoreMouseEvents( false );
m_canvas->MoveCursorToCrossHair();
diff --git a/pcbnew/sel_layer.cpp b/pcbnew/sel_layer.cpp
index 7c78aef832..09e954dd7b 100644
--- a/pcbnew/sel_layer.cpp
+++ b/pcbnew/sel_layer.cpp
@@ -87,16 +87,7 @@ class PCB_ONE_LAYER_SELECTOR : public PCB_LAYER_SELECTOR,
public:
PCB_ONE_LAYER_SELECTOR( wxWindow* aParent, BOARD * aBrd,
LAYER_NUM aDefaultLayer,
- LAYER_MSK aNotAllowedLayersMask )
- :PCB_LAYER_SELECTOR( aBrd ), DIALOG_LAYER_SELECTION_BASE( aParent )
- {
- m_layerSelected = (int) aDefaultLayer;
- m_notAllowedLayersMask = aNotAllowedLayersMask;
- BuildList();
- Layout();
- GetSizer()->SetSizeHints(this);
- SetFocus();
- }
+ LAYER_MSK aNotAllowedLayersMask );
LAYER_NUM GetLayerSelection() { return m_layerSelected; }
@@ -108,6 +99,20 @@ private:
void BuildList();
};
+PCB_ONE_LAYER_SELECTOR::PCB_ONE_LAYER_SELECTOR( wxWindow* aParent,
+ BOARD * aBrd,
+ LAYER_NUM aDefaultLayer,
+ LAYER_MSK aNotAllowedLayersMask )
+ : PCB_LAYER_SELECTOR( aBrd ), DIALOG_LAYER_SELECTION_BASE( aParent )
+{
+ m_layerSelected = (int) aDefaultLayer;
+ m_notAllowedLayersMask = aNotAllowedLayersMask;
+ BuildList();
+ Layout();
+ GetSizer()->SetSizeHints(this);
+ SetFocus();
+}
+
// Build the layers list
// Column position by function:
#define SELECT_COLNUM 0
@@ -221,10 +226,18 @@ void PCB_ONE_LAYER_SELECTOR::OnRightGridCellClick( wxGridEvent& event )
* @return the selected layer id
*/
LAYER_NUM PCB_BASE_FRAME::SelectLayer( LAYER_NUM aDefaultLayer,
- LAYER_MSK aNotAllowedLayersMask )
+ LAYER_MSK aNotAllowedLayersMask,
+ wxPoint aDlgPosition )
{
PCB_ONE_LAYER_SELECTOR dlg( this, GetBoard(),
aDefaultLayer, aNotAllowedLayersMask );
+ if( aDlgPosition != wxDefaultPosition )
+ {
+ wxSize dlgSize = dlg.GetSize();
+ aDlgPosition.x -= dlgSize.x/2;
+ aDlgPosition.y -= dlgSize.y/2;
+ dlg.SetPosition( aDlgPosition );
+ }
dlg.ShowModal();
LAYER_NUM layer = dlg.GetLayerSelection();
return layer;
diff --git a/pcbnew/swap_layers.cpp b/pcbnew/swap_layers.cpp
index 10847c99c5..08d8915b16 100644
--- a/pcbnew/swap_layers.cpp
+++ b/pcbnew/swap_layers.cpp
@@ -14,7 +14,6 @@
#include
#include
-#include
#include
@@ -31,7 +30,7 @@ enum swap_layer_id {
};
-class WinEDA_SwapLayerFrame : public DIALOG_SHIM
+class SWAP_LAYERS_DIALOG : public DIALOG_SHIM
{
private:
PCB_BASE_FRAME* m_Parent;
@@ -46,8 +45,8 @@ private:
public:
- WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent );
- ~WinEDA_SwapLayerFrame() { };
+ SWAP_LAYERS_DIALOG( PCB_BASE_FRAME* parent );
+ ~SWAP_LAYERS_DIALOG() { };
private:
void Sel_Layer( wxCommandEvent& event );
@@ -58,16 +57,16 @@ private:
};
-BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog )
+BEGIN_EVENT_TABLE( SWAP_LAYERS_DIALOG, wxDialog )
EVT_COMMAND_RANGE( ID_BUTTON_0, ID_BUTTON_0 + NB_PCB_LAYERS - 1,
wxEVT_COMMAND_BUTTON_CLICKED,
- WinEDA_SwapLayerFrame::Sel_Layer )
- EVT_BUTTON( wxID_OK, WinEDA_SwapLayerFrame::OnOkClick )
- EVT_BUTTON( wxID_CANCEL, WinEDA_SwapLayerFrame::OnCancelClick )
+ SWAP_LAYERS_DIALOG::Sel_Layer )
+ EVT_BUTTON( wxID_OK, SWAP_LAYERS_DIALOG::OnOkClick )
+ EVT_BUTTON( wxID_CANCEL, SWAP_LAYERS_DIALOG::OnCancelClick )
END_EVENT_TABLE()
-WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent ) :
+SWAP_LAYERS_DIALOG::SWAP_LAYERS_DIALOG( PCB_BASE_FRAME* parent ) :
DIALOG_SHIM( parent, -1, _( "Swap Layers:" ), wxPoint( -1, -1 ),
wxDefaultSize, wxDEFAULT_DIALOG_STYLE | MAYBE_RESIZE_BORDER )
{
@@ -269,10 +268,12 @@ WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent ) :
{
GetSizer()->SetSizeHints( this );
}
+
+ Center();
}
-void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event )
+void SWAP_LAYERS_DIALOG::Sel_Layer( wxCommandEvent& event )
{
int ii;
@@ -283,21 +284,24 @@ void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event )
ii = event.GetId() - ID_BUTTON_0;
- LAYER_NUM jj = New_Layer[ii];
+ LAYER_NUM layer = New_Layer[ii];
- if( (jj < 0) || (jj > NB_PCB_LAYERS) )
- jj = LAYER_NO_CHANGE; // (Defaults to "No Change".)
+ if( (layer < 0) || (layer > NB_PCB_LAYERS) )
+ layer = LAYER_NO_CHANGE; // (Defaults to "No Change".)
- jj = m_Parent->SelectLayer( jj );
+ LAYER_MSK notallowed_mask = ii < NB_COPPER_LAYERS ?
+ ALL_NO_CU_LAYERS : ALL_CU_LAYERS;
+ layer = m_Parent->SelectLayer( layer == LAYER_NO_CHANGE ? ii : layer,
+ notallowed_mask );
- if( !IsValidLayer( jj ) )
+ if( !IsValidLayer( layer ) )
return;
- if( jj != New_Layer[ii] )
+ if( layer != New_Layer[ii] )
{
- New_Layer[ii] = jj;
+ New_Layer[ii] = layer;
- if( jj >= LAYER_NO_CHANGE || jj == ii )
+ if( layer >= LAYER_NO_CHANGE || layer == ii )
{
layer_list[ii]->SetLabel( _( "No Change" ) );
@@ -307,7 +311,7 @@ void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event )
}
else
{
- layer_list[ii]->SetLabel( m_Parent->GetBoard()->GetLayerName( jj ) );
+ layer_list[ii]->SetLabel( m_Parent->GetBoard()->GetLayerName( layer ) );
// Change the text color to fuchsia (to highlight
// that this layer *is* being swapped)
@@ -317,13 +321,13 @@ void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event )
}
-void WinEDA_SwapLayerFrame::OnCancelClick( wxCommandEvent& event )
+void SWAP_LAYERS_DIALOG::OnCancelClick( wxCommandEvent& event )
{
EndModal( -1 );
}
-void WinEDA_SwapLayerFrame::OnOkClick( wxCommandEvent& event )
+void SWAP_LAYERS_DIALOG::OnOkClick( wxCommandEvent& event )
{
EndModal( 1 );
}
@@ -340,10 +344,9 @@ void PCB_EDIT_FRAME::Swap_Layers( wxCommandEvent& event )
for( ii = FIRST_LAYER; ii < NB_PCB_LAYERS; ii++ )
New_Layer[ii] = LAYER_NO_CHANGE;
- WinEDA_SwapLayerFrame* frame = new WinEDA_SwapLayerFrame( this );
+ SWAP_LAYERS_DIALOG dlg( this );
- ii = frame->ShowModal();
- frame->Destroy();
+ ii = dlg.ShowModal();
if( ii != 1 )
return; // (Canceled dialog box returns -1 instead)