KiCad PCB EDA Suite
NETLIST_EXPORTER_KICAD Class Reference

Class NETLIST_EXPORTER_KICAD generates the kicad netlist format supported by pcbnew. More...

#include <netlist_exporter_kicad.h>

Inheritance diagram for NETLIST_EXPORTER_KICAD:
NETLIST_EXPORTER_GENERIC NETLIST_EXPORTER

Public Member Functions

 NETLIST_EXPORTER_KICAD (SCH_EDIT_FRAME *aFrame, NETLIST_OBJECT_LIST *aMasterList)
 
bool WriteNetlist (const wxString &aOutFileName, unsigned aNetlistOptions) override
 Function WriteNetlist writes to specified output file. More...
 
void Format (OUTPUTFORMATTER *aOutputFormatter, int aCtl)
 Function Format outputs this s-expression netlist into aOutputFormatter. 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...
 

Detailed Description

Class NETLIST_EXPORTER_KICAD generates the kicad netlist format supported by pcbnew.

It is basically the generic netlist format just formatted slightly different.

Definition at line 38 of file netlist_exporter_kicad.h.

Constructor & Destructor Documentation

NETLIST_EXPORTER_KICAD::NETLIST_EXPORTER_KICAD ( SCH_EDIT_FRAME aFrame,
NETLIST_OBJECT_LIST aMasterList 
)
inline

Definition at line 41 of file netlist_exporter_kicad.h.

References Format(), and WriteNetlist().

41  :
42  NETLIST_EXPORTER_GENERIC( aFrame, aMasterList )
43  {}
NETLIST_EXPORTER_GENERIC(SCH_EDIT_FRAME *aFrame, NETLIST_OBJECT_LIST *aMasterList)

Member Function Documentation

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

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::GetUnit(), SCH_COMPONENT::GetUnitCount(), i, SCH_FIELD::IsVoid(), MANDATORY_FIELDS, min, NETLIST_EXPORTER_GENERIC::node(), SCH_COMPONENT_T, VALUE, and COMP_FIELDS::value.

Referenced by NETLIST_EXPORTER_GENERIC::makeComponents().

91 {
92  COMP_FIELDS fields;
93 
94  if( comp->GetUnitCount() > 1 )
95  {
96  // Sadly, each unit of a component can have its own unique fields. This
97  // block finds the unit with the lowest number having a non blank field
98  // value and records it. Therefore user is best off setting fields
99  // into only the first unit. But this scavenger algorithm will find
100  // any non blank fields in all units and use the first non-blank field
101  // for each unique field name.
102 
103  wxString ref = comp->GetRef( aSheet );
104 
105  SCH_SHEET_LIST sheetList( g_RootSheet );
106  int minUnit = comp->GetUnit();
107 
108  for( unsigned i = 0; i < sheetList.size(); i++ )
109  {
110  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
111  {
112  if( item->Type() != SCH_COMPONENT_T )
113  continue;
114 
115  SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
116 
117  wxString ref2 = comp2->GetRef( &sheetList[i] );
118 
119  if( ref2.CmpNoCase( ref ) != 0 )
120  continue;
121 
122  int unit = comp2->GetUnit();
123 
124  // The lowest unit number wins. User should only set fields in any one unit.
125  // remark: IsVoid() returns true for empty strings or the "~" string (empty field value)
126  if( !comp2->GetField( VALUE )->IsVoid()
127  && ( unit < minUnit || fields.value.IsEmpty() ) )
128  fields.value = comp2->GetField( VALUE )->GetText();
129 
130  if( !comp2->GetField( FOOTPRINT )->IsVoid()
131  && ( unit < minUnit || fields.footprint.IsEmpty() ) )
132  fields.footprint = comp2->GetField( FOOTPRINT )->GetText();
133 
134  if( !comp2->GetField( DATASHEET )->IsVoid()
135  && ( unit < minUnit || fields.datasheet.IsEmpty() ) )
136  fields.datasheet = comp2->GetField( DATASHEET )->GetText();
137 
138  for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp2->GetFieldCount(); ++fldNdx )
139  {
140  SCH_FIELD* f = comp2->GetField( fldNdx );
141 
142  if( f->GetText().size()
143  && ( unit < minUnit || fields.f.count( f->GetName() ) == 0 ) )
144  {
145  fields.f[ f->GetName() ] = f->GetText();
146  }
147  }
148 
149  minUnit = std::min( unit, minUnit );
150  }
151  }
152 
153  }
154  else
155  {
156  fields.value = comp->GetField( VALUE )->GetText();
157  fields.footprint = comp->GetField( FOOTPRINT )->GetText();
158  fields.datasheet = comp->GetField( DATASHEET )->GetText();
159 
160  for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp->GetFieldCount(); ++fldNdx )
161  {
162  SCH_FIELD* f = comp->GetField( fldNdx );
163 
164  if( f->GetText().size() )
165  fields.f[ f->GetName() ] = f->GetText();
166  }
167  }
168 
169  // Do not output field values blank in netlist:
170  if( fields.value.size() )
171  xcomp->AddChild( node( "value", fields.value ) );
172  else // value field always written in netlist
173  xcomp->AddChild( node( "value", "~" ) );
174 
175  if( fields.footprint.size() )
176  xcomp->AddChild( node( "footprint", fields.footprint ) );
177 
178  if( fields.datasheet.size() )
179  xcomp->AddChild( node( "datasheet", fields.datasheet ) );
180 
181  if( fields.f.size() )
182  {
183  XNODE* xfields;
184  xcomp->AddChild( xfields = node( "fields" ) );
185 
186  // non MANDATORY fields are output alphabetically
187  for( std::map< wxString, wxString >::const_iterator it = fields.f.begin();
188  it != fields.f.end(); ++it )
189  {
190  XNODE* xfield;
191  xfields->AddChild( xfield = node( "field", it->second ) );
192  xfield->AddAttribute( "name", it->first );
193  }
194  }
195 
196 }
Class SCH_SHEET_LIST.
Class SCH_FIELD instances are attached to a component and provide a place for the component&#39;s value...
Definition: sch_field.h:56
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:435
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:209
Field Name Module PCB, i.e. "16DIP300".
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:56
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:143
Holder for multi-unit component fields.
int GetUnit() const
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.
size_t i
Definition: json11.cpp:597
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:154
std::map< wxString, wxString > f
#define VALUE
#define min(a, b)
Definition: auxiliary.h:85
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 244 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().

246 {
247  // Search the PIN description for Pin in g_NetObjectslist
248  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
249  {
250  NETLIST_OBJECT* pin = m_masterList->GetItem( ii );
251 
252  if( pin->m_Type != NET_PIN )
253  continue;
254 
255  if( pin->m_Link != aComponent )
256  continue;
257 
258  if( pin->m_PinNum != aPin->GetNumber() )
259  continue;
260 
261  // most expensive test at the end.
262  if( pin->m_SheetPath != *aSheetPath )
263  continue;
264 
265  m_SortedComponentPinList.push_back( pin );
266 
267  if( m_SortedComponentPinList.size() >= MAXPIN )
268  {
269  // Log message for Internal error
270  DisplayError( NULL, wxT( "addPinToComponentPinList err: MAXPIN reached" ) );
271  }
272 
273  return true; // we're done, we appended.
274  }
275 
276  return false;
277 }
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
SCH_ITEM * m_Link
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:245
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 280 of file netlist_exporter.cpp.

References NETLIST_EXPORTER::m_SortedComponentPinList, and PAD_CONNECT.

Referenced by NETLIST_EXPORTER::findNextComponentAndCreatePinList().

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

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

Referenced by NETLIST_EXPORTER::findNextComponentAndCreatePinList().

333 {
334  wxString ref = aComponent->GetRef( aSheetPath );
335  wxString ref2;
336 
337  SCH_SHEET_LIST sheetList( g_RootSheet );
338 
339  for( unsigned i = 0; i < sheetList.size(); i++ )
340  {
341  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
342  {
343  if( item->Type() != SCH_COMPONENT_T )
344  continue;
345 
346  SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
347 
348  ref2 = comp2->GetRef( &sheetList[i] );
349 
350  if( ref2.CmpNoCase( ref ) != 0 )
351  continue;
352 
353  int unit2 = comp2->GetUnitSelection( &sheetList[i] ); // slow
354 
355  for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) )
356  {
357  wxASSERT( pin->Type() == LIB_PIN_T );
358 
359  if( pin->GetUnit() && pin->GetUnit() != unit2 )
360  continue;
361 
362  if( pin->GetConvert() && pin->GetConvert() != comp2->GetConvert() )
363  continue;
364 
365  // A suitable pin is found: add it to the current list
366  addPinToComponentPinList( comp2, &sheetList[i], pin );
367  }
368  }
369  }
370 }
Class SCH_SHEET_LIST.
int GetUnitSelection(SCH_SHEET_PATH *aSheet)
EDA_ITEM * Next() const
Definition: base_struct.h:209
int GetConvert() const
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:56
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.
size_t i
Definition: json11.cpp:597
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:154
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 107 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 NETLIST_EXPORTER_GENERIC::makeComponents().

108 {
109  wxString ref;
110 
111  // continue searching from the middle of a linked list (the draw list)
112  for( ; aItem; aItem = aItem->Next() )
113  {
114  if( aItem->Type() != SCH_COMPONENT_T )
115  continue;
116 
117  // found next component
118  SCH_COMPONENT* comp = (SCH_COMPONENT*) aItem;
119 
120  // Power symbols and other components which have the reference starting
121  // with "#" are not included in netlist (pseudo or virtual components)
122  ref = comp->GetRef( aSheetPath );
123 
124  if( ref[0] == wxChar( '#' ) )
125  continue;
126 
127  // if( Component->m_FlagControlMulti == 1 )
128  // continue; /* yes */
129  // removed because with multiple instances of one schematic
130  // (several sheets pointing to 1 screen), this will be erroneously be
131  // toggled.
132 
133  LIB_PART* part = comp->GetPartRef().lock().get();
134 
135  if( !part )
136  continue;
137 
138  // If component is a "multi parts per package" type
139  if( part->GetUnitCount() > 1 )
140  {
141  // test if this reference has already been processed, and if so skip
142  if( m_ReferencesAlreadyFound.Lookup( ref ) )
143  continue;
144  }
145 
146  // record the usage of this library component entry.
147  m_LibParts.insert( part ); // rejects non-unique pointers
148 
149  return comp;
150  }
151 
152  return NULL;
153 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
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:209
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 164 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(), i, LIB_PIN_T, UNIQUE_STRINGS::Lookup(), NETLIST_EXPORTER::m_LibParts, NETLIST_EXPORTER::m_ReferencesAlreadyFound, NETLIST_EXPORTER::m_SortedComponentPinList, EDA_ITEM::Next(), SCH_COMPONENT_T, sortPinsByNum(), and EDA_ITEM::Type().

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

166 {
167  wxString ref;
168 
169  m_SortedComponentPinList.clear();
170 
171  // continue searching from the middle of a linked list (the draw list)
172  for( ; aItem; aItem = aItem->Next() )
173  {
174  if( aItem->Type() != SCH_COMPONENT_T )
175  continue;
176 
177  // found next component
178  SCH_COMPONENT* comp = (SCH_COMPONENT*) aItem;
179 
180  // Power symbols and other components which have the reference starting
181  // with "#" are not included in netlist (pseudo or virtual components)
182  ref = comp->GetRef( aSheetPath );
183 
184  if( ref[0] == wxChar( '#' ) )
185  continue;
186 
187  // if( Component->m_FlagControlMulti == 1 )
188  // continue; /* yes */
189  // removed because with multiple instances of one schematic
190  // (several sheets pointing to 1 screen), this will be erroneously be
191  // toggled.
192 
193  LIB_PART* part = comp->GetPartRef().lock().get();
194 
195  if( !part )
196  continue;
197 
198  // If component is a "multi parts per package" type
199  if( part->GetUnitCount() > 1 )
200  {
201  // test if this reference has already been processed, and if so skip
202  if( m_ReferencesAlreadyFound.Lookup( ref ) )
203  continue;
204 
205  // Collect all pins for this reference designator by searching
206  // the entire design for other parts with the same reference designator.
207  // This is only done once, it would be too expensive otherwise.
208  findAllUnitsOfComponent( comp, part, aSheetPath );
209  }
210 
211  else // entry->GetUnitCount() <= 1 means one part per package
212  {
213  LIB_PINS pins; // constructed once here
214 
215  part->GetPins( pins, comp->GetUnitSelection( aSheetPath ), comp->GetConvert() );
216 
217  for( size_t i = 0; i < pins.size(); i++ )
218  {
219  LIB_PIN* pin = pins[i];
220 
221  wxASSERT( pin->Type() == LIB_PIN_T );
222 
223  addPinToComponentPinList( comp, aSheetPath, pin );
224  }
225  }
226 
227  // Sort pins in m_SortedComponentPinList by pin number
228  sort( m_SortedComponentPinList.begin(),
230 
231  // Remove duplicate Pins in m_SortedComponentPinList
233 
234  // record the usage of this library component entry.
235  m_LibParts.insert( part ); // rejects non-unique pointers
236 
237  return comp;
238  }
239 
240  return NULL;
241 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
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:209
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:61
size_t i
Definition: json11.cpp:597
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.
void NETLIST_EXPORTER_KICAD::Format ( OUTPUTFORMATTER aOutputFormatter,
int  aCtl 
)

Function Format outputs this s-expression netlist into aOutputFormatter.

Parameters
aOutputFormatteris the destination of the serialization to text.
aCtlis bit set composed by OR-ing together enum GNL bits, it allows ouputting a subset of the full document model.
Exceptions
IO_ERRORif any problems.

Definition at line 52 of file netlist_exporter_kicad.cpp.

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

Referenced by SCH_EDIT_FRAME::doUpdatePcb(), NETLIST_EXPORTER_KICAD(), SCH_EDIT_FRAME::sendNetlist(), and WriteNetlist().

53 {
54  // Prepare list of nets generation
55  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
56  m_masterList->GetItem( ii )->m_Flag = 0;
57 
58  std::unique_ptr<XNODE> xroot( makeRoot( aCtl ) );
59 
60  xroot->Format( aOut, 0 );
61 }
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.
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 45 of file netlist_exporter.cpp.

Referenced by SCH_EDIT_FRAME::WriteNetListFile().

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

Function makeComponents.

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

Definition at line 199 of file netlist_exporter_generic.cpp.

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

Referenced by NETLIST_EXPORTER_GENERIC::makeRoot().

200 {
201  XNODE* xcomps = node( "components" );
202 
203  wxString timeStamp;
204 
206 
207  SCH_SHEET_LIST sheetList( g_RootSheet );
208 
209  // Output is xml, so there is no reason to remove spaces from the field values.
210  // And XML element names need not be translated to various languages.
211 
212  for( unsigned i = 0; i < sheetList.size(); i++ )
213  {
214  for( EDA_ITEM* schItem = sheetList[i].LastDrawList(); schItem; schItem = schItem->Next() )
215  {
216  SCH_COMPONENT* comp = findNextComponent( schItem, &sheetList[i] );
217 
218  if( !comp )
219  break; // No component left
220 
221  schItem = comp;
222 
223  XNODE* xcomp; // current component being constructed
224 
225  // Output the component's elements in order of expected access frequency.
226  // This may not always look best, but it will allow faster execution
227  // under XSL processing systems which do sequential searching within
228  // an element.
229 
230  xcomps->AddChild( xcomp = node( "comp" ) );
231  xcomp->AddAttribute( "ref", comp->GetRef( &sheetList[i] ) );
232 
233  addComponentFields( xcomp, comp, &sheetList[i] );
234 
235  XNODE* xlibsource;
236  xcomp->AddChild( xlibsource = node( "libsource" ) );
237 
238  // "logical" library name, which is in anticipation of a better search
239  // algorithm for parts based on "logical_lib.part" and where logical_lib
240  // is merely the library name minus path and extension.
241  PART_SPTR part = comp->GetPartRef().lock();
242 
243  if( part )
244  xlibsource->AddAttribute( "lib", part->GetLibId().GetLibNickname() );
245 
246  // We only want the symbol name, not the full LIB_ID.
247  xlibsource->AddAttribute( "part", comp->GetLibId().GetLibItemName() );
248 
249  xlibsource->AddAttribute( "description", comp->GetAliasDescription() );
250 
251  XNODE* xsheetpath;
252 
253  xcomp->AddChild( xsheetpath = node( "sheetpath" ) );
254  xsheetpath->AddAttribute( "names", sheetList[i].PathHumanReadable() );
255  xsheetpath->AddAttribute( "tstamps", sheetList[i].Path() );
256 
257  timeStamp.Printf( "%8.8lX", (unsigned long)comp->GetTimeStamp() );
258  xcomp->AddChild( node( "tstamp", timeStamp ) );
259  }
260  }
261 
262  return xcomps;
263 }
Class SCH_SHEET_LIST.
wxString GetAliasDescription() const
Return information about the aliased parts.
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:209
void Clear()
Function Clear erases the record.
SCH_COMPONENT * findNextComponent(EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:56
void addComponentFields(XNODE *xcomp, SCH_COMPONENT *comp, SCH_SHEET_PATH *aSheet)
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
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
size_t i
Definition: json11.cpp:597
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:154
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
XNODE * NETLIST_EXPORTER_GENERIC::makeDesignHeader ( )
protectedinherited

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

Returns
XNODE* - the design header

Definition at line 266 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(), i, and NETLIST_EXPORTER_GENERIC::node().

Referenced by NETLIST_EXPORTER_GENERIC::makeRoot().

267 {
268  SCH_SCREEN* screen;
269  XNODE* xdesign = node( "design" );
270  XNODE* xtitleBlock;
271  XNODE* xsheet;
272  XNODE* xcomment;
273  wxString sheetTxt;
274  wxFileName sourceFileName;
275 
276  // the root sheet is a special sheet, call it source
277  xdesign->AddChild( node( "source", g_RootSheet->GetScreen()->GetFileName() ) );
278 
279  xdesign->AddChild( node( "date", DateAndTime() ) );
280 
281  // which Eeschema tool
282  xdesign->AddChild( node( "tool", wxString( "Eeschema " ) + GetBuildVersion() ) );
283 
284  /*
285  Export the sheets information
286  */
287  SCH_SHEET_LIST sheetList( g_RootSheet );
288 
289  for( unsigned i = 0; i < sheetList.size(); i++ )
290  {
291  screen = sheetList[i].LastScreen();
292 
293  xdesign->AddChild( xsheet = node( "sheet" ) );
294 
295  // get the string representation of the sheet index number.
296  // Note that sheet->GetIndex() is zero index base and we need to increment the
297  // number by one to make it human readable
298  sheetTxt.Printf( "%u", i + 1 );
299  xsheet->AddAttribute( "number", sheetTxt );
300  xsheet->AddAttribute( "name", sheetList[i].PathHumanReadable() );
301  xsheet->AddAttribute( "tstamps", sheetList[i].Path() );
302 
303 
304  TITLE_BLOCK tb = screen->GetTitleBlock();
305 
306  xsheet->AddChild( xtitleBlock = node( "title_block" ) );
307 
308  xtitleBlock->AddChild( node( "title", tb.GetTitle() ) );
309  xtitleBlock->AddChild( node( "company", tb.GetCompany() ) );
310  xtitleBlock->AddChild( node( "rev", tb.GetRevision() ) );
311  xtitleBlock->AddChild( node( "date", tb.GetDate() ) );
312 
313  // We are going to remove the fileName directories.
314  sourceFileName = wxFileName( screen->GetFileName() );
315  xtitleBlock->AddChild( node( "source", sourceFileName.GetFullName() ) );
316 
317  xtitleBlock->AddChild( xcomment = node( "comment" ) );
318  xcomment->AddAttribute( "number", "1" );
319  xcomment->AddAttribute( "value", tb.GetComment1() );
320 
321  xtitleBlock->AddChild( xcomment = node( "comment" ) );
322  xcomment->AddAttribute( "number", "2" );
323  xcomment->AddAttribute( "value", tb.GetComment2() );
324 
325  xtitleBlock->AddChild( xcomment = node( "comment" ) );
326  xcomment->AddAttribute( "number", "3" );
327  xcomment->AddAttribute( "value", tb.GetComment3() );
328 
329  xtitleBlock->AddChild( xcomment = node( "comment" ) );
330  xcomment->AddAttribute( "number", "4" );
331  xcomment->AddAttribute( "value", tb.GetComment4() );
332  }
333 
334  return xdesign;
335 }
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
Definition: title_block.h:99
const wxString & GetFileName() const
Definition: sch_screen.h:131
const wxString & GetComment4() const
Definition: title_block.h:124
const wxString & GetDate() const
Definition: title_block.h:79
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.
Definition: title_block.h:40
const wxString & GetTitle() const
Definition: title_block.h:65
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:56
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
const wxString & GetRevision() const
Definition: title_block.h:89
const wxString & GetComment3() const
Definition: title_block.h:123
const TITLE_BLOCK & GetTitleBlock() const
Definition: sch_screen.h:136
const wxString & GetComment2() const
Definition: title_block.h:122
Class XNODE holds an XML or S-expression element.
Definition: xnode.h:43
const wxString & GetComment1() const
Definition: title_block.h:121
size_t i
Definition: json11.cpp:597
wxString DateAndTime()
Function DateAndTime.
Definition: string.cpp:306
XNODE * NETLIST_EXPORTER_GENERIC::makeLibParts ( )
protectedinherited

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

Returns
XNODE* - the library parts nodes

Definition at line 361 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(), i, NETLIST_EXPORTER::m_LibParts, NETLIST_EXPORTER_GENERIC::m_libraries, NETLIST_EXPORTER_GENERIC::node(), and sortPinsByNumber().

Referenced by NETLIST_EXPORTER_GENERIC::makeRoot().

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

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 338 of file netlist_exporter_generic.cpp.

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

Referenced by NETLIST_EXPORTER_GENERIC::makeRoot().

339 {
340  XNODE* xlibs = node( "libraries" ); // auto_ptr
341 
342  for( std::set<wxString>::iterator it = m_libraries.begin(); it!=m_libraries.end(); ++it )
343  {
344  wxString libNickname = *it;
345  XNODE* xlibrary;
346 
347  if( m_libTable->HasLibrary( libNickname ) )
348  {
349  xlibs->AddChild( xlibrary = node( "library" ) );
350  xlibrary->AddAttribute( "logical", libNickname );
351  xlibrary->AddChild( node( "uri", m_libTable->GetFullURI( libNickname ) ) );
352  }
353 
354  // @todo: add more fun stuff here
355  }
356 
357  return xlibs;
358 }
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.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
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.
XNODE * NETLIST_EXPORTER_GENERIC::makeListOfNets ( )
protectedinherited

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 479 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 NETLIST_EXPORTER_GENERIC::node().

Referenced by NETLIST_EXPORTER_GENERIC::makeRoot().

480 {
481  XNODE* xnets = node( "nets" ); // auto_ptr if exceptions ever get used.
482  wxString netCodeTxt;
483  wxString netName;
484  wxString ref;
485 
486  XNODE* xnet = 0;
487  int netCode;
488  int lastNetCode = -1;
489  int sameNetcodeCount = 0;
490 
491 
492  /* output:
493  <net code="123" name="/cfcard.sch/WAIT#">
494  <node ref="R23" pin="1"/>
495  <node ref="U18" pin="12"/>
496  </net>
497  */
498 
499  m_LibParts.clear(); // must call this function before using m_LibParts.
500 
501  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
502  {
503  NETLIST_OBJECT* nitem = m_masterList->GetItem( ii );
504  SCH_COMPONENT* comp;
505 
506  // New net found, write net id;
507  if( ( netCode = nitem->GetNet() ) != lastNetCode )
508  {
509  sameNetcodeCount = 0; // item count for this net
510  netName = nitem->GetNetName();
511  lastNetCode = netCode;
512  }
513 
514  if( nitem->m_Type != NET_PIN )
515  continue;
516 
517  if( nitem->m_Flag != 0 ) // Redundant pin, skip it
518  continue;
519 
520  comp = nitem->GetComponentParent();
521 
522  // Get the reference for the net name and the main parent component
523  ref = comp->GetRef( &nitem->m_SheetPath );
524  if( ref[0] == wxChar( '#' ) )
525  continue;
526 
527  if( ++sameNetcodeCount == 1 )
528  {
529  xnets->AddChild( xnet = node( "net" ) );
530  netCodeTxt.Printf( "%d", netCode );
531  xnet->AddAttribute( "code", netCodeTxt );
532  xnet->AddAttribute( "name", netName );
533  }
534 
535  XNODE* xnode;
536  xnet->AddChild( xnode = node( "node" ) );
537  xnode->AddAttribute( "ref", ref );
538  xnode->AddAttribute( "pin", nitem->GetPinNumText() );
539  }
540 
541  return xnets;
542 }
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
int GetNet() const
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)
protectedinherited

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, NETLIST_EXPORTER_GENERIC::makeComponents(), NETLIST_EXPORTER_GENERIC::makeDesignHeader(), NETLIST_EXPORTER_GENERIC::makeLibParts(), NETLIST_EXPORTER_GENERIC::makeLibraries(), NETLIST_EXPORTER_GENERIC::makeListOfNets(), and NETLIST_EXPORTER_GENERIC::node().

Referenced by Format(), and NETLIST_EXPORTER_GENERIC::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 
)
protectedinherited

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 545 of file netlist_exporter_generic.cpp.

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

546 {
547  XNODE* n = new XNODE( wxXML_ELEMENT_NODE, aName );
548 
549  if( aTextualContent.Len() > 0 ) // excludes wxEmptyString, the parameter's default value
550  n->AddChild( new XNODE( wxXML_TEXT_NODE, wxEmptyString, aTextualContent ) );
551 
552  return n;
553 }
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 79 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().

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

Function WriteNetlist writes to specified output file.

Reimplemented from NETLIST_EXPORTER_GENERIC.

Definition at line 34 of file netlist_exporter_kicad.cpp.

References DisplayError(), Format(), GNL_ALL, and IO_ERROR::What().

Referenced by NETLIST_EXPORTER_KICAD().

35 {
36  try
37  {
38  FILE_OUTPUTFORMATTER formatter( aOutFileName );
39  Format( &formatter, GNL_ALL );
40  }
41 
42  catch( const IO_ERROR& ioe )
43  {
44  DisplayError( NULL, ioe.What() );
45  return false;
46  }
47 
48  return true;
49 }
void Format(OUTPUTFORMATTER *aOutputFormatter, int aCtl)
Function Format outputs this s-expression netlist into aOutputFormatter.
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
#define GNL_ALL
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:245
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

Member Data Documentation

std::set<LIB_PART*, LIB_PART_LESS_THAN> NETLIST_EXPORTER::m_LibParts
protectedinherited
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: