Cache connection names

This commit is contained in:
Jon Evans 2020-02-28 22:21:48 -05:00
parent 1204b9cbef
commit f4f43f51c8
2 changed files with 47 additions and 30 deletions

View File

@ -89,6 +89,8 @@ void SCH_CONNECTION::SetDriver( SCH_ITEM* aItem )
{
m_driver = aItem;
recacheName();
for( const auto& member : m_members )
member->SetDriver( aItem );
}
@ -98,6 +100,8 @@ void SCH_CONNECTION::SetSheet( SCH_SHEET_PATH aSheet )
{
m_sheet = aSheet;
recacheName();
for( const auto& member : m_members )
member->SetSheet( aSheet );
}
@ -132,9 +136,9 @@ void SCH_CONNECTION::ConfigureFromLabel( wxString aLabel )
auto member = std::make_shared<SCH_CONNECTION>( m_parent, m_sheet );
member->m_type = CONNECTION_TYPE::NET;
member->m_prefix = m_prefix;
member->m_name = vector_member;
member->m_local_name = vector_member;
member->m_vector_index = i++;
member->SetName( vector_member );
m_members.push_back( member );
}
}
@ -177,6 +181,8 @@ void SCH_CONNECTION::ConfigureFromLabel( wxString aLabel )
{
m_type = CONNECTION_TYPE::NET;
}
recacheName();
}
@ -185,6 +191,8 @@ void SCH_CONNECTION::Reset()
m_type = CONNECTION_TYPE::NONE;
m_name.Empty();
m_local_name.Empty();
m_cached_name.Empty();
m_cached_name_with_path.Empty();
m_prefix.Empty();
m_suffix .Empty();
m_driver = nullptr;
@ -218,6 +226,8 @@ void SCH_CONNECTION::Clone( SCH_CONNECTION& aOther )
m_vector_prefix = aOther.VectorPrefix();
// Note: subgraph code isn't cloned, it should remain with the original object
recacheName();
}
@ -250,44 +260,40 @@ bool SCH_CONNECTION::IsDriver() const
}
wxString SCH_CONNECTION::Name( bool aIgnoreSheet ) const
const wxString& SCH_CONNECTION::Name( bool aIgnoreSheet ) const
{
wxString ret = m_prefix + m_name + m_suffix;
wxASSERT( !m_cached_name.IsEmpty() );
return aIgnoreSheet ? m_cached_name : m_cached_name_with_path;
}
if( m_name.IsEmpty() )
ret = "<NO NET>";
void SCH_CONNECTION::recacheName()
{
m_cached_name = m_name.IsEmpty() ? "<NO NET>" : m_prefix + m_name + m_suffix;
bool prepend_path = true;
if( !Parent() || m_type == CONNECTION_TYPE::NONE )
return ret;
if( !aIgnoreSheet )
{
bool prepend_path = true;
prepend_path = false;
if( m_driver )
{
switch( m_driver->Type() )
{
case SCH_GLOBAL_LABEL_T:
case SCH_PIN_T:
// Pins are either power connections or belong to a uniquely-annotated
// component, so they don't need a path if they are driving the subgraph
prepend_path = false;
break;
case SCH_GLOBAL_LABEL_T:
prepend_path = false;
break;
default:
break;
}
}
if( prepend_path )
ret = m_sheet.PathHumanReadable() + ret;
}
return ret;
m_cached_name_with_path =
prepend_path ? m_sheet.PathHumanReadable() + m_cached_name : m_cached_name;
}
@ -295,6 +301,8 @@ void SCH_CONNECTION::SetPrefix( const wxString& aPrefix )
{
m_prefix = aPrefix;
recacheName();
for( const auto& m : Members() )
m->SetPrefix( aPrefix );
}
@ -304,6 +312,8 @@ void SCH_CONNECTION::SetSuffix( const wxString& aSuffix )
{
m_suffix = aSuffix;
recacheName();
for( const auto& m : Members() )
m->SetSuffix( aSuffix );
}

View File

@ -145,9 +145,9 @@ public:
m_dirty = false;
}
wxString Name( bool aIgnoreSheet = false ) const;
const wxString& Name( bool aIgnoreSheet = false ) const;
wxString RawName() const
const wxString& RawName() const
{
return m_name;
}
@ -157,6 +157,7 @@ public:
void SetName( const wxString& aName )
{
m_name = aName;
recacheName();
}
wxString Prefix() const
@ -181,6 +182,7 @@ public:
void SetType( CONNECTION_TYPE aType )
{
m_type = aType;
recacheName();
}
int NetCode() const
@ -318,6 +320,7 @@ public:
static bool IsBusGroupLabel( const wxString& aLabel );
private:
void recacheName();
bool m_dirty;
@ -331,6 +334,10 @@ private:
wxString m_name; ///< Name of the connection.
wxString m_cached_name; ///< Full name, including prefix and suffix
wxString m_cached_name_with_path; ///< Full name including sheet path (if not global)
/**
* For bus members, we want to keep track of the "local" name of a member, that is,
* the name it takes on from its parent bus name. This is because we always want to use