Factor bus label parsing function into net list object.
This commit is contained in:
parent
4e55b6be65
commit
31ed2c288c
|
@ -1,3 +1,28 @@
|
|||
/*
|
||||
* 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 <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2011 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file class_netlist_object.cpp
|
||||
* @brief Class NETLIST_OBJECT to handle 1 item connected (in netlist and erc calculations)
|
||||
|
@ -13,7 +38,7 @@
|
|||
#if defined(DEBUG)
|
||||
|
||||
#include <iostream>
|
||||
const char* ShowType( NetObjetType aType )
|
||||
const char* ShowType( NETLIST_ITEM_T aType )
|
||||
{
|
||||
const char* ret;
|
||||
|
||||
|
@ -117,7 +142,7 @@ void NETLIST_OBJECT::Show( std::ostream& out, int ndx )
|
|||
|
||||
NETLIST_OBJECT::NETLIST_OBJECT()
|
||||
{
|
||||
m_Type = NET_ITEM_UNSPECIFIED; /* Type of this item (see NetObjetType enum) */
|
||||
m_Type = NET_ITEM_UNSPECIFIED; /* Type of this item (see NETLIST_ITEM_T enum) */
|
||||
m_Comp = NULL; /* Pointer on the library item that created this net object
|
||||
* (the parent)*/
|
||||
m_Link = NULL; /* For SCH_SHEET_PIN:
|
||||
|
@ -126,7 +151,7 @@ NETLIST_OBJECT::NETLIST_OBJECT()
|
|||
* contains this pin
|
||||
*/
|
||||
m_Flag = 0; /* flag used in calculations */
|
||||
m_ElectricalType = 0; /* Has meaning only for Pins and hierachical pins: electrical
|
||||
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
|
||||
* label has as many net codes as bus members
|
||||
|
@ -174,3 +199,80 @@ bool NETLIST_OBJECT::IsLabelConnected( NETLIST_OBJECT* aNetItem )
|
|||
|
||||
return false; //these two are unconnected
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_OBJECT::ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItems )
|
||||
{
|
||||
wxCHECK_RET( IsBusLabel( m_Label ),
|
||||
wxT( "<" ) + m_Label + wxT( "> is not a valid bus label." ) );
|
||||
|
||||
if( m_Type == NET_HIERLABEL )
|
||||
m_Type = NET_HIERBUSLABELMEMBER;
|
||||
else if( m_Type == NET_GLOBLABEL )
|
||||
m_Type = NET_GLOBBUSLABELMEMBER;
|
||||
else if( m_Type == NET_SHEETLABEL )
|
||||
m_Type = NET_SHEETBUSLABELMEMBER;
|
||||
else if( m_Type == NET_LABEL )
|
||||
m_Type = NET_BUSLABELMEMBER;
|
||||
else
|
||||
wxCHECK_RET( false, wxT( "Net list object type is not valid." ) );
|
||||
|
||||
unsigned i;
|
||||
wxString tmp, busName;
|
||||
long begin, end, member;
|
||||
|
||||
/* Search for '[' because a bus label is like "busname[nn..mm]" */
|
||||
i = m_Label.Find( '[' );
|
||||
|
||||
busName = m_Label.Left( i );
|
||||
i++;
|
||||
|
||||
while( m_Label[i] != '.' && i < m_Label.Len() )
|
||||
{
|
||||
tmp.Append( m_Label[i] );
|
||||
i++;
|
||||
}
|
||||
|
||||
tmp.ToLong( &begin );
|
||||
|
||||
while( m_Label[i] == '.' && i < m_Label.Len() )
|
||||
i++;
|
||||
|
||||
tmp.Empty();
|
||||
|
||||
while( m_Label[i] != ']' && i < m_Label.Len() )
|
||||
{
|
||||
tmp.Append( m_Label[i] );
|
||||
i++;
|
||||
}
|
||||
|
||||
tmp.ToLong( &end );
|
||||
|
||||
if( begin < 0 )
|
||||
begin = 0;
|
||||
|
||||
if( end < 0 )
|
||||
end = 0;
|
||||
|
||||
if( begin > end )
|
||||
EXCHG( begin, end );
|
||||
|
||||
member = begin;
|
||||
tmp = busName;
|
||||
tmp << member;
|
||||
m_Label = tmp;
|
||||
m_Member = member;
|
||||
|
||||
for( member++; member <= end; member++ )
|
||||
{
|
||||
NETLIST_OBJECT* item = new NETLIST_OBJECT( *this );
|
||||
|
||||
// Conversion of bus label to the root name + the current member id.
|
||||
tmp = busName;
|
||||
tmp << member;
|
||||
item->m_Label = tmp;
|
||||
item->m_Member = member;
|
||||
|
||||
aNetListItems.push_back( item );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,28 @@
|
|||
/*
|
||||
* 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 <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2011 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
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file class_netlist_object.h
|
||||
* @brief Definition of the NETLIST_OBJECT class.
|
||||
|
@ -12,8 +37,15 @@
|
|||
#include "lib_pin.h" // 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*> NETLIST_OBJECT_LIST;
|
||||
|
||||
|
||||
/* Type of Net objects (wires, labels, pins...) */
|
||||
enum NetObjetType {
|
||||
enum NETLIST_ITEM_T {
|
||||
NET_ITEM_UNSPECIFIED, // only for not yet initialized instances
|
||||
NET_SEGMENT, // connection by wire
|
||||
NET_BUS, // connection by bus
|
||||
|
@ -47,8 +79,9 @@ enum NetObjetType {
|
|||
NET_NOCONNECT // this is a no connect symbol
|
||||
};
|
||||
|
||||
|
||||
/* Values for .m_FlagOfConnection member */
|
||||
enum ConnectType {
|
||||
enum NET_CONNECTION_T {
|
||||
UNCONNECTED = 0, /* Pin or Label not connected (error) */
|
||||
NOCONNECT_SYMBOL_PRESENT, /* Pin not connected but have a NoConnect
|
||||
* symbol on it (no error) */
|
||||
|
@ -56,11 +89,24 @@ enum ConnectType {
|
|||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
inline bool IsBusLabel( const wxString& aLabel )
|
||||
{
|
||||
/* Search for '[' because a bus label is like "busname[nn..mm]" */
|
||||
return aLabel.Find( '[' ) != wxNOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
class NETLIST_OBJECT
|
||||
{
|
||||
public:
|
||||
NetObjetType m_Type; /* Type of item (see NetObjetType
|
||||
* enum) */
|
||||
NETLIST_ITEM_T m_Type; /* Type of item (see NETLIST_ITEM_T enum) */
|
||||
EDA_ITEM* m_Comp; /* Pointer on the library item that
|
||||
* created this net object (the parent)
|
||||
*/
|
||||
|
@ -81,20 +127,15 @@ private:
|
|||
*/
|
||||
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
|
||||
int m_Member; /* for labels type NET_BUSLABELMEMBER ( bus member
|
||||
* created from the BUS label ) member number.
|
||||
*/
|
||||
ConnectType 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) */
|
||||
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. */
|
||||
wxPoint m_Start; // Position of object or for segments:
|
||||
// starting point
|
||||
wxPoint m_End; // For segments (wire and buses):
|
||||
// ending point
|
||||
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
|
||||
|
@ -120,7 +161,7 @@ public:
|
|||
wxString GetPinNumText()
|
||||
{
|
||||
// hide the ugliness in here, but do it inline.
|
||||
return LIB_PIN::ReturnPinStringNum( m_PinNum );
|
||||
return LIB_PIN::ReturnPinStringNum( m_PinNum );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -133,11 +174,18 @@ public:
|
|||
* if no connection to \a aNetItem.
|
||||
*/
|
||||
bool IsLabelConnected( NETLIST_OBJECT* aNetItem );
|
||||
|
||||
/**
|
||||
* Function ConvertBusToNetListItems
|
||||
* breaks the text of a bus label type net list object into as many members as
|
||||
* it contains and creates a #NETLIST_OBJECT for each label and adds it to \a
|
||||
* aNetListItems.
|
||||
*
|
||||
* @param aNetListItems A reference to vector of #NETLIST_OBJECT pointers to add
|
||||
* the bus label NETLIST_OBJECTs.
|
||||
*/
|
||||
void ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItems );
|
||||
};
|
||||
|
||||
|
||||
// Buffer to build the list of items used in netlist and erc calculations
|
||||
typedef std::vector <NETLIST_OBJECT*> NETLIST_OBJECT_LIST;
|
||||
|
||||
|
||||
#endif // _CLASS_NETLIST_OBJECT_H_
|
||||
|
|
|
@ -539,92 +539,6 @@ static void SheetLabelConnect( NETLIST_OBJECT* SheetLabel )
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function ConvertBusToMembers
|
||||
* breaks the text of a bus label type in as many members as it contains and
|
||||
* creates a #NETLIST_OBJECT for each label.
|
||||
*
|
||||
* @param aNetListItems A reference to vector of #NETLIST_OBJECT pointers to add
|
||||
* the bus label NETLIST_OBJECTs.
|
||||
* @param aBusLabel A reference to the base bus label #NETLIST_OBJECT.
|
||||
*/
|
||||
void ConvertBusToMembers( NETLIST_OBJECT_LIST& aNetListItems, NETLIST_OBJECT& aBusLabel )
|
||||
{
|
||||
wxCHECK_RET( IsBusLabel( aBusLabel.m_Label ),
|
||||
wxT( "<" ) + aBusLabel.m_Label + wxT( "> is not a valid bus label." ) );
|
||||
|
||||
if( aBusLabel.m_Type == NET_HIERLABEL )
|
||||
aBusLabel.m_Type = NET_HIERBUSLABELMEMBER;
|
||||
else if( aBusLabel.m_Type == NET_GLOBLABEL )
|
||||
aBusLabel.m_Type = NET_GLOBBUSLABELMEMBER;
|
||||
else if( aBusLabel.m_Type == NET_SHEETLABEL )
|
||||
aBusLabel.m_Type = NET_SHEETBUSLABELMEMBER;
|
||||
else if( aBusLabel.m_Type == NET_LABEL )
|
||||
aBusLabel.m_Type = NET_BUSLABELMEMBER;
|
||||
else
|
||||
wxCHECK_RET( false, wxT( "Net object type is not valid." ) );
|
||||
|
||||
unsigned i;
|
||||
wxString tmp, busName;
|
||||
long begin, end, member;
|
||||
|
||||
/* Search for '[' because a bus label is like "busname[nn..mm]" */
|
||||
i = aBusLabel.m_Label.Find( '[' );
|
||||
|
||||
busName = aBusLabel.m_Label.Left( i );
|
||||
i++;
|
||||
|
||||
while( aBusLabel.m_Label[i] != '.' && i < aBusLabel.m_Label.Len() )
|
||||
{
|
||||
tmp.Append( aBusLabel.m_Label[i] );
|
||||
i++;
|
||||
}
|
||||
|
||||
tmp.ToLong( &begin );
|
||||
|
||||
while( aBusLabel.m_Label[i] == '.' && i < aBusLabel.m_Label.Len() )
|
||||
i++;
|
||||
|
||||
tmp.Empty();
|
||||
|
||||
while( aBusLabel.m_Label[i] != ']' && i < aBusLabel.m_Label.Len() )
|
||||
{
|
||||
tmp.Append( aBusLabel.m_Label[i] );
|
||||
i++;
|
||||
}
|
||||
|
||||
tmp.ToLong( &end );
|
||||
|
||||
if( begin < 0 )
|
||||
begin = 0;
|
||||
|
||||
if( end < 0 )
|
||||
end = 0;
|
||||
|
||||
if( begin > end )
|
||||
EXCHG( begin, end );
|
||||
|
||||
member = begin;
|
||||
tmp = busName;
|
||||
tmp << member;
|
||||
aBusLabel.m_Label = tmp;
|
||||
aBusLabel.m_Member = member;
|
||||
|
||||
for( member++; member <= end; member++ )
|
||||
{
|
||||
NETLIST_OBJECT* item = new NETLIST_OBJECT( aBusLabel );
|
||||
|
||||
/* Conversion of BusLabel to the root name + the current member id.*/
|
||||
tmp = busName;
|
||||
tmp << member;
|
||||
item->m_Label = tmp;
|
||||
item->m_Member = member;
|
||||
|
||||
aNetListItems.push_back( item );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Routine that analyzes the type labels xxBUSLABELMEMBER
|
||||
* Propagate Netcode between the corresponding labels (ie when
|
||||
|
@ -672,13 +586,6 @@ static void ConnectBusLabels( NETLIST_OBJECT_LIST& aNetItemBuffer )
|
|||
}
|
||||
|
||||
|
||||
bool IsBusLabel( const wxString& aLabel )
|
||||
{
|
||||
/* Search for '[' because a bus label is like "busname[nn..mm]" */
|
||||
return aLabel.Find( '[' ) != wxNOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* PropageNetCode propagates Netcode NewNetCode on all elements
|
||||
* belonging to the former Netcode OldNetCode
|
||||
|
@ -913,7 +820,7 @@ void LabelConnect( NETLIST_OBJECT* LabelRef )
|
|||
// NET_LABEL is sheet-local (***)
|
||||
// NET_GLOBLABEL is global.
|
||||
// NET_PINLABEL is a kind of global label (generated by a power pin invisible)
|
||||
NetObjetType ntype = g_NetObjectslist[i]->m_Type;
|
||||
NETLIST_ITEM_T ntype = g_NetObjectslist[i]->m_Type;
|
||||
|
||||
if( ntype == NET_LABEL
|
||||
|| ntype == NET_GLOBLABEL
|
||||
|
@ -960,7 +867,7 @@ static void SetUnconnectedFlag( NETLIST_OBJECT_LIST& aNetItemBuffer )
|
|||
{
|
||||
NETLIST_OBJECT* NetItemRef;
|
||||
unsigned NetStart, NetEnd;
|
||||
ConnectType StateFlag;
|
||||
NET_CONNECTION_T StateFlag;
|
||||
|
||||
NetStart = NetEnd = 0;
|
||||
StateFlag = UNCONNECTED;
|
||||
|
|
|
@ -58,19 +58,6 @@ void DrawDanglingSymbol( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& pos, in
|
|||
EDA_Colors ReturnLayerColor( int Layer );
|
||||
|
||||
|
||||
/***************/
|
||||
/* NETLIST.CPP */
|
||||
/***************/
|
||||
/**
|
||||
* Function IsBusLabel
|
||||
* test if the \a aLabel has a bus notation.
|
||||
*
|
||||
* @param aLabel A wxString object containing the label to test.
|
||||
* @return false if text is not a bus notattion otherwise true is returned.
|
||||
*/
|
||||
bool IsBusLabel( const wxString& aLabel );
|
||||
|
||||
|
||||
/***************/
|
||||
/* PINEDIT.CPP */
|
||||
/***************/
|
||||
|
|
|
@ -47,9 +47,6 @@
|
|||
#include "class_netlist_object.h"
|
||||
|
||||
|
||||
extern void ConvertBusToMembers( NETLIST_OBJECT_LIST& aNetItemBuffer, NETLIST_OBJECT& aBusLabel );
|
||||
|
||||
|
||||
SCH_SHEET::SCH_SHEET( const wxPoint& pos ) :
|
||||
SCH_ITEM( NULL, SCH_SHEET_T )
|
||||
{
|
||||
|
@ -1118,7 +1115,7 @@ void SCH_SHEET::GetNetListItem( vector<NETLIST_OBJECT*>& aNetListItems,
|
|||
aNetListItems.push_back( item );
|
||||
|
||||
if( IsBusLabel( m_pins[i].m_Text ) )
|
||||
ConvertBusToMembers( aNetListItems, *item );
|
||||
item->ConvertBusToNetListItems( aNetListItems );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
|
||||
|
||||
extern void IncrementLabelMember( wxString& name );
|
||||
extern void ConvertBusToMembers( NETLIST_OBJECT_LIST& aNetItemBuffer, NETLIST_OBJECT& aBusLabel );
|
||||
|
||||
|
||||
/* Names of sheet label types. */
|
||||
|
@ -696,7 +695,7 @@ void SCH_TEXT::GetNetListItem( vector<NETLIST_OBJECT*>& aNetListItems,
|
|||
|
||||
/* If a bus connects to label */
|
||||
if( IsBusLabel( m_Text ) )
|
||||
ConvertBusToMembers( aNetListItems, *item );
|
||||
item->ConvertBusToNetListItems( aNetListItems );
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue