KiCad PCB EDA Suite
NETLIST_EXPORTER_GENERIC Class Reference

Class NETLIST_EXPORTER_GENERIC generates a generic XML based netlist file. More...

#include <netlist_exporter_generic.h>

Inheritance diagram for NETLIST_EXPORTER_GENERIC:
NETLIST_EXPORTER NETLIST_EXPORTER_KICAD

Public Member Functions

 NETLIST_EXPORTER_GENERIC (NETLIST_OBJECT_LIST *aMasterList, SYMBOL_LIB_TABLE *aLibTable)
 
bool WriteNetlist (const wxString &aOutFileName, unsigned aNetlistOptions) override
 Function WriteNetlist writes to specified output file. More...
 

Static Public Member Functions

static wxString MakeCommandLine (const wxString &aFormatString, const wxString &aNetlistFile, const wxString &aFinalFile, const wxString &aProjectDirectory)
 Function MakeCommandLine builds up a string that describes a command line for executing a child process. More...
 

Protected Member Functions

XNODEnode (const wxString &aName, const wxString &aTextualContent=wxEmptyString)
 Function node is a convenience function that creates a new XNODE with an optional textual child. More...
 
XNODEmakeRoot (int aCtl=GNL_ALL)
 Function makeGenericRoot builds the entire document tree for the generic export. More...
 
XNODEmakeComponents ()
 Function makeComponents. More...
 
XNODEmakeDesignHeader ()
 Function makeDesignHeader fills out a project "design" header into an XML node. More...
 
XNODEmakeLibParts ()
 Function makeLibParts fills out an XML node with the unique library parts and returns it. More...
 
XNODEmakeListOfNets ()
 Function makeListOfNets fills out an XML node with a list of nets and returns it. More...
 
XNODEmakeLibraries ()
 Function makeLibraries fills out an XML node with a list of used libraries and returns it. More...
 
void addComponentFields (XNODE *xcomp, SCH_COMPONENT *comp, SCH_SHEET_PATH *aSheet)
 
SCH_COMPONENTfindNextComponentAndCreatePinList (EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
 Function findNextComponentAndCreatePinList finds a component from the DrawList and builds its pin list in m_SortedComponentPinList. More...
 
SCH_COMPONENTfindNextComponent (EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
 
void eraseDuplicatePins ()
 Function eraseDuplicatePins erase duplicate Pins from m_SortedComponentPinList (i.e. More...
 
bool addPinToComponentPinList (SCH_COMPONENT *Component, SCH_SHEET_PATH *sheet, LIB_PIN *PinEntry)
 Function addPinToComponentPinList adds a new pin description to the pin list m_SortedComponentPinList. More...
 
void findAllUnitsOfComponent (SCH_COMPONENT *aComponent, LIB_PART *aEntry, SCH_SHEET_PATH *aSheetPath)
 Function findAllUnitsOfComponent is used for "multiple parts per package" components. More...
 

Static Protected Member Functions

static void sprintPinNetName (wxString &aResult, const wxString &aNetNameFormat, NETLIST_OBJECT *aPin, bool aUseNetcodeAsNetName=false)
 Function sprintPinNetName formats the net name for aPin using aNetNameFormat into aResult. More...
 

Protected Attributes

NETLIST_OBJECT_LISTm_masterList
 
NETLIST_OBJECTS m_SortedComponentPinList
 yes ownership, connected items flat list More...
 
UNIQUE_STRINGS m_ReferencesAlreadyFound
 Used for "multi parts per package" components, avoids processing a lib component more than once. More...
 
std::set< LIB_PART *, LIB_PART_LESS_THANm_LibParts
 unique library parts used. LIB_PART items are sorted by names More...
 

Private Attributes

std::set< wxString > m_libraries
 Set of library nicknames. More...
 
SYMBOL_LIB_TABLEm_libTable
 

Detailed Description

Class NETLIST_EXPORTER_GENERIC generates a generic XML based netlist file.

This allows using XSLT or other methods to transform the XML to other netlist formats outside of the C++ codebase.

Definition at line 56 of file netlist_exporter_generic.h.

Constructor & Destructor Documentation

NETLIST_EXPORTER_GENERIC::NETLIST_EXPORTER_GENERIC ( NETLIST_OBJECT_LIST aMasterList,
SYMBOL_LIB_TABLE aLibTable 
)
inline

Definition at line 64 of file netlist_exporter_generic.h.

64  :
65  NETLIST_EXPORTER( aMasterList ),
66  m_libTable( aLibTable )
67  {
68  wxASSERT( aLibTable );
69  }
NETLIST_EXPORTER(NETLIST_OBJECT_LIST *aMasterList)
Constructor.

Member Function Documentation

void NETLIST_EXPORTER_GENERIC::addComponentFields ( XNODE xcomp,
SCH_COMPONENT comp,
SCH_SHEET_PATH aSheet 
)
protected

Definition at line 90 of file netlist_exporter_generic.cpp.

References DATASHEET, COMP_FIELDS::datasheet, COMP_FIELDS::f, FOOTPRINT, COMP_FIELDS::footprint, g_RootSheet, SCH_COMPONENT::GetField(), SCH_COMPONENT::GetFieldCount(), SCH_FIELD::GetName(), SCH_COMPONENT::GetRef(), EDA_TEXT::GetText(), SCH_COMPONENT::GetUnitCount(), SCH_FIELD::IsVoid(), MANDATORY_FIELDS, node(), SCH_COMPONENT_T, VALUE, and COMP_FIELDS::value.

Referenced by makeComponents().

91 {
92  if( comp->GetUnitCount() > 1 )
93  {
94  // Sadly, each unit of a component can have its own unique fields. This block
95  // finds the last non blank field and records it. Last guy wins and the order
96  // of units occuring in a schematic hierarchy is variable. Therefore user
97  // is best off setting fields into only one unit. But this scavenger algorithm
98  // will find any non blank fields in all units and use the last non-blank field
99  // for each unique field name.
100 
101  COMP_FIELDS fields;
102  wxString ref = comp->GetRef( aSheet );
103 
104  SCH_SHEET_LIST sheetList( g_RootSheet );
105 
106  for( unsigned i = 0; i < sheetList.size(); i++ )
107  {
108  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
109  {
110  if( item->Type() != SCH_COMPONENT_T )
111  continue;
112 
113  SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
114 
115  wxString ref2 = comp2->GetRef( &sheetList[i] );
116 
117  if( ref2.CmpNoCase( ref ) != 0 )
118  continue;
119 
120  // The last guy wins. User should only set fields in any one unit.
121  // remark: IsVoid() returns true for empty strings or the "~" string (empty field value)
122  if( !comp2->GetField( VALUE )->IsVoid() )
123  fields.value = comp2->GetField( VALUE )->GetText();
124 
125  if( !comp2->GetField( FOOTPRINT )->IsVoid() )
126  fields.footprint = comp2->GetField( FOOTPRINT )->GetText();
127 
128  if( !comp2->GetField( DATASHEET )->IsVoid() )
129  fields.datasheet = comp2->GetField( DATASHEET )->GetText();
130 
131  for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp2->GetFieldCount(); ++fldNdx )
132  {
133  SCH_FIELD* f = comp2->GetField( fldNdx );
134 
135  if( f->GetText().size() )
136  {
137  fields.f[ f->GetName() ] = f->GetText();
138  }
139  }
140  }
141  }
142 
143  // Do not output field values blank in netlist:
144  if( fields.value.size() )
145  xcomp->AddChild( node( "value", fields.value ) );
146  else // value field always written in netlist
147  xcomp->AddChild( node( "value", "~" ) );
148 
149  if( fields.footprint.size() )
150  xcomp->AddChild( node( "footprint", fields.footprint ) );
151 
152  if( fields.datasheet.size() )
153  xcomp->AddChild( node( "datasheet", fields.datasheet ) );
154 
155  if( fields.f.size() )
156  {
157  XNODE* xfields;
158  xcomp->AddChild( xfields = node( "fields" ) );
159 
160  // non MANDATORY fields are output alphabetically
161  for( std::map< wxString, wxString >::const_iterator it = fields.f.begin();
162  it != fields.f.end(); ++it )
163  {
164  XNODE* xfield;
165  xfields->AddChild( xfield = node( "field", it->second ) );
166  xfield->AddAttribute( "name", it->first );
167  }
168  }
169  }
170  else
171  {
172  xcomp->AddChild( node( "value", comp->GetField( VALUE )->GetText() ) );
173 
174  if( !comp->GetField( FOOTPRINT )->IsVoid() )
175  xcomp->AddChild( node( "footprint", comp->GetField( FOOTPRINT )->GetText() ) );
176 
177  if( !comp->GetField( DATASHEET )->IsVoid() )
178  xcomp->AddChild( node( "datasheet", comp->GetField( DATASHEET )->GetText() ) );
179 
180  // Export all user defined fields within the component,
181  // which start at field index MANDATORY_FIELDS. Only output the <fields>
182  // container element if there are any <field>s.
183  if( comp->GetFieldCount() > MANDATORY_FIELDS )
184  {
185  XNODE* xfields;
186  xcomp->AddChild( xfields = node( "fields" ) );
187 
188  for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp->GetFieldCount(); ++fldNdx )
189  {
190  SCH_FIELD* f = comp->GetField( fldNdx );
191 
192  // only output a field if non empty and not just "~"
193  if( !f->IsVoid() )
194  {
195  XNODE* xfield;
196  xfields->AddChild( xfield = node( "field", f->GetText() ) );
197  xfield->AddAttribute( "name", f->GetName() );
198  }
199  }
200  }
201  }
202 }
Class SCH_SHEET_LIST.
Class SCH_FIELD instances are attached to a component and provide a place for the component's value...
Definition: sch_field.h:56
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:425
name of datasheet
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
bool IsVoid() const
Function IsVoid returns true if the field is either empty or holds "~".
Definition: sch_field.h:116
int GetUnitCount() const
Return the number of units per package of the symbol.
EDA_ITEM * Next() const
Definition: base_struct.h:233
Field Name Module PCB, i.e. "16DIP300".
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
Holder for multi-unit component fields.
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
int GetFieldCount() const
Return the number of fields in this symbol.
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:178
std::map< wxString, wxString > f
#define VALUE
bool NETLIST_EXPORTER::addPinToComponentPinList ( SCH_COMPONENT Component,
SCH_SHEET_PATH sheet,
LIB_PIN PinEntry 
)
protectedinherited

Function addPinToComponentPinList adds a new pin description to the pin list m_SortedComponentPinList.

A pin description is a pointer to the corresponding structure created by BuildNetList() in the table g_NetObjectslist.

Definition at line 249 of file netlist_exporter.cpp.

References DisplayError(), NETLIST_OBJECT_LIST::GetItem(), LIB_PIN::GetNumber(), NETLIST_OBJECT::m_Link, NETLIST_EXPORTER::m_masterList, NETLIST_OBJECT::m_PinNum, NETLIST_OBJECT::m_SheetPath, NETLIST_EXPORTER::m_SortedComponentPinList, NETLIST_OBJECT::m_Type, MAXPIN, and NET_PIN.

Referenced by NETLIST_EXPORTER::findAllUnitsOfComponent(), and NETLIST_EXPORTER::findNextComponentAndCreatePinList().

251 {
252  // Search the PIN description for Pin in g_NetObjectslist
253  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
254  {
255  NETLIST_OBJECT* pin = m_masterList->GetItem( ii );
256 
257  if( pin->m_Type != NET_PIN )
258  continue;
259 
260  if( pin->m_Link != aComponent )
261  continue;
262 
263  if( pin->m_PinNum != aPin->GetNumber() )
264  continue;
265 
266  // most expensive test at the end.
267  if( pin->m_SheetPath != *aSheetPath )
268  continue;
269 
270  m_SortedComponentPinList.push_back( pin );
271 
272  if( m_SortedComponentPinList.size() >= MAXPIN )
273  {
274  // Log message for Internal error
275  DisplayError( NULL, wxT( "addPinToComponentPinList err: MAXPIN reached" ) );
276  }
277 
278  return true; // we're done, we appended.
279  }
280 
281  return false;
282 }
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in list.
#define MAXPIN
Definition: netlist.h:53
SCH_SHEET_PATH m_SheetPath
NETLIST_ITEM_T m_Type
NETLIST_OBJECT_LIST * m_masterList
NETLIST_OBJECTS m_SortedComponentPinList
yes ownership, connected items flat list
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:73
void NETLIST_EXPORTER::eraseDuplicatePins ( )
protectedinherited

Function eraseDuplicatePins erase duplicate Pins from m_SortedComponentPinList (i.e.

set pointer in this list to NULL). (This is a list of pins found in the whole schematic, for a single component.) These duplicate pins were put in list because some pins (powers... ) are found more than one time when we have a multiple parts per package component. For instance, a 74ls00 has 4 parts, and therefore the VCC pin and GND pin appears 4 times in the list. Note: this list MUST be sorted by pin number (.m_PinNum member value) Also set the m_Flag member of "removed" NETLIST_OBJECT pin item to 1

Definition at line 285 of file netlist_exporter.cpp.

References NETLIST_EXPORTER::m_SortedComponentPinList, and PAD_CONNECT.

Referenced by NETLIST_EXPORTER::findNextComponentAndCreatePinList().

286 {
287  for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
288  {
289  if( m_SortedComponentPinList[ii] == NULL ) /* already deleted */
290  continue;
291 
292  /* Search for duplicated pins
293  * If found, remove duplicates. The priority is to keep connected pins
294  * and remove unconnected
295  * - So this allows (for instance when using multi op amps per package
296  * - to connect only one op amp to power
297  * Because the pin list is sorted by m_PinNum value, duplicated pins
298  * are necessary successive in list
299  */
300  int idxref = ii;
301  for( unsigned jj = ii + 1; jj < m_SortedComponentPinList.size(); jj++ )
302  {
303  if( m_SortedComponentPinList[jj] == NULL ) // Already removed
304  continue;
305 
306  // if other pin num, stop search,
307  // because all pins having the same number are consecutive in list.
308  if( m_SortedComponentPinList[idxref]->m_PinNum != m_SortedComponentPinList[jj]->m_PinNum )
309  break;
310 
311  if( m_SortedComponentPinList[idxref]->GetConnectionType() == PAD_CONNECT )
312  {
313  m_SortedComponentPinList[jj]->m_Flag = 1;
314  m_SortedComponentPinList[jj] = NULL;
315  }
316  else /* the reference pin is not connected: remove this pin if the
317  * other pin is connected */
318  {
319  if( m_SortedComponentPinList[jj]->GetConnectionType() == PAD_CONNECT )
320  {
321  m_SortedComponentPinList[idxref]->m_Flag = 1;
322  m_SortedComponentPinList[idxref] = NULL;
323  idxref = jj;
324  }
325  else // the 2 pins are not connected: remove the tested pin,
326  { // and continue ...
327  m_SortedComponentPinList[jj]->m_Flag = 1;
328  m_SortedComponentPinList[jj] = NULL;
329  }
330  }
331  }
332  }
333 }
NETLIST_OBJECTS m_SortedComponentPinList
yes ownership, connected items flat list
void NETLIST_EXPORTER::findAllUnitsOfComponent ( SCH_COMPONENT aComponent,
LIB_PART aEntry,
SCH_SHEET_PATH aSheetPath 
)
protectedinherited

Function findAllUnitsOfComponent is used for "multiple parts per package" components.

Search the entire design for all units of aComponent based on matching reference designator, and for each unit, add all its pins to the temporary sorted pin list, m_SortedComponentPinList.

Definition at line 336 of file netlist_exporter.cpp.

References NETLIST_EXPORTER::addPinToComponentPinList(), g_RootSheet, SCH_COMPONENT::GetConvert(), LIB_PART::GetNextPin(), SCH_COMPONENT::GetRef(), SCH_COMPONENT::GetUnitSelection(), LIB_PIN_T, and SCH_COMPONENT_T.

Referenced by NETLIST_EXPORTER::findNextComponentAndCreatePinList().

338 {
339  wxString ref = aComponent->GetRef( aSheetPath );
340  wxString ref2;
341 
342  SCH_SHEET_LIST sheetList( g_RootSheet );
343 
344  for( unsigned i = 0; i < sheetList.size(); i++ )
345  {
346  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
347  {
348  if( item->Type() != SCH_COMPONENT_T )
349  continue;
350 
351  SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
352 
353  ref2 = comp2->GetRef( &sheetList[i] );
354 
355  if( ref2.CmpNoCase( ref ) != 0 )
356  continue;
357 
358  int unit2 = comp2->GetUnitSelection( &sheetList[i] ); // slow
359 
360  for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) )
361  {
362  wxASSERT( pin->Type() == LIB_PIN_T );
363 
364  if( pin->GetUnit() && pin->GetUnit() != unit2 )
365  continue;
366 
367  if( pin->GetConvert() && pin->GetConvert() != comp2->GetConvert() )
368  continue;
369 
370  // A suitable pin is found: add it to the current list
371  addPinToComponentPinList( comp2, &sheetList[i], pin );
372  }
373  }
374  }
375 }
Class SCH_SHEET_LIST.
int GetUnitSelection(SCH_SHEET_PATH *aSheet)
EDA_ITEM * Next() const
Definition: base_struct.h:233
int GetConvert() const
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
LIB_PIN * GetNextPin(LIB_PIN *aItem=NULL)
Return the next pin object from the draw list.
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:178
bool addPinToComponentPinList(SCH_COMPONENT *Component, SCH_SHEET_PATH *sheet, LIB_PIN *PinEntry)
Function addPinToComponentPinList adds a new pin description to the pin list m_SortedComponentPinList...
SCH_COMPONENT * NETLIST_EXPORTER::findNextComponent ( EDA_ITEM aItem,
SCH_SHEET_PATH aSheetPath 
)
protectedinherited

Definition at line 112 of file netlist_exporter.cpp.

References SCH_COMPONENT::GetPartRef(), SCH_COMPONENT::GetRef(), LIB_PART::GetUnitCount(), UNIQUE_STRINGS::Lookup(), NETLIST_EXPORTER::m_LibParts, NETLIST_EXPORTER::m_ReferencesAlreadyFound, EDA_ITEM::Next(), SCH_COMPONENT_T, and EDA_ITEM::Type().

Referenced by makeComponents().

113 {
114  wxString ref;
115 
116  // continue searching from the middle of a linked list (the draw list)
117  for( ; aItem; aItem = aItem->Next() )
118  {
119  if( aItem->Type() != SCH_COMPONENT_T )
120  continue;
121 
122  // found next component
123  SCH_COMPONENT* comp = (SCH_COMPONENT*) aItem;
124 
125  // Power symbols and other components which have the reference starting
126  // with "#" are not included in netlist (pseudo or virtual components)
127  ref = comp->GetRef( aSheetPath );
128 
129  if( ref[0] == wxChar( '#' ) )
130  continue;
131 
132  // if( Component->m_FlagControlMulti == 1 )
133  // continue; /* yes */
134  // removed because with multiple instances of one schematic
135  // (several sheets pointing to 1 screen), this will be erroneously be
136  // toggled.
137 
138  LIB_PART* part = comp->GetPartRef().lock().get();
139 
140  if( !part )
141  continue;
142 
143  // If component is a "multi parts per package" type
144  if( part->GetUnitCount() > 1 )
145  {
146  // test if this reference has already been processed, and if so skip
147  if( m_ReferencesAlreadyFound.Lookup( ref ) )
148  continue;
149  }
150 
151  // record the usage of this library component entry.
152  m_LibParts.insert( part ); // rejects non-unique pointers
153 
154  return comp;
155  }
156 
157  return NULL;
158 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:225
bool Lookup(const wxString &aString)
Function Lookup returns true if aString already exists in the set, otherwise returns false and adds a...
PART_REF & GetPartRef()
UNIQUE_STRINGS m_ReferencesAlreadyFound
Used for "multi parts per package" components, avoids processing a lib component more than once...
EDA_ITEM * Next() const
Definition: base_struct.h:233
std::set< LIB_PART *, LIB_PART_LESS_THAN > m_LibParts
unique library parts used. LIB_PART items are sorted by names
Define a library symbol object.
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
int GetUnitCount() const
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
SCH_COMPONENT * NETLIST_EXPORTER::findNextComponentAndCreatePinList ( EDA_ITEM aItem,
SCH_SHEET_PATH aSheetPath 
)
protectedinherited

Function findNextComponentAndCreatePinList finds a component from the DrawList and builds its pin list in m_SortedComponentPinList.

This list is sorted by pin num. the component is the next actual component after aItem (power symbols and virtual components that have their reference starting by '#'are skipped).

Definition at line 169 of file netlist_exporter.cpp.

References NETLIST_EXPORTER::addPinToComponentPinList(), NETLIST_EXPORTER::eraseDuplicatePins(), NETLIST_EXPORTER::findAllUnitsOfComponent(), SCH_COMPONENT::GetConvert(), SCH_COMPONENT::GetPartRef(), LIB_PART::GetPins(), SCH_COMPONENT::GetRef(), LIB_PART::GetUnitCount(), SCH_COMPONENT::GetUnitSelection(), LIB_PIN_T, UNIQUE_STRINGS::Lookup(), NETLIST_EXPORTER::m_LibParts, NETLIST_EXPORTER::m_ReferencesAlreadyFound, NETLIST_EXPORTER::m_SortedComponentPinList, EDA_ITEM::Next(), SCH_COMPONENT_T, MULTIVECTOR< T, FIRST_TYPE_VAL, LAST_TYPE_VAL >::sort(), sortPinsByNum(), and EDA_ITEM::Type().

Referenced by NETLIST_EXPORTER_PSPICE::ProcessNetlist(), NETLIST_EXPORTER_ORCADPCB2::WriteNetlist(), and NETLIST_EXPORTER_CADSTAR::WriteNetlist().

171 {
172  wxString ref;
173 
174  m_SortedComponentPinList.clear();
175 
176  // continue searching from the middle of a linked list (the draw list)
177  for( ; aItem; aItem = aItem->Next() )
178  {
179  if( aItem->Type() != SCH_COMPONENT_T )
180  continue;
181 
182  // found next component
183  SCH_COMPONENT* comp = (SCH_COMPONENT*) aItem;
184 
185  // Power symbols and other components which have the reference starting
186  // with "#" are not included in netlist (pseudo or virtual components)
187  ref = comp->GetRef( aSheetPath );
188 
189  if( ref[0] == wxChar( '#' ) )
190  continue;
191 
192  // if( Component->m_FlagControlMulti == 1 )
193  // continue; /* yes */
194  // removed because with multiple instances of one schematic
195  // (several sheets pointing to 1 screen), this will be erroneously be
196  // toggled.
197 
198  LIB_PART* part = comp->GetPartRef().lock().get();
199 
200  if( !part )
201  continue;
202 
203  // If component is a "multi parts per package" type
204  if( part->GetUnitCount() > 1 )
205  {
206  // test if this reference has already been processed, and if so skip
207  if( m_ReferencesAlreadyFound.Lookup( ref ) )
208  continue;
209 
210  // Collect all pins for this reference designator by searching
211  // the entire design for other parts with the same reference designator.
212  // This is only done once, it would be too expensive otherwise.
213  findAllUnitsOfComponent( comp, part, aSheetPath );
214  }
215 
216  else // entry->GetUnitCount() <= 1 means one part per package
217  {
218  LIB_PINS pins; // constructed once here
219 
220  part->GetPins( pins, comp->GetUnitSelection( aSheetPath ), comp->GetConvert() );
221 
222  for( size_t i = 0; i < pins.size(); i++ )
223  {
224  LIB_PIN* pin = pins[i];
225 
226  wxASSERT( pin->Type() == LIB_PIN_T );
227 
228  addPinToComponentPinList( comp, aSheetPath, pin );
229  }
230  }
231 
232  // Sort pins in m_SortedComponentPinList by pin number
233  sort( m_SortedComponentPinList.begin(),
235 
236  // Remove duplicate Pins in m_SortedComponentPinList
238 
239  // record the usage of this library component entry.
240  m_LibParts.insert( part ); // rejects non-unique pointers
241 
242  return comp;
243  }
244 
245  return NULL;
246 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:225
bool Lookup(const wxString &aString)
Function Lookup returns true if aString already exists in the set, otherwise returns false and adds a...
PART_REF & GetPartRef()
UNIQUE_STRINGS m_ReferencesAlreadyFound
Used for "multi parts per package" components, avoids processing a lib component more than once...
int GetUnitSelection(SCH_SHEET_PATH *aSheet)
EDA_ITEM * Next() const
Definition: base_struct.h:233
void findAllUnitsOfComponent(SCH_COMPONENT *aComponent, LIB_PART *aEntry, SCH_SHEET_PATH *aSheetPath)
Function findAllUnitsOfComponent is used for "multiple parts per package" components.
static bool sortPinsByNum(NETLIST_OBJECT *aPin1, NETLIST_OBJECT *aPin2)
Comparison routine for sorting by pin numbers.
void GetPins(LIB_PINS &aList, int aUnit=0, int aConvert=0)
Return a list of pin object pointers from the draw item list.
std::set< LIB_PART *, LIB_PART_LESS_THAN > m_LibParts
unique library parts used. LIB_PART items are sorted by names
int GetConvert() const
Define a library symbol object.
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
int GetUnitCount() const
NETLIST_OBJECTS m_SortedComponentPinList
yes ownership, connected items flat list
std::vector< LIB_PIN * > LIB_PINS
Helper for defining a list of pin object pointers.
Definition: lib_draw_item.h:60
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
bool addPinToComponentPinList(SCH_COMPONENT *Component, SCH_SHEET_PATH *sheet, LIB_PIN *PinEntry)
Function addPinToComponentPinList adds a new pin description to the pin list m_SortedComponentPinList...
void eraseDuplicatePins()
Function eraseDuplicatePins erase duplicate Pins from m_SortedComponentPinList (i.e.
wxString NETLIST_EXPORTER::MakeCommandLine ( const wxString &  aFormatString,
const wxString &  aNetlistFile,
const wxString &  aFinalFile,
const wxString &  aProjectDirectory 
)
staticinherited

Function MakeCommandLine builds up a string that describes a command line for executing a child process.

The input and output file names along with any options to the executable are all possibly in the returned string.

Parameters
aFormatStringholds:
  • the name of the external program
  • any options needed by that program
  • formatting sequences, see below.
aNetlistFileis the name of the input file for the external program, that is a intermediate netlist file in xml format.
aFinalFileis the name of the output file that the user expects.
aProjectDirectoryis used for P replacement, it should omit the trailing '/'.

Supported formatting sequences and their meaning:

  • B => base filename of selected output file, minus path and extension.
  • I => complete filename and path of the temporary input file.
  • O => complete filename and path of the user chosen output file.
  • P => project directory, without name and without trailing '/'

Definition at line 50 of file netlist_exporter.cpp.

Referenced by SCH_EDIT_FRAME::WriteNetListFile().

52 {
53  // Expand format symbols in the command line:
54  // %B => base filename of selected output file, minus path and extension.
55  // %P => project directory name, without trailing '/' or '\'.
56  // %I => full filename of the input file (the intermediate net file).
57  // %O => complete filename and path (but without extension) of the user chosen output file.
58 
59  wxString ret = aFormatString;
60  wxFileName in = aNetlistFile;
61  wxFileName out = aFinalFile;
62  wxString str_out = out.GetFullPath();
63 
64  ret.Replace( "%P", aProjectPath, true );
65  ret.Replace( "%B", out.GetName(), true );
66  ret.Replace( "%I", in.GetFullPath(), true );
67 
68 #ifdef __WINDOWS__
69  // A ugly hack to run xsltproc that has a serious bug on Window since along time:
70  // the filename given after -o option (output filename) cannot use '\' in filename
71  // so replace if by '/' if possible (I mean if the filename does not start by "\\"
72  // that is a filename on a Windows server)
73 
74  if( !str_out.StartsWith( "\\\\" ) )
75  str_out.Replace( "\\", "/" );
76 #endif
77 
78  ret.Replace( "%O", str_out, true );
79 
80  return ret;
81 }
XNODE * NETLIST_EXPORTER_GENERIC::makeComponents ( )
protected

Function makeComponents.

Returns
XNODE* - returns a sub-tree holding all the schematic components.

Definition at line 205 of file netlist_exporter_generic.cpp.

References addComponentFields(), UNIQUE_STRINGS::Clear(), NETLIST_EXPORTER::findNextComponent(), g_RootSheet, SCH_COMPONENT::GetLibId(), LIB_ID::GetLibItemName(), SCH_COMPONENT::GetPartRef(), SCH_COMPONENT::GetRef(), EDA_ITEM::GetTimeStamp(), NETLIST_EXPORTER::m_ReferencesAlreadyFound, and node().

Referenced by makeRoot().

206 {
207  XNODE* xcomps = node( "components" );
208 
209  wxString timeStamp;
210 
212 
213  SCH_SHEET_LIST sheetList( g_RootSheet );
214 
215  // Output is xml, so there is no reason to remove spaces from the field values.
216  // And XML element names need not be translated to various languages.
217 
218  for( unsigned i = 0; i < sheetList.size(); i++ )
219  {
220  for( EDA_ITEM* schItem = sheetList[i].LastDrawList(); schItem; schItem = schItem->Next() )
221  {
222  SCH_COMPONENT* comp = findNextComponent( schItem, &sheetList[i] );
223 
224  if( !comp )
225  break; // No component left
226 
227  schItem = comp;
228 
229  XNODE* xcomp; // current component being constructed
230 
231  // Output the component's elements in order of expected access frequency.
232  // This may not always look best, but it will allow faster execution
233  // under XSL processing systems which do sequential searching within
234  // an element.
235 
236  xcomps->AddChild( xcomp = node( "comp" ) );
237  xcomp->AddAttribute( "ref", comp->GetRef( &sheetList[i] ) );
238 
239  addComponentFields( xcomp, comp, &sheetList[i] );
240 
241  XNODE* xlibsource;
242  xcomp->AddChild( xlibsource = node( "libsource" ) );
243 
244  // "logical" library name, which is in anticipation of a better search
245  // algorithm for parts based on "logical_lib.part" and where logical_lib
246  // is merely the library name minus path and extension.
247  PART_SPTR part = comp->GetPartRef().lock();
248 
249  if( part )
250  xlibsource->AddAttribute( "lib", part->GetLibId().GetLibNickname() );
251 
252  // We only want the symbol name, not the full LIB_ID.
253  xlibsource->AddAttribute( "part", comp->GetLibId().GetLibItemName() );
254 
255  XNODE* xsheetpath;
256 
257  xcomp->AddChild( xsheetpath = node( "sheetpath" ) );
258  xsheetpath->AddAttribute( "names", sheetList[i].PathHumanReadable() );
259  xsheetpath->AddAttribute( "tstamps", sheetList[i].Path() );
260 
261  timeStamp.Printf( "%8.8lX", (unsigned long)comp->GetTimeStamp() );
262  xcomp->AddChild( node( "tstamp", timeStamp ) );
263  }
264  }
265 
266  return xcomps;
267 }
Class SCH_SHEET_LIST.
PART_REF & GetPartRef()
UNIQUE_STRINGS m_ReferencesAlreadyFound
Used for "multi parts per package" components, avoids processing a lib component more than once...
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
EDA_ITEM * Next() const
Definition: base_struct.h:233
void Clear()
Function Clear erases the record.
SCH_COMPONENT * findNextComponent(EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
void addComponentFields(XNODE *xcomp, SCH_COMPONENT *comp, SCH_SHEET_PATH *aSheet)
const UTF8 & GetLibItemName() const
Definition: lib_id.h:115
std::shared_ptr< LIB_PART > PART_SPTR
shared pointer to LIB_PART
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
const LIB_ID & GetLibId() const
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:178
timestamp_t GetTimeStamp() const
Definition: base_struct.h:231
XNODE * NETLIST_EXPORTER_GENERIC::makeDesignHeader ( )
protected

Function makeDesignHeader fills out a project "design" header into an XML node.

Returns
XNODE* - the design header

Definition at line 270 of file netlist_exporter_generic.cpp.

References DateAndTime(), g_RootSheet, GetBuildVersion(), TITLE_BLOCK::GetComment1(), TITLE_BLOCK::GetComment2(), TITLE_BLOCK::GetComment3(), TITLE_BLOCK::GetComment4(), TITLE_BLOCK::GetCompany(), TITLE_BLOCK::GetDate(), SCH_SCREEN::GetFileName(), TITLE_BLOCK::GetRevision(), SCH_SHEET::GetScreen(), TITLE_BLOCK::GetTitle(), SCH_SCREEN::GetTitleBlock(), and node().

Referenced by makeRoot().

271 {
272  SCH_SCREEN* screen;
273  XNODE* xdesign = node( "design" );
274  XNODE* xtitleBlock;
275  XNODE* xsheet;
276  XNODE* xcomment;
277  wxString sheetTxt;
278  wxFileName sourceFileName;
279 
280  // the root sheet is a special sheet, call it source
281  xdesign->AddChild( node( "source", g_RootSheet->GetScreen()->GetFileName() ) );
282 
283  xdesign->AddChild( node( "date", DateAndTime() ) );
284 
285  // which Eeschema tool
286  xdesign->AddChild( node( "tool", wxString( "Eeschema " ) + GetBuildVersion() ) );
287 
288  /*
289  Export the sheets information
290  */
291  SCH_SHEET_LIST sheetList( g_RootSheet );
292 
293  for( unsigned i = 0; i < sheetList.size(); i++ )
294  {
295  screen = sheetList[i].LastScreen();
296 
297  xdesign->AddChild( xsheet = node( "sheet" ) );
298 
299  // get the string representation of the sheet index number.
300  // Note that sheet->GetIndex() is zero index base and we need to increment the
301  // number by one to make it human readable
302  sheetTxt.Printf( "%u", i + 1 );
303  xsheet->AddAttribute( "number", sheetTxt );
304  xsheet->AddAttribute( "name", sheetList[i].PathHumanReadable() );
305  xsheet->AddAttribute( "tstamps", sheetList[i].Path() );
306 
307 
308  TITLE_BLOCK tb = screen->GetTitleBlock();
309 
310  xsheet->AddChild( xtitleBlock = node( "title_block" ) );
311 
312  xtitleBlock->AddChild( node( "title", tb.GetTitle() ) );
313  xtitleBlock->AddChild( node( "company", tb.GetCompany() ) );
314  xtitleBlock->AddChild( node( "rev", tb.GetRevision() ) );
315  xtitleBlock->AddChild( node( "date", tb.GetDate() ) );
316 
317  // We are going to remove the fileName directories.
318  sourceFileName = wxFileName( screen->GetFileName() );
319  xtitleBlock->AddChild( node( "source", sourceFileName.GetFullName() ) );
320 
321  xtitleBlock->AddChild( xcomment = node( "comment" ) );
322  xcomment->AddAttribute( "number", "1" );
323  xcomment->AddAttribute( "value", tb.GetComment1() );
324 
325  xtitleBlock->AddChild( xcomment = node( "comment" ) );
326  xcomment->AddAttribute( "number", "2" );
327  xcomment->AddAttribute( "value", tb.GetComment2() );
328 
329  xtitleBlock->AddChild( xcomment = node( "comment" ) );
330  xcomment->AddAttribute( "number", "3" );
331  xcomment->AddAttribute( "value", tb.GetComment3() );
332 
333  xtitleBlock->AddChild( xcomment = node( "comment" ) );
334  xcomment->AddAttribute( "number", "4" );
335  xcomment->AddAttribute( "value", tb.GetComment4() );
336  }
337 
338  return xdesign;
339 }
Class SCH_SHEET_LIST.
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
const wxString & GetCompany() const
const wxString & GetFileName() const
const wxString & GetComment4() const
const wxString & GetDate() const
SCH_SCREEN * GetScreen()
Definition: sch_sheet.h:279
Class TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout, or editing view.
const wxString & GetTitle() const
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
const wxString & GetRevision() const
const wxString & GetComment3() const
const TITLE_BLOCK & GetTitleBlock() const
const wxString & GetComment2() const
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
const wxString & GetComment1() const
wxString DateAndTime()
Function DateAndTime.
Definition: string.cpp:229
XNODE * NETLIST_EXPORTER_GENERIC::makeLibParts ( )
protected

Function makeLibParts fills out an XML node with the unique library parts and returns it.

Returns
XNODE* - the library parts nodes

Definition at line 365 of file netlist_exporter_generic.cpp.

References LIB_PART::GetAlias(), LIB_PART::GetAliasCount(), LIB_PART::GetAliasNames(), LIB_ALIAS::GetDescription(), LIB_ALIAS::GetDocFileName(), LIB_PART::GetFields(), LIB_PART::GetFootprints(), LIB_PART::GetLibId(), LIB_ID::GetLibNickname(), LIB_PART::GetName(), LIB_PART::GetPins(), GetText(), NETLIST_EXPORTER::m_LibParts, m_libraries, node(), and sortPinsByNumber().

Referenced by makeRoot().

366 {
367  XNODE* xlibparts = node( "libparts" ); // auto_ptr
368 
369  LIB_PINS pinList;
370  LIB_FIELDS fieldList;
371 
372  m_libraries.clear();
373 
374  for( std::set<LIB_PART*>::iterator it = m_LibParts.begin(); it!=m_LibParts.end(); ++it )
375  {
376  LIB_PART* lcomp = *it;
377  wxString libNickname = lcomp->GetLibId().GetLibNickname();;
378 
379  // The library nickname will be empty if the cache library is used.
380  if( !libNickname.IsEmpty() )
381  m_libraries.insert( libNickname ); // inserts component's library if unique
382 
383  XNODE* xlibpart;
384  xlibparts->AddChild( xlibpart = node( "libpart" ) );
385  xlibpart->AddAttribute( "lib", libNickname );
386  xlibpart->AddAttribute( "part", lcomp->GetName() );
387 
388  if( lcomp->GetAliasCount() )
389  {
390  wxArrayString aliases = lcomp->GetAliasNames( false );
391  if( aliases.GetCount() )
392  {
393  XNODE* xaliases = node( "aliases" );
394  xlibpart->AddChild( xaliases );
395  for( unsigned i=0; i<aliases.GetCount(); ++i )
396  {
397  xaliases->AddChild( node( "alias", aliases[i] ) );
398  }
399  }
400  }
401 
402  //----- show the important properties -------------------------
403  if( !lcomp->GetAlias( 0 )->GetDescription().IsEmpty() )
404  xlibpart->AddChild( node( "description", lcomp->GetAlias( 0 )->GetDescription() ) );
405 
406  if( !lcomp->GetAlias( 0 )->GetDocFileName().IsEmpty() )
407  xlibpart->AddChild( node( "docs", lcomp->GetAlias( 0 )->GetDocFileName() ) );
408 
409  // Write the footprint list
410  if( lcomp->GetFootprints().GetCount() )
411  {
412  XNODE* xfootprints;
413  xlibpart->AddChild( xfootprints = node( "footprints" ) );
414 
415  for( unsigned i=0; i<lcomp->GetFootprints().GetCount(); ++i )
416  {
417  xfootprints->AddChild( node( "fp", lcomp->GetFootprints()[i] ) );
418  }
419  }
420 
421  //----- show the fields here ----------------------------------
422  fieldList.clear();
423  lcomp->GetFields( fieldList );
424 
425  XNODE* xfields;
426  xlibpart->AddChild( xfields = node( "fields" ) );
427 
428  for( unsigned i=0; i<fieldList.size(); ++i )
429  {
430  if( !fieldList[i].GetText().IsEmpty() )
431  {
432  XNODE* xfield;
433  xfields->AddChild( xfield = node( "field", fieldList[i].GetText() ) );
434  xfield->AddAttribute( "name", fieldList[i].GetName(false) );
435  }
436  }
437 
438  //----- show the pins here ------------------------------------
439  pinList.clear();
440  lcomp->GetPins( pinList, 0, 0 );
441 
442  /* we must erase redundant Pins references in pinList
443  * These redundant pins exist because some pins
444  * are found more than one time when a component has
445  * multiple parts per package or has 2 representations (DeMorgan conversion)
446  * For instance, a 74ls00 has DeMorgan conversion, with different pin shapes,
447  * and therefore each pin appears 2 times in the list.
448  * Common pins (VCC, GND) can also be found more than once.
449  */
450  sort( pinList.begin(), pinList.end(), sortPinsByNumber );
451  for( int ii = 0; ii < (int)pinList.size()-1; ii++ )
452  {
453  if( pinList[ii]->GetNumber() == pinList[ii+1]->GetNumber() )
454  { // 2 pins have the same number, remove the redundant pin at index i+1
455  pinList.erase(pinList.begin() + ii + 1);
456  ii--;
457  }
458  }
459 
460  if( pinList.size() )
461  {
462  XNODE* pins;
463 
464  xlibpart->AddChild( pins = node( "pins" ) );
465  for( unsigned i=0; i<pinList.size(); ++i )
466  {
467  XNODE* pin;
468 
469  pins->AddChild( pin = node( "pin" ) );
470  pin->AddAttribute( "num", pinList[i]->GetNumber() );
471  pin->AddAttribute( "name", pinList[i]->GetName() );
472  pin->AddAttribute( "type", pinList[i]->GetCanonicalElectricalTypeName() );
473 
474  // caution: construction work site here, drive slowly
475  }
476  }
477  }
478 
479  return xlibparts;
480 }
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
LIB_ALIAS * GetAlias(size_t aIndex)
const LIB_ID & GetLibId() const
size_t GetAliasCount() const
void GetPins(LIB_PINS &aList, int aUnit=0, int aConvert=0)
Return a list of pin object pointers from the draw item list.
std::set< LIB_PART *, LIB_PART_LESS_THAN > m_LibParts
unique library parts used. LIB_PART items are sorted by names
std::set< wxString > m_libraries
Set of library nicknames.
const wxString & GetName() const
wxString GetDescription() const
Define a library symbol object.
wxString GetText(GRAPHIC_PINSHAPE shape)
Definition: pin_shape.cpp:33
wxArrayString & GetFootprints()
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
wxString GetDocFileName() const
std::vector< LIB_PIN * > LIB_PINS
Helper for defining a list of pin object pointers.
Definition: lib_draw_item.h:60
std::vector< LIB_FIELD > LIB_FIELDS
Definition: lib_field.h:252
wxArrayString GetAliasNames(bool aIncludeRoot=true) const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:98
static bool sortPinsByNumber(LIB_PIN *aPin1, LIB_PIN *aPin2)
void GetFields(LIB_FIELDS &aList)
Return a list of fields withing this part.
XNODE * NETLIST_EXPORTER_GENERIC::makeLibraries ( )
protected

Function makeLibraries fills out an XML node with a list of used libraries and returns it.

Must have called makeGenericLibParts() before this function.

Returns
XNODE* - the library nodes

Definition at line 342 of file netlist_exporter_generic.cpp.

References LIB_TABLE::GetFullURI(), LIB_TABLE::HasLibrary(), m_libraries, m_libTable, and node().

Referenced by makeRoot().

343 {
344  XNODE* xlibs = node( "libraries" ); // auto_ptr
345 
346  for( std::set<wxString>::iterator it = m_libraries.begin(); it!=m_libraries.end(); ++it )
347  {
348  wxString libNickname = *it;
349  XNODE* xlibrary;
350 
351  if( m_libTable->HasLibrary( libNickname ) )
352  {
353  xlibs->AddChild( xlibrary = node( "library" ) );
354  xlibrary->AddAttribute( "logical", libNickname );
355  xlibrary->AddChild( node( "uri", m_libTable->GetFullURI( libNickname ) ) );
356  }
357 
358  // @todo: add more fun stuff here
359  }
360 
361  return xlibs;
362 }
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
std::set< wxString > m_libraries
Set of library nicknames.
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
wxString GetFullURI(const wxString &aLibNickname, bool aExpandEnvVars=true) const
Return the full URI of the library mapped to aLibNickname.
bool HasLibrary(const wxString &aNickname) const
Test for the existence of aNickname in the library table.
XNODE * NETLIST_EXPORTER_GENERIC::makeListOfNets ( )
protected

Function makeListOfNets fills out an XML node with a list of nets and returns it.

Returns
XNODE* - the list of nets nodes

Definition at line 483 of file netlist_exporter_generic.cpp.

References NETLIST_OBJECT::GetComponentParent(), NETLIST_OBJECT_LIST::GetItem(), NETLIST_OBJECT::GetNet(), NETLIST_OBJECT::GetNetName(), NETLIST_OBJECT::GetPinNumText(), SCH_COMPONENT::GetRef(), NETLIST_OBJECT::m_Flag, NETLIST_EXPORTER::m_LibParts, NETLIST_EXPORTER::m_masterList, NETLIST_OBJECT::m_SheetPath, NETLIST_OBJECT::m_Type, NET_PIN, and node().

Referenced by makeRoot().

484 {
485  XNODE* xnets = node( "nets" ); // auto_ptr if exceptions ever get used.
486  wxString netCodeTxt;
487  wxString netName;
488  wxString ref;
489 
490  XNODE* xnet = 0;
491  int netCode;
492  int lastNetCode = -1;
493  int sameNetcodeCount = 0;
494 
495 
496  /* output:
497  <net code="123" name="/cfcard.sch/WAIT#">
498  <node ref="R23" pin="1"/>
499  <node ref="U18" pin="12"/>
500  </net>
501  */
502 
503  m_LibParts.clear(); // must call this function before using m_LibParts.
504 
505  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
506  {
507  NETLIST_OBJECT* nitem = m_masterList->GetItem( ii );
508  SCH_COMPONENT* comp;
509 
510  // New net found, write net id;
511  if( ( netCode = nitem->GetNet() ) != lastNetCode )
512  {
513  sameNetcodeCount = 0; // item count for this net
514  netName = nitem->GetNetName();
515  lastNetCode = netCode;
516  }
517 
518  if( nitem->m_Type != NET_PIN )
519  continue;
520 
521  if( nitem->m_Flag != 0 ) // Redundant pin, skip it
522  continue;
523 
524  comp = nitem->GetComponentParent();
525 
526  // Get the reference for the net name and the main parent component
527  ref = comp->GetRef( &nitem->m_SheetPath );
528  if( ref[0] == wxChar( '#' ) )
529  continue;
530 
531  if( ++sameNetcodeCount == 1 )
532  {
533  xnets->AddChild( xnet = node( "net" ) );
534  netCodeTxt.Printf( "%d", netCode );
535  xnet->AddAttribute( "code", netCodeTxt );
536  xnet->AddAttribute( "name", netName );
537  }
538 
539  XNODE* xnode;
540  xnet->AddChild( xnode = node( "node" ) );
541  xnode->AddAttribute( "ref", ref );
542  xnode->AddAttribute( "pin", nitem->GetPinNumText() );
543  }
544 
545  return xnets;
546 }
wxString GetNetName(bool adoptTimestamp=false) const
Function GetNetName.
const wxString & GetPinNumText() const
Function GetPinNum returns a pin number in wxString form.
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in list.
SCH_SHEET_PATH m_SheetPath
NETLIST_ITEM_T m_Type
NETLIST_OBJECT_LIST * m_masterList
std::set< LIB_PART *, LIB_PART_LESS_THAN > m_LibParts
unique library parts used. LIB_PART items are sorted by names
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
SCH_COMPONENT * GetComponentParent() const
For Pins (NET_PINS):
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
XNODE * NETLIST_EXPORTER_GENERIC::makeRoot ( int  aCtl = GNL_ALL)
protected

Function makeGenericRoot builds the entire document tree for the generic export.

This is factored out here so we can write the tree in either S-expression file format or in XML if we put the tree built here into a wxXmlDocument.

Parameters
aCtl- a bitset or-ed together from GNL_ENUM values
Returns
XNODE* - the root nodes

Definition at line 52 of file netlist_exporter_generic.cpp.

References GNL_COMPONENTS, GNL_HEADER, GNL_LIBRARIES, GNL_NETS, GNL_PARTS, makeComponents(), makeDesignHeader(), makeLibParts(), makeLibraries(), makeListOfNets(), and node().

Referenced by NETLIST_EXPORTER_KICAD::Format(), and WriteNetlist().

53 {
54  XNODE* xroot = node( "export" );
55 
56  xroot->AddAttribute( "version", "D" );
57 
58  if( aCtl & GNL_HEADER )
59  // add the "design" header
60  xroot->AddChild( makeDesignHeader() );
61 
62  if( aCtl & GNL_COMPONENTS )
63  xroot->AddChild( makeComponents() );
64 
65  if( aCtl & GNL_PARTS )
66  xroot->AddChild( makeLibParts() );
67 
68  if( aCtl & GNL_LIBRARIES )
69  // must follow makeGenericLibParts()
70  xroot->AddChild( makeLibraries() );
71 
72  if( aCtl & GNL_NETS )
73  xroot->AddChild( makeListOfNets() );
74 
75  return xroot;
76 }
XNODE * makeComponents()
Function makeComponents.
XNODE * node(const wxString &aName, const wxString &aTextualContent=wxEmptyString)
Function node is a convenience function that creates a new XNODE with an optional textual child...
XNODE * makeDesignHeader()
Function makeDesignHeader fills out a project "design" header into an XML node.
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
XNODE * makeLibraries()
Function makeLibraries fills out an XML node with a list of used libraries and returns it...
XNODE * makeListOfNets()
Function makeListOfNets fills out an XML node with a list of nets and returns it. ...
XNODE * makeLibParts()
Function makeLibParts fills out an XML node with the unique library parts and returns it...
XNODE * NETLIST_EXPORTER_GENERIC::node ( const wxString &  aName,
const wxString &  aTextualContent = wxEmptyString 
)
protected

Function node is a convenience function that creates a new XNODE with an optional textual child.

It also provides some insulation from a possible change in XML library.

Parameters
aNameis the name to associate with a new node of type wxXML_ELEMENT_NODE.
aTextualContentis optional, and if given is the text to include in a child of the returned node, and has type wxXML_TEXT_NODE.

Definition at line 549 of file netlist_exporter_generic.cpp.

Referenced by addComponentFields(), makeComponents(), makeDesignHeader(), makeLibParts(), makeLibraries(), makeListOfNets(), and makeRoot().

550 {
551  XNODE* n = new XNODE( wxXML_ELEMENT_NODE, aName );
552 
553  if( aTextualContent.Len() > 0 ) // excludes wxEmptyString, the parameter's default value
554  n->AddChild( new XNODE( wxXML_TEXT_NODE, wxEmptyString, aTextualContent ) );
555 
556  return n;
557 }
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
void NETLIST_EXPORTER::sprintPinNetName ( wxString &  aResult,
const wxString &  aNetNameFormat,
NETLIST_OBJECT aPin,
bool  aUseNetcodeAsNetName = false 
)
staticprotectedinherited

Function sprintPinNetName formats the net name for aPin using aNetNameFormat into aResult.

Net name is:

  • "?" if pin not connected
  • "netname" for global net (like gnd, vcc ..
  • "/path/netname" for the usual nets

if aUseNetcodeAsNetName is true, the net name is just the net code (SPICE only)

Definition at line 84 of file netlist_exporter.cpp.

References NETLIST_OBJECT::GetConnectionType(), NETLIST_OBJECT::GetNet(), NETLIST_OBJECT::GetNetName(), and PAD_CONNECT.

Referenced by NETLIST_EXPORTER_PSPICE::Format(), and NETLIST_EXPORTER_ORCADPCB2::WriteNetlist().

87 {
88  int netcode = aPin->GetNet();
89 
90  // Not wxString::Clear(), which would free memory. We want the worst
91  // case wxString memory to grow to avoid reallocation from within the
92  // caller's loop.
93  aResult.Empty();
94 
95  if( netcode != 0 && aPin->GetConnectionType() == PAD_CONNECT )
96  {
97  if( aUseNetcodeAsNetName )
98  {
99  aResult.Printf( "%d", netcode );
100  }
101  else
102  {
103  aResult = aPin->GetNetName();
104 
105  if( aResult.IsEmpty() ) // No net name: give a name from net code
106  aResult.Printf( aNetNameFormat.GetData(), netcode );
107  }
108  }
109 }
NET_CONNECTION_T GetConnectionType() const
wxString GetNetName(bool adoptTimestamp=false) const
Function GetNetName.
bool NETLIST_EXPORTER_GENERIC::WriteNetlist ( const wxString &  aOutFileName,
unsigned  aNetlistOptions 
)
overridevirtual

Function WriteNetlist writes to specified output file.

Reimplemented from NETLIST_EXPORTER.

Reimplemented in NETLIST_EXPORTER_KICAD.

Definition at line 37 of file netlist_exporter_generic.cpp.

References NETLIST_OBJECT_LIST::GetItem(), GNL_ALL, NETLIST_OBJECT::m_Flag, NETLIST_EXPORTER::m_masterList, and makeRoot().

38 {
39  // Prepare list of nets generation
40  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
41  m_masterList->GetItem( ii )->m_Flag = 0;
42 
43  // output the XML format netlist.
44  wxXmlDocument xdoc;
45 
46  xdoc.SetRoot( makeRoot( GNL_ALL ) );
47 
48  return xdoc.Save( aOutFileName, 2 /* indent bug, today was ignored by wxXml lib */ );
49 }
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in list.
NETLIST_OBJECT_LIST * m_masterList
XNODE * makeRoot(int aCtl=GNL_ALL)
Function makeGenericRoot builds the entire document tree for the generic export.
#define GNL_ALL

Member Data Documentation

std::set<LIB_PART*, LIB_PART_LESS_THAN> NETLIST_EXPORTER::m_LibParts
protectedinherited

unique library parts used. LIB_PART items are sorted by names

Definition at line 102 of file netlist_exporter.h.

Referenced by NETLIST_EXPORTER::findNextComponent(), NETLIST_EXPORTER::findNextComponentAndCreatePinList(), makeLibParts(), and makeListOfNets().

std::set< wxString > NETLIST_EXPORTER_GENERIC::m_libraries
private

Set of library nicknames.

Definition at line 59 of file netlist_exporter_generic.h.

Referenced by makeLibParts(), and makeLibraries().

SYMBOL_LIB_TABLE* NETLIST_EXPORTER_GENERIC::m_libTable
private

Definition at line 61 of file netlist_exporter_generic.h.

Referenced by makeLibraries().

UNIQUE_STRINGS NETLIST_EXPORTER::m_ReferencesAlreadyFound
protectedinherited
NETLIST_OBJECTS NETLIST_EXPORTER::m_SortedComponentPinList
protectedinherited

yes ownership, connected items flat list

Used to temporarily store and filter the list of pins of a schematic component when generating schematic component data in netlist (comp section). No ownership of members.

Definition at line 95 of file netlist_exporter.h.

Referenced by NETLIST_EXPORTER::addPinToComponentPinList(), NETLIST_EXPORTER::eraseDuplicatePins(), NETLIST_EXPORTER::findNextComponentAndCreatePinList(), NETLIST_EXPORTER_PSPICE::ProcessNetlist(), NETLIST_EXPORTER_ORCADPCB2::WriteNetlist(), and NETLIST_EXPORTER_CADSTAR::WriteNetlist().


The documentation for this class was generated from the following files: