KiCad PCB EDA Suite
NETLIST_EXPORTER_PSPICE Class Reference

Class NETLIST_EXPORTER_PSPICE generates a PSPICE compatible netlist. More...

#include <netlist_exporter_pspice.h>

Inheritance diagram for NETLIST_EXPORTER_PSPICE:
NETLIST_EXPORTER NETLIST_EXPORTER_PSPICE_SIM

Public Types

typedef std::list< SPICE_ITEMSPICE_ITEM_LIST
 
typedef std::map< wxString, int > NET_INDEX_MAP
 

Net name to circuit node number mapping

More...
 

Public Member Functions

 NETLIST_EXPORTER_PSPICE (NETLIST_OBJECT_LIST *aMasterList, PROJECT *aProject=NULL)
 
virtual ~NETLIST_EXPORTER_PSPICE ()
 
const SPICE_ITEM_LISTGetSpiceItems () const
 Returns list of items representing schematic components in the Spice world. More...
 
bool WriteNetlist (const wxString &aOutFileName, unsigned aNetlistOptions) override
 Function WriteNetlist writes to specified output file. More...
 
bool Format (OUTPUTFORMATTER *aFormatter, unsigned aCtl)
 > More...
 
bool ProcessNetlist (unsigned aCtl)
 Processes the netlist to create net mapping and a list of SPICE_ITEMs. More...
 
const NET_INDEX_MAPGetNetIndexMap () const
 Returns a map of circuit nodes to net names. More...
 
void UpdateDirectives (unsigned aCtl)
 Updates the vector of Spice directives placed in the schematics. More...
 
const std::vector< wxString > GetDirectives () const
 Returnss a vector of Spice directives found in the schematics. More...
 

Static Public Member Functions

static void ReplaceForbiddenChars (wxString &aNetName)
 some chars are not accepted in netnames in spice netlists. More...
 
static const std::vector< wxString > & GetSpiceFields ()
 Returns a vector of component field names related to Spice simulation. More...
 
static const wxString & GetSpiceFieldName (SPICE_FIELD aField)
 Returns a string used for a particular component field related to Spice simulation. More...
 
static wxString GetSpiceField (SPICE_FIELD aField, SCH_COMPONENT *aComponent, unsigned aCtl)
 Retrieves either the requested field value or the default value. More...
 
static wxString GetSpiceFieldDefVal (SPICE_FIELD aField, SCH_COMPONENT *aComponent, unsigned aCtl)
 Retrieves the default value for a given field. More...
 
static bool StringToBool (const wxString &aStr)
 Convertes typical boolean string values (no/yes, true/false, 1/0) to a boolean value. More...
 
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

virtual void writeDirectives (OUTPUTFORMATTER *aFormatter, unsigned aCtl) const
 Saves the Spice directives. More...
 
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::vector< wxString > m_directives
 

Spice directives found in the processed schematic sheet

More...
 
std::set< wxString > m_libraries
 

Libraries used by the simulated circuit

More...
 
NET_INDEX_MAP m_netMap
 

Maps circuit nodes to net names

More...
 
SPICE_ITEM_LIST m_spiceItems
 

List of items representing schematic components in the Spice world

More...
 
PROJECTm_project
 

Project object to fetch its settings (e.g. paths)

More...
 

Static Private Attributes

static const std::vector< wxString > m_spiceFields
 

Detailed Description

Class NETLIST_EXPORTER_PSPICE generates a PSPICE compatible netlist.

Definition at line 99 of file netlist_exporter_pspice.h.

Member Typedef Documentation

typedef std::map<wxString, int> NETLIST_EXPORTER_PSPICE::NET_INDEX_MAP

Net name to circuit node number mapping

Definition at line 115 of file netlist_exporter_pspice.h.

Definition at line 112 of file netlist_exporter_pspice.h.

Constructor & Destructor Documentation

NETLIST_EXPORTER_PSPICE::NETLIST_EXPORTER_PSPICE ( NETLIST_OBJECT_LIST aMasterList,
PROJECT aProject = NULL 
)
inline

Definition at line 102 of file netlist_exporter_pspice.h.

102  :
103  NETLIST_EXPORTER( aMasterList ),
104  m_project( aProject )
105  {
106  }
NETLIST_EXPORTER(NETLIST_OBJECT_LIST *aMasterList)
Constructor.
PROJECT * m_project
Project object to fetch its settings (e.g. paths)
virtual NETLIST_EXPORTER_PSPICE::~NETLIST_EXPORTER_PSPICE ( )
inlinevirtual

Definition at line 108 of file netlist_exporter_pspice.h.

109  {
110  }

Member Function Documentation

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:220
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:165
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 NETLIST_EXPORTER_GENERIC::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:212
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:220
std::set< LIB_PART *, LIB_PART_LESS_THAN > m_LibParts
unique library parts used. LIB_PART items are sorted by names
Class LIB_PART defines a library part 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 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:212
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:220
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
Class LIB_PART defines a library part 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.
bool NETLIST_EXPORTER_PSPICE::Format ( OUTPUTFORMATTER aFormatter,
unsigned  aCtl 
)

>

Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.

Definition at line 61 of file netlist_exporter_pspice.cpp.

References DisplayError(), Format(), NETLIST_OBJECT::GetNetName(), m_libraries, m_netMap, m_project, m_spiceItems, NET_ADJUST_INCLUDE_PATHS, Pgm(), OUTPUTFORMATTER::Print(), ProcessNetlist(), ReplaceForbiddenChars(), ResolveFile(), NETLIST_EXPORTER::sprintPinNetName(), TO_UTF8, and writeDirectives().

Referenced by WriteNetlist().

62 {
63  // Netlist options
64  const bool useNetcodeAsNetName = false;//aCtl & NET_USE_NETCODES_AS_NETNAMES;
65 
66  if( !ProcessNetlist( aCtl ) )
67  return false;
68 
69  aFormatter->Print( 0, ".title KiCad schematic\n" );
70 
71  // Write .include directives
72  for( auto lib : m_libraries )
73  {
74  wxString full_path;
75 
76  if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) )
77  {
78  // Look for the library in known search locations
79  full_path = ResolveFile( lib, &Pgm().GetLocalEnvVariables(), m_project );
80 
81  if( full_path.IsEmpty() )
82  {
83  DisplayError( NULL, wxString::Format( _( "Could not find library file %s" ), lib ) );
84  full_path = lib;
85  }
86  }
87  else
88  full_path = lib; // just use the unaltered path
89 
90  aFormatter->Print( 0, ".include \"%s\"\n", (const char*) full_path.c_str() );
91  }
92 
93  for( const auto& item : m_spiceItems )
94  {
95  if( !item.m_enabled )
96  continue;
97 
98  // Save the node order
99  aFormatter->Print( 0, "%c%s ", item.m_primitive, (const char*) item.m_refName.c_str() );
100 
101  size_t pspiceNodes = item.m_pinSequence.empty() ? item.m_pins.size() : item.m_pinSequence.size();
102 
103  for( size_t ii = 0; ii < pspiceNodes; ii++ )
104  {
105  // Use the custom order if defined, otherwise use the standard pin order as defined in the compon
106  size_t activePinIndex = item.m_pinSequence.empty() ? ii : item.m_pinSequence[ii];
107  // Valid used Node Indexes are in the set
108  // {0,1,2,...m_item.m_pin.size()-1}
109  if( activePinIndex >= item.m_pins.size() )
110  {
111  wxASSERT_MSG( false, "Used an invalid pin number in node sequence" );
112  continue;
113  }
114 
115  NETLIST_OBJECT* pin = item.m_pins[activePinIndex];
116  assert( pin );
117  wxString netName = pin->GetNetName();
118 
119  if( useNetcodeAsNetName )
120  {
121  assert( m_netMap.count( netName ) );
122  aFormatter->Print( 0, "%d ", m_netMap[netName] );
123  }
124  else
125  {
126  sprintPinNetName( netName , wxT( "N-%.6d" ), pin, useNetcodeAsNetName );
127 
128  // Replace parenthesis with underscore to prevent parse issues with simulators
129  ReplaceForbiddenChars( netName );
130 
131  if( netName.IsEmpty() )
132  netName = wxT( "?" );
133 
134  aFormatter->Print( 0, "%s ", TO_UTF8( netName ) );
135  }
136  }
137 
138  aFormatter->Print( 0, "%s\n", (const char*) item.m_model.c_str() );
139  }
140 
141  // Print out all directives found in the text fields on the schematics
142  writeDirectives( aFormatter, aCtl );
143 
144  aFormatter->Print( 0, ".end\n" );
145 
146  return true;
147 }
wxString ResolveFile(const wxString &aFileName, const ENV_VAR_MAP *aEnvVars, const PROJECT *aProject)
Searches the default paths trying to find one with the requested file.
Definition: env_paths.cpp:129
wxString GetNetName(bool adoptTimestamp=false) const
Function GetNetName.
std::set< wxString > m_libraries
Libraries used by the simulated circuit
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...
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: kicad.cpp:65
SPICE_ITEM_LIST m_spiceItems
List of items representing schematic components in the Spice world
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
NET_INDEX_MAP m_netMap
Maps circuit nodes to net names
bool ProcessNetlist(unsigned aCtl)
Processes the netlist to create net mapping and a list of SPICE_ITEMs.
static void ReplaceForbiddenChars(wxString &aNetName)
some chars are not accepted in netnames in spice netlists.
PROJECT * m_project
Project object to fetch its settings (e.g. paths)
virtual void writeDirectives(OUTPUTFORMATTER *aFormatter, unsigned aCtl) const
Saves the Spice directives.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:73
const std::vector<wxString> NETLIST_EXPORTER_PSPICE::GetDirectives ( ) const
inline

Returnss a vector of Spice directives found in the schematics.

Definition at line 193 of file netlist_exporter_pspice.h.

References m_directives.

Referenced by NETLIST_EXPORTER_PSPICE_SIM::GetSheetSimCommand(), and NETLIST_EXPORTER_PSPICE_SIM::writeDirectives().

194  {
195  return m_directives;
196  }
std::vector< wxString > m_directives
Spice directives found in the processed schematic sheet
const NET_INDEX_MAP& NETLIST_EXPORTER_PSPICE::GetNetIndexMap ( ) const
inline

Returns a map of circuit nodes to net names.

Definition at line 154 of file netlist_exporter_pspice.h.

References m_netMap.

Referenced by DIALOG_SIM_SETTINGS::ShowModal(), DIALOG_SIM_SETTINGS::TransferDataFromWindow(), DIALOG_SIGNAL_LIST::TransferDataToWindow(), and NETLIST_EXPORTER_PSPICE_SIM::writeDirectives().

155  {
156  return m_netMap;
157  }
NET_INDEX_MAP m_netMap
Maps circuit nodes to net names
wxString NETLIST_EXPORTER_PSPICE::GetSpiceField ( SPICE_FIELD  aField,
SCH_COMPONENT aComponent,
unsigned  aCtl 
)
static

Retrieves either the requested field value or the default value.

Definition at line 150 of file netlist_exporter_pspice.cpp.

References SCH_COMPONENT::FindField(), GetSpiceFieldDefVal(), GetSpiceFieldName(), and EDA_TEXT::GetText().

Referenced by SIM_PLOT_FRAME::AddTuner(), ProcessNetlist(), and TUNER_SLIDER::TUNER_SLIDER().

152 {
153  SCH_FIELD* field = aComponent->FindField( GetSpiceFieldName( aField ) );
154  return field ? field->GetText() : GetSpiceFieldDefVal( aField, aComponent, aCtl );
155 }
Class SCH_FIELD instances are attached to a component and provide a place for the component's value...
Definition: sch_field.h:56
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
static const wxString & GetSpiceFieldName(SPICE_FIELD aField)
Returns a string used for a particular component field related to Spice simulation.
static wxString GetSpiceFieldDefVal(SPICE_FIELD aField, SCH_COMPONENT *aComponent, unsigned aCtl)
Retrieves the default value for a given field.
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
wxString NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal ( SPICE_FIELD  aField,
SCH_COMPONENT aComponent,
unsigned  aCtl 
)
static

Retrieves the default value for a given field.

Definition at line 158 of file netlist_exporter_pspice.cpp.

References SCH_COMPONENT::GetField(), SCH_COMPONENT::GetPins(), EDA_TEXT::GetText(), NET_ADJUST_PASSIVE_VALS, REFERENCE, SF_ENABLED, SF_LIB_FILE, SF_MODEL, SF_NODE_SEQUENCE, SF_PRIMITIVE, and VALUE.

Referenced by GetSpiceField(), and DIALOG_SPICE_MODEL::TransferDataToWindow().

160 {
161  switch( aField )
162  {
163  case SF_PRIMITIVE:
164  {
165  const wxString& refName = aComponent->GetField( REFERENCE )->GetText();
166  return refName.GetChar( 0 );
167  break;
168  }
169 
170  case SF_MODEL:
171  {
172  wxChar prim = aComponent->GetField( REFERENCE )->GetText().GetChar( 0 );
173  wxString value = aComponent->GetField( VALUE )->GetText();
174 
175  // Is it a passive component?
176  if( aCtl & NET_ADJUST_PASSIVE_VALS && ( prim == 'C' || prim == 'L' || prim == 'R' ) )
177  {
178  // Regular expression to match common formats used for passive parts description
179  // (e.g. 100k, 2k3, 1 uF)
180  wxRegEx passiveVal( "^([0-9\\. ]+)([fFpPnNuUmMkKgGtT]|M(e|E)(g|G))?([fFhH]|ohm)?([-1-9 ]*)$" );
181 
182  if( passiveVal.Matches( value ) )
183  {
184  wxString prefix( passiveVal.GetMatch( value, 1 ) );
185  wxString unit( passiveVal.GetMatch( value, 2 ) );
186  wxString suffix( passiveVal.GetMatch( value, 6 ) );
187 
188  prefix.Trim(); prefix.Trim( false );
189  unit.Trim(); unit.Trim( false );
190  suffix.Trim(); suffix.Trim( false );
191 
192  // Make 'mega' units comply with the Spice expectations
193  if( unit == "M" )
194  unit = "Meg";
195 
196  value = prefix + unit + suffix;
197  }
198  }
199 
200  return value;
201  break;
202  }
203 
204  case SF_ENABLED:
205  return wxString( "Y" );
206  break;
207 
208  case SF_NODE_SEQUENCE:
209  {
210  wxString nodeSeq;
211  std::vector<LIB_PIN*> pins;
212 
213  aComponent->GetPins( pins );
214 
215  for( auto pin : pins )
216  nodeSeq += pin->GetNumber() + " ";
217 
218  nodeSeq.Trim();
219 
220  return nodeSeq;
221  break;
222  }
223 
224  case SF_LIB_FILE:
225  // There is no default Spice library
226  return wxEmptyString;
227  break;
228 
229  default:
230  wxASSERT_MSG( false, "Missing default value definition for a Spice field" );
231  break;
232  }
233 
234 
235  return wxString( "<unknown>" );
236 }
Field Reference of part, i.e. "IC21".
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
void GetPins(std::vector< LIB_PIN * > &aPinsList)
Populate a vector with all the pins.
#define VALUE
static const wxString& NETLIST_EXPORTER_PSPICE::GetSpiceFieldName ( SPICE_FIELD  aField)
inlinestatic

Returns a string used for a particular component field related to Spice simulation.

Definition at line 170 of file netlist_exporter_pspice.h.

References m_spiceFields.

Referenced by DIALOG_SPICE_MODEL::getField(), GetSpiceField(), ProcessNetlist(), and DIALOG_SPICE_MODEL::TransferDataFromWindow().

171  {
172  return m_spiceFields[(int) aField];
173  }
static const std::vector< wxString > m_spiceFields
static const std::vector<wxString>& NETLIST_EXPORTER_PSPICE::GetSpiceFields ( )
inlinestatic

Returns a vector of component field names related to Spice simulation.

Definition at line 162 of file netlist_exporter_pspice.h.

References m_spiceFields.

Referenced by DIALOG_SPICE_MODEL::TransferDataToWindow().

163  {
164  return m_spiceFields;
165  }
static const std::vector< wxString > m_spiceFields
const SPICE_ITEM_LIST& NETLIST_EXPORTER_PSPICE::GetSpiceItems ( ) const
inline

Returns list of items representing schematic components in the Spice world.

Definition at line 120 of file netlist_exporter_pspice.h.

References m_spiceItems.

Referenced by NETLIST_EXPORTER_PSPICE_SIM::GetSpiceDevice(), DIALOG_SIM_SETTINGS::ShowModal(), DIALOG_SIGNAL_LIST::TransferDataToWindow(), and NETLIST_EXPORTER_PSPICE_SIM::writeDirectives().

121  {
122  return m_spiceItems;
123  }
SPICE_ITEM_LIST m_spiceItems
List of items representing schematic components in the Spice world
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 }
bool NETLIST_EXPORTER_PSPICE::ProcessNetlist ( unsigned  aCtl)

Processes the netlist to create net mapping and a list of SPICE_ITEMs.

It is automatically called by WriteNetlist(), but might be used separately, if only net mapping and the list of SPICE_ITEMs are required.

Returns
True if successful.

Definition at line 239 of file netlist_exporter_pspice.cpp.

References UNIQUE_STRINGS::Clear(), DisplayError(), SCH_COMPONENT::FindField(), NETLIST_EXPORTER::findNextComponentAndCreatePinList(), g_RootSheet, NETLIST_OBJECT_LIST::GetItem(), NETLIST_OBJECT::GetNetName(), NETLIST_OBJECT::GetPinNumText(), SCH_COMPONENT::GetRef(), GetSpiceField(), GetSpiceFieldName(), EDA_TEXT::GetText(), SPICE_ITEM::m_enabled, NETLIST_OBJECT::m_Flag, m_libraries, NETLIST_EXPORTER::m_masterList, SPICE_ITEM::m_model, m_netMap, SPICE_ITEM::m_parent, SPICE_ITEM::m_pins, SPICE_ITEM::m_pinSequence, SPICE_ITEM::m_primitive, NETLIST_EXPORTER::m_ReferencesAlreadyFound, SPICE_ITEM::m_refName, NETLIST_EXPORTER::m_SortedComponentPinList, m_spiceItems, SF_ENABLED, SF_LIB_FILE, SF_MODEL, SF_NODE_SEQUENCE, SF_PRIMITIVE, StringToBool(), and UpdateDirectives().

Referenced by Format().

240 {
241  const wxString delimiters( "{:,; }" );
242  SCH_SHEET_LIST sheetList( g_RootSheet );
243  // Set of reference names, to check for duplications
244  std::set<wxString> refNames;
245 
246  // Prepare list of nets generation (not used here, but...
247  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
248  m_masterList->GetItem( ii )->m_Flag = 0;
249 
250  m_netMap.clear();
251  m_netMap["GND"] = 0; // 0 is reserved for "GND"
252  int netIdx = 1;
253 
254  m_libraries.clear();
256 
257  UpdateDirectives( aCtl );
258 
259  for( unsigned sheet_idx = 0; sheet_idx < sheetList.size(); sheet_idx++ )
260  {
261  // Process component attributes to find Spice directives
262  for( EDA_ITEM* item = sheetList[sheet_idx].LastDrawList(); item; item = item->Next() )
263  {
264  SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[sheet_idx] );
265 
266  if( !comp )
267  break;
268 
269  item = comp;
270 
271  SPICE_ITEM spiceItem;
272  spiceItem.m_parent = comp;
273 
274  // Obtain Spice fields
275  SCH_FIELD* fieldLibFile = comp->FindField( GetSpiceFieldName( SF_LIB_FILE ) );
276  SCH_FIELD* fieldSeq = comp->FindField( GetSpiceFieldName( SF_NODE_SEQUENCE ) );
277 
278  spiceItem.m_primitive = GetSpiceField( SF_PRIMITIVE, comp, aCtl )[0];
279  spiceItem.m_model = GetSpiceField( SF_MODEL, comp, aCtl );
280  spiceItem.m_refName = comp->GetRef( &sheetList[sheet_idx] );
281 
282  // Duplicate references will result in simulation errors
283  if( refNames.count( spiceItem.m_refName ) )
284  {
285  DisplayError( NULL, wxT( "There are duplicate components. "
286  "You need to annotate schematics first." ) );
287  return false;
288  }
289 
290  refNames.insert( spiceItem.m_refName );
291 
292  // Check to see if component should be removed from Spice netlist
293  spiceItem.m_enabled = StringToBool( GetSpiceField( SF_ENABLED, comp, aCtl ) );
294 
295  if( fieldLibFile && !fieldLibFile->GetText().IsEmpty() )
296  m_libraries.insert( fieldLibFile->GetText() );
297 
298  wxArrayString pinNames;
299 
300  // Store pin information
301  for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
302  {
304 
305  // NETLIST_EXPORTER marks removed pins by setting them to NULL
306  if( !pin )
307  continue;
308 
309  spiceItem.m_pins.push_back( pin );
310  pinNames.Add( pin->GetPinNumText() );
311 
312  // Create net mapping
313  const wxString& netName = pin->GetNetName();
314  if( m_netMap.count( netName ) == 0 )
315  m_netMap[netName] = netIdx++;
316  }
317 
318  // Check if an alternative pin sequence is available:
319  if( fieldSeq )
320  {
321  // Get the string containing the sequence of nodes:
322  wxString nodeSeqIndexLineStr = fieldSeq->GetText();
323 
324  // Verify field exists and is not empty:
325  if( !nodeSeqIndexLineStr.IsEmpty() )
326  {
327  // Get Alt Pin Name Array From User:
328  wxStringTokenizer tkz( nodeSeqIndexLineStr, delimiters );
329 
330  while( tkz.HasMoreTokens() )
331  {
332  wxString pinIndex = tkz.GetNextToken();
333  int seq;
334 
335  // Find PinName In Standard List assign Standard List Index to Name:
336  seq = pinNames.Index( pinIndex );
337 
338  if( seq != wxNOT_FOUND )
339  spiceItem.m_pinSequence.push_back( seq );
340  }
341  }
342  }
343 
344  m_spiceItems.push_back( spiceItem );
345  }
346  }
347 
348  return true;
349 }
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
std::vector< NETLIST_OBJECT * > m_pins
Array containing Standard Pin Name
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
wxString GetNetName(bool adoptTimestamp=false) const
Function GetNetName.
const wxString & GetPinNumText() const
Function GetPinNum returns a pin number in wxString form.
UNIQUE_STRINGS m_ReferencesAlreadyFound
Used for "multi parts per package" components, avoids processing a lib component more than once...
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in list.
std::set< wxString > m_libraries
Libraries used by the simulated circuit
SCH_COMPONENT * m_parent
Schematic component represented by this SPICE_ITEM.
Structure to represent a schematic component in the Spice simulation.
static const wxString & GetSpiceFieldName(SPICE_FIELD aField)
Returns a string used for a particular component field related to Spice simulation.
bool m_enabled
Flag to indicate whether the component should be used in simulation.
EDA_ITEM * Next() const
Definition: base_struct.h:220
void Clear()
Function Clear erases the record.
static bool StringToBool(const wxString &aStr)
Convertes typical boolean string values (no/yes, true/false, 1/0) to a boolean value.
wxString m_model
Library model (for semiconductors and subcircuits), component value (for passive components) or volta...
NETLIST_OBJECT_LIST * m_masterList
SPICE_ITEM_LIST m_spiceItems
List of items representing schematic components in the Spice world
NET_INDEX_MAP m_netMap
Maps circuit nodes to net names
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
void UpdateDirectives(unsigned aCtl)
Updates the vector of Spice directives placed in the schematics.
SCH_COMPONENT * findNextComponentAndCreatePinList(EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
Function findNextComponentAndCreatePinList finds a component from the DrawList and builds its pin lis...
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
NETLIST_OBJECTS m_SortedComponentPinList
yes ownership, connected items flat list
static wxString GetSpiceField(SPICE_FIELD aField, SCH_COMPONENT *aComponent, unsigned aCtl)
Retrieves either the requested field value or the default value.
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:165
wxChar m_primitive
Spice primitive type (
std::vector< int > m_pinSequence
Numeric indices into m_SortedComponentPinList
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_PSPICE::ReplaceForbiddenChars ( wxString &  aNetName)
static

some chars are not accepted in netnames in spice netlists.

for instance '(' and ')' ReplaceForbiddenChars replace these chars by an underscore.

Parameters
aNetName= the netname to modify.

Definition at line 50 of file netlist_exporter_pspice.cpp.

Referenced by Format(), and NETLIST_EXPORTER_PSPICE_SIM::GetSpiceVector().

51 {
52  // some chars are not accepted in netnames in spice netlists, because they are separators
53  // they are replaced an underscore or some other allowed char.
54  // Note: this is a static function
55 
56  aNetName.Replace( "(", "_" );
57  aNetName.Replace( ")", "_" );
58 }
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 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.
static bool NETLIST_EXPORTER_PSPICE::StringToBool ( const wxString &  aStr)
inlinestatic

Convertes typical boolean string values (no/yes, true/false, 1/0) to a boolean value.

Definition at line 201 of file netlist_exporter_pspice.h.

Referenced by ProcessNetlist(), and DIALOG_SPICE_MODEL::TransferDataToWindow().

202  {
203  if( aStr.IsEmpty() )
204  return false;
205 
206  char c = tolower( aStr[0] );
207 
208  // Different ways of saying false (no/false/0)
209  return !( c == 'n' || c == 'f' || c == '0' );
210  }
void NETLIST_EXPORTER_PSPICE::UpdateDirectives ( unsigned  aCtl)

Updates the vector of Spice directives placed in the schematics.

Definition at line 352 of file netlist_exporter_pspice.cpp.

References g_RootSheet, GetText(), m_directives, m_libraries, and SCH_TEXT_T.

Referenced by NETLIST_EXPORTER_PSPICE_SIM::GetSheetSimCommand(), and ProcessNetlist().

353 {
354  const SCH_SHEET_LIST& sheetList = g_RootSheet;
355 
356  m_directives.clear();
357 
358  for( unsigned i = 0; i < sheetList.size(); i++ )
359  {
360  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
361  {
362  if( item->Type() != SCH_TEXT_T )
363  continue;
364 
365  wxString text = static_cast<SCH_TEXT*>( item )->GetText();
366 
367  if( text.IsEmpty() )
368  continue;
369 
370  if( text.GetChar( 0 ) == '.' )
371  {
372  wxStringTokenizer tokenizer( text, "\r\n" );
373 
374  while( tokenizer.HasMoreTokens() )
375  {
376  wxString directive( tokenizer.GetNextToken() );
377 
378  if( directive.StartsWith( ".inc" ) )
379  {
380  wxString lib = directive.AfterFirst( ' ' );
381 
382  if( !lib.IsEmpty() )
383  m_libraries.insert( lib );
384  }
385  else
386  {
387  m_directives.push_back( directive );
388  }
389  }
390  }
391  }
392  }
393 }
Class SCH_SHEET_LIST.
std::set< wxString > m_libraries
Libraries used by the simulated circuit
std::vector< wxString > m_directives
Spice directives found in the processed schematic sheet
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
wxString GetText(GRAPHIC_PINSHAPE shape)
Definition: pin_shape.cpp:33
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:165
void NETLIST_EXPORTER_PSPICE::writeDirectives ( OUTPUTFORMATTER aFormatter,
unsigned  aCtl 
) const
protectedvirtual

Saves the Spice directives.

Reimplemented in NETLIST_EXPORTER_PSPICE_SIM.

Definition at line 396 of file netlist_exporter_pspice.cpp.

References m_directives, and OUTPUTFORMATTER::Print().

Referenced by Format(), and NETLIST_EXPORTER_PSPICE_SIM::writeDirectives().

397 {
398  for( auto& dir : m_directives )
399  {
400  aFormatter->Print( 0, "%s\n", (const char*) dir.c_str() );
401  }
402 }
std::vector< wxString > m_directives
Spice directives found in the processed schematic sheet
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
bool NETLIST_EXPORTER_PSPICE::WriteNetlist ( const wxString &  aOutFileName,
unsigned  aNetlistOptions 
)
overridevirtual

Function WriteNetlist writes to specified output file.

Reimplemented from NETLIST_EXPORTER.

Definition at line 43 of file netlist_exporter_pspice.cpp.

References Format().

44 {
45  FILE_OUTPUTFORMATTER outputFile( aOutFileName, wxT( "wt" ), '\'' );
46 
47  return Format( &outputFile, aNetlistOptions );
48 }
bool Format(OUTPUTFORMATTER *aFormatter, unsigned aCtl)
>
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492

Member Data Documentation

std::vector<wxString> NETLIST_EXPORTER_PSPICE::m_directives
private

Spice directives found in the processed schematic sheet

Definition at line 220 of file netlist_exporter_pspice.h.

Referenced by GetDirectives(), UpdateDirectives(), and writeDirectives().

std::set<LIB_PART*, LIB_PART_LESS_THAN> NETLIST_EXPORTER::m_LibParts
protectedinherited
std::set<wxString> NETLIST_EXPORTER_PSPICE::m_libraries
private

Libraries used by the simulated circuit

Definition at line 223 of file netlist_exporter_pspice.h.

Referenced by Format(), ProcessNetlist(), and UpdateDirectives().

NET_INDEX_MAP NETLIST_EXPORTER_PSPICE::m_netMap
private

Maps circuit nodes to net names

Definition at line 226 of file netlist_exporter_pspice.h.

Referenced by Format(), GetNetIndexMap(), and ProcessNetlist().

PROJECT* NETLIST_EXPORTER_PSPICE::m_project
private

Project object to fetch its settings (e.g. paths)

Definition at line 232 of file netlist_exporter_pspice.h.

Referenced by Format().

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(), ProcessNetlist(), NETLIST_EXPORTER_ORCADPCB2::WriteNetlist(), and NETLIST_EXPORTER_CADSTAR::WriteNetlist().

const std::vector< wxString > NETLIST_EXPORTER_PSPICE::m_spiceFields
staticprivate
Initial value:
= {
"Spice_Primitive",
"Spice_Model",
"Spice_Netlist_Enabled",
"Spice_Node_Sequence",
"Spice_Lib_File"
}

Definition at line 235 of file netlist_exporter_pspice.h.

Referenced by GetSpiceFieldName(), and GetSpiceFields().

SPICE_ITEM_LIST NETLIST_EXPORTER_PSPICE::m_spiceItems
private

List of items representing schematic components in the Spice world

Definition at line 229 of file netlist_exporter_pspice.h.

Referenced by Format(), GetSpiceItems(), and ProcessNetlist().


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