24#include <wx/tokenzr.h>
35#include <boost/algorithm/string/join.hpp>
67 m_local_sheet( aPath ),
117 for(
const std::shared_ptr<SCH_CONNECTION>& member :
m_members )
118 member->SetDriver( aItem );
129 for(
const std::shared_ptr<SCH_CONNECTION>& member :
m_members )
130 member->SetSheet( aSheet );
136 return !( aOther == *this );
149 std::vector<wxString> members;
155 m_type = CONNECTION_TYPE::BUS;
160 for(
const wxString& vector_member : members )
163 member->m_type = CONNECTION_TYPE::NET;
165 member->m_local_name = vector_member;
167 member->m_vector_index = i++;
168 member->SetName( vector_member );
175 m_type = CONNECTION_TYPE::BUS_GROUP;
179 if( !prefix.IsEmpty() )
180 prefix += wxT(
"." );
182 for(
const wxString& group_member : members )
187 for(
const wxString& alias_member : alias->Members() )
190 member->SetPrefix( prefix );
199 member->SetPrefix( prefix );
201 member->ConfigureFromLabel( group_member );
208 m_type = CONNECTION_TYPE::NET;
217 m_type = CONNECTION_TYPE::NONE;
274 const std::vector<std::shared_ptr<SCH_CONNECTION>>& otherMembers = aOther.
Members();
276 if(
m_type == CONNECTION_TYPE::BUS && aOther.
Type() == CONNECTION_TYPE::BUS )
284 size_t cloneLimit = std::min(
m_members.size(), otherMembers.size() );
286 for(
size_t i = 0; i < cloneLimit; ++i )
290 else if(
m_type == CONNECTION_TYPE::BUS_GROUP && aOther.
Type() == CONNECTION_TYPE::BUS_GROUP )
299 for( std::shared_ptr<SCH_CONNECTION>& member :
m_members )
301 auto it = std::find_if( otherMembers.begin(), otherMembers.end(),
302 [&](
const std::shared_ptr<SCH_CONNECTION>& aTest )
304 return aTest->LocalName() == member->LocalName();
307 if( it != otherMembers.end() )
308 member->Clone( **it );
339 return pin->IsPower() || symbol->IsAnnotated( &
m_sheet );
392 bool prepend_path =
true;
395 prepend_path =
false;
402 prepend_path =
false;
409 prepend_path =
pin->IsLocalPower();
429 for(
const std::shared_ptr<SCH_CONNECTION>& m :
Members() )
430 m->SetPrefix( aPrefix );
440 for(
const std::shared_ptr<SCH_CONNECTION>& m :
Members() )
441 m->SetSuffix( aSuffix );
447 wxString msg, group_name, members;
448 std::vector<wxString> group_members;
454 msg.Printf(
_(
"Bus Alias %s Members" ),
m_name );
455 aList.emplace_back( msg, boost::algorithm::join( alias->Members(),
" " ) );
459 for(
const wxString& group_member : group_members )
463 msg.Printf(
_(
"Bus Alias %s Members" ), group_alias->GetName() );
464 aList.emplace_back( msg, boost::algorithm::join( group_alias->Members(),
" " ) );
473 aList.emplace_back( wxT(
"Bus Code" ), wxString::Format(
"%d",
m_bus_code ) );
475 aList.emplace_back( wxT(
"Subgraph Code" ), wxString::Format(
"%d",
m_subgraph_code ) );
481 msg.Printf( wxS(
"%s at %p" ),
482 driver->GetItemDescription( &unitsProvider,
false ),
484 aList.emplace_back( wxT(
"Connection Source" ), msg );
504 return label.Contains( wxT(
"[" ) ) || label.Contains( wxT(
"{" ) );
510 std::vector< std::shared_ptr< SCH_CONNECTION > > ret(
m_members );
512 for(
const std::shared_ptr<SCH_CONNECTION>& member :
m_members )
514 if( member->IsBus() )
515 ret.insert( ret.end(), member->Members().begin(), member->Members().end() );
524 return c ==
'_' || c ==
'^' || c ==
'~';
530 size_t groupLen = aGroup.length();
536 for( ; i < groupLen; ++i )
543 else if( aGroup[i] ==
'}' )
550 if( aGroup[i] ==
'{' )
558 for( ; i < groupLen; ++i )
565 else if( aGroup[i] ==
'}' )
572 if( aGroup[i] ==
'}' )
582 if( !aOther->
IsBus() )
585 for(
const std::shared_ptr<SCH_CONNECTION>& member : aOther->
Members() )
597 if( !aOther->
IsBus() )
600 wxString me =
Name(
true );
602 for(
const std::shared_ptr<SCH_CONNECTION>& m : aOther->
Members() )
604 if( m->Name(
true ) == me )
constexpr EDA_IU_SCALE schIUScale
Calculate the connectivity of a schematic and generates netlists.
std::shared_ptr< BUS_ALIAS > GetBusAlias(const wxString &aName)
Return a bus alias pointer for the given name if it exists (from cache)
CONNECTION_SUBGRAPH * GetSubgraphForItem(SCH_ITEM *aItem) const
A subgraph is a set of items that are electrically connected on a single sheet.
wxString GetNetName() const
Return the fully-qualified net name for this subgraph (if one exists)
KICAD_T Type() const
Returns the type of object.
static bool ParseBusGroup(const wxString &aGroup, wxString *name, std::vector< wxString > *aMemberList)
Parse a bus group label into the name and a list of components.
static bool ParseBusVector(const wxString &aBus, wxString *aName, std::vector< wxString > *aMemberList)
Parse a bus vector (e.g.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString FullLocalName() const
long m_vector_start
Highest member of a vector bus.
bool IsMemberOfBus(SCH_CONNECTION *aOther) const
Returns true if this connection is a member of bus connection aOther.
void ConfigureFromLabel(const wxString &aLabel)
Configures the connection given a label.
SCH_ITEM * m_parent
The SCH_ITEM this connection is owned by.
SCH_SHEET_PATH m_sheet
The hierarchical sheet this connection is on.
bool operator!=(const SCH_CONNECTION &aOther) const
void SetSuffix(const wxString &aSuffix)
wxString m_name
Name of the connection.
SCH_ITEM * Parent() const
wxString GetNetName() const
long m_vector_end
Lowest member of a vector bus.
SCH_SHEET_PATH Sheet() const
CONNECTION_TYPE Type() const
bool HasDriverChanged() const
const std::vector< std::shared_ptr< SCH_CONNECTION > > AllMembers() const
SCH_CONNECTION(SCH_ITEM *aParent=nullptr, const SCH_SHEET_PATH &aPath=SCH_SHEET_PATH())
Buses can be defined in multiple ways.
void Reset()
Clears connectivity information.
bool operator==(const SCH_CONNECTION &aOther) const
Note: the equality operator for SCH_CONNECTION only tests the net properties, not the ownership / she...
std::vector< std::shared_ptr< SCH_CONNECTION > > m_members
For bus connections, store a list of member connections.
wxString m_local_prefix
Local prefix for group bus members (used with m_local_name)
SCH_ITEM * m_driver
The SCH_ITEM that drives this connection's net.
bool IsDriver() const
Checks if the SCH_ITEM this connection is attached to can drive connections Drivers can be labels,...
void SetPrefix(const wxString &aPrefix)
wxString LocalName() const
wxString Name(bool aIgnoreSheet=false) const
bool IsSubsetOf(SCH_CONNECTION *aOther) const
Returns true if this connection is contained within aOther (but not the same as aOther)
void SetDriver(SCH_ITEM *aItem)
SCH_SHEET_PATH m_local_sheet
When a connection is overridden by one on a different hierarchical sheet, it will be cloned and m_she...
wxString m_prefix
Prefix if connection is member of a labeled bus group (or "" if not)
void Clone(const SCH_CONNECTION &aOther)
Copies connectivity information (but not parent) from another connection.
void * m_lastDriver
WEAK POINTER (there is no guarantee it is still allocated) Equality comparisons are OK,...
wxString m_cached_name_with_path
Full name including sheet path (if not global)
long m_vector_index
Index of bus vector member nets.
wxString VectorPrefix() const
SCH_ITEM * Driver() const
void AppendInfoToMsgPanel(std::vector< MSG_PANEL_ITEM > &aList) const
Adds information about the connection object to aList.
static bool IsBusLabel(const wxString &aLabel)
Test if aLabel has a bus notation.
wxString m_suffix
Name suffix (used only for disambiguation)
wxString m_bus_prefix
Optional prefix of a bus group (always empty for nets and vector buses)
const std::vector< std::shared_ptr< SCH_CONNECTION > > & Members() const
void SetSheet(SCH_SHEET_PATH aSheet)
wxString m_cached_name
Full name, including prefix and suffix.
CONNECTION_GRAPH * m_graph
Pointer to the connection graph for the schematic this connection exists on.
static wxString PrintBusForUI(const wxString &aString)
wxString m_local_name
For bus members, we want to keep track of the "local" name of a member, that is, the name it takes on...
void ClearDriverChanged()
int m_subgraph_code
Groups directly-connected items.
wxString m_vector_prefix
Prefix name of the vector, if m_type == CONNECTION_BUS (or "" if not).
static bool MightBeBusLabel(const wxString &aLabel)
Test if aLabel looks like a bus notation.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
static bool isSuperSubOverbar(wxChar c)
static bool isSuperSubOverbar(wxChar c)
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...