diff --git a/eeschema/netlist_object.cpp b/eeschema/netlist_object.cpp index a077956eb8..e17e61e6df 100644 --- a/eeschema/netlist_object.cpp +++ b/eeschema/netlist_object.cpp @@ -271,15 +271,17 @@ void NETLIST_OBJECT::ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItem if( conn.IsBusVectorLabel( bus_member ) ) { wxString prefix; + std::vector members; long begin, end; - conn.ParseBusVector( bus_member, &prefix, &begin, &end ); + conn.ParseBusVector( bus_member, &prefix, members ); prefix = group_prefix + prefix; + begin = conn.VectorStart(); + end = conn.VectorEnd(); if( !self_set ) { - m_Label = prefix; - m_Label << begin; + m_Label = members[0]; m_Member = ( begin++ ) + ( member_offset++ ); self_set = true; @@ -319,12 +321,14 @@ void NETLIST_OBJECT::ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItem { // Plain bus vector wxString prefix; + std::vector members; long begin, end; - conn.ParseBusVector( m_Label, &prefix, &begin, &end ); + conn.ParseBusVector( m_Label, &prefix, members ); + begin = conn.VectorStart(); + end = conn.VectorEnd(); - m_Label = prefix; - m_Label << begin; + m_Label = members[0]; m_Member = begin; fillBusVector( aNetListItems, prefix, begin + 1, end, 0 ); diff --git a/eeschema/sch_connection.cpp b/eeschema/sch_connection.cpp index 68fbd63d74..b1a365b8ee 100644 --- a/eeschema/sch_connection.cpp +++ b/eeschema/sch_connection.cpp @@ -57,9 +57,9 @@ * just USB_DP and USB_DN. * */ -static std::regex bus_label_re( "^([^[:space:]]+)(\\[[\\d]+\\.+[\\d]+\\])~*$" ); +static std::regex bus_label_re( "^([^[:space:]]+)(\\[[\\d]+\\.+[\\d]+\\])(~?)$" ); -static std::regex bus_group_label_re( "^([^[:space:]]+)?\\{((?:[^[:space:]]+(?:\\[[\\d]+\\.+[\\d]+\\])? ?)+)\\}~*$" ); +static std::regex bus_group_label_re( "^([^[:space:]]+)?\\{((?:[^[:space:]]+(?:\\[[\\d]+\\.+[\\d]+\\])? ?)+)\\}$" ); SCH_CONNECTION::SCH_CONNECTION( SCH_ITEM* aParent, SCH_SHEET_PATH aPath ) : @@ -118,17 +118,18 @@ void SCH_CONNECTION::ConfigureFromLabel( wxString aLabel ) m_name = aLabel; m_type = CONNECTION_BUS; - ParseBusVector( aLabel, &m_vector_prefix, &m_vector_start, &m_vector_end ); + std::vector members; - for( long i = m_vector_start; i <= m_vector_end; ++i ) + ParseBusVector( aLabel, &m_vector_prefix, members ); + long i = 0; + + for( const auto& vector_member : members ) { auto member = std::make_shared< SCH_CONNECTION >( m_parent, m_sheet ); - wxString name = m_vector_prefix; - name << i; member->m_type = CONNECTION_NET; member->m_prefix = m_prefix; - member->m_name = name; - member->m_vector_index = i; + member->m_name = vector_member; + member->m_vector_index = i++; m_members.push_back( member ); } } @@ -420,28 +421,29 @@ bool SCH_CONNECTION::IsBusGroupLabel( const wxString& aLabel ) } -void SCH_CONNECTION::ParseBusVector( wxString aVector, wxString* aName, - long* begin, long* end ) const +bool SCH_CONNECTION::ParseBusVector( wxString aBus, wxString* aName, + std::vector& aMemberList ) const { - auto ss_vector = std::string( aVector.mb_str() ); + auto ss_vector = std::string( aBus.mb_str() ); std::smatch matches; try { if( !std::regex_match( ss_vector, matches, bus_label_re ) ) - { - wxFAIL_MSG( wxT( "<" ) + aVector + wxT( "> is not a valid bus vector." ) ); - return; - } + return false; } catch( ... ) { - return; + return false; } + long begin = 0, end = 0; *aName = wxString( matches[1] ); wxString numberString( matches[2] ); + // If we have three match groups, it means there was a tilde at the end of the vector + bool append_tilde = wxString( matches[3] ).IsSameAs( wxT( "~" ) ); + // numberString will include the brackets, e.g. [5..0] so skip the first one size_t i = 1, len = numberString.Len(); wxString tmp; @@ -452,7 +454,7 @@ void SCH_CONNECTION::ParseBusVector( wxString aVector, wxString* aName, i++; } - tmp.ToLong( begin ); + tmp.ToLong( &begin ); while( i < len && numberString[i] == '.' ) i++; @@ -465,16 +467,29 @@ void SCH_CONNECTION::ParseBusVector( wxString aVector, wxString* aName, i++; } - tmp.ToLong( end ); + tmp.ToLong( &end ); - if( *begin < 0 ) - *begin = 0; + if( begin < 0 ) + begin = 0; - if( *end < 0 ) - *end = 0; + if( end < 0 ) + end = 0; - if( *begin > *end ) - std::swap( *begin, *end ); + if( begin > end ) + std::swap( begin, end ); + + for( long idx = begin; idx <= end; ++idx ) + { + wxString str = *aName; + str << idx; + + if( append_tilde ) + str << '~'; + + aMemberList.emplace_back( str ); + } + + return true; } diff --git a/eeschema/sch_connection.h b/eeschema/sch_connection.h index 34eee1b714..6146a10e55 100644 --- a/eeschema/sch_connection.h +++ b/eeschema/sch_connection.h @@ -262,13 +262,13 @@ public: * Parses a bus vector (e.g. A[7..0]) into name, begin, and end. * Ensures that begin and end are positive and that end > begin. * - * @param vector is a bus vector label string - * @param name output of the name portion of the label - * @param begin is the first entry in the vector - * @param end is the last entry in the vector + * @param aBus is a bus vector label string + * @param aName out is the bus name, e.g. "A" + * @param aMemberList is a list of member strings, e.g. "A7", "A6", and so on + * @return true if aBus was successfully parsed */ - void ParseBusVector( wxString vector, wxString* name, - long* begin, long* end ) const; + bool ParseBusVector( wxString aBus, wxString* aName, + std::vector& aMemberList ) const; /** * Parses a bus group label into the name and a list of components