KiCad PCB EDA Suite
NETLIST_EXPORTER_PSPICE_SIM Class Reference

Special netlist exporter flavor that allows one to override simulation commands. More...

#include <netlist_exporter_pspice_sim.h>

Inheritance diagram for NETLIST_EXPORTER_PSPICE_SIM:
NETLIST_EXPORTER_PSPICE NETLIST_EXPORTER

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_SIM (NETLIST_OBJECT_LIST *aMasterList, PROJECT *aProject=nullptr)
 
wxString GetSpiceVector (const wxString &aName, SIM_PLOT_TYPE aType, const wxString &aParam=wxEmptyString) const
 Returns name of Spice dataset for a specific plot. More...
 
void SetSimCommand (const wxString &aCmd)
 Overrides the simulation command directive. More...
 
const wxString & GetSimCommand () const
 Returns the simulation command directive. More...
 
void ClearSimCommand ()
 Clears the simulation command directive. More...
 
SIM_TYPE GetSimType ()
 Returns simulation type basing on the simulation command directives. More...
 
wxString GetSheetSimCommand ()
 Returns simulation command directives placed in schematic sheets (if any). More...
 
const SPICE_ITEM_LISTGetSpiceItems () const
 Returns list of items representing schematic components in the Spice world. More...
 
wxString GetSpiceDevice (const wxString &aComponent) const
 Returns name of Spice device corresponding to a schematic component. 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 const std::vector< wxString > & GetCurrents (SPICE_PRIMITIVE aPrimitive)
 Returns a list of currents that can be probed in a Spice primitive. More...
 
static bool IsSimCommand (const wxString &aCmd)
 Determines if a directive is a simulation command. More...
 
static SIM_TYPE CommandToSimType (const wxString &aCmd)
 Returns simulation type basing on a simulation command directive. More...
 
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

void writeDirectives (OUTPUTFORMATTER *aFormatter, unsigned aCtl) const override
 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

wxString m_simCommand
 

Custom simulation command (has priority over the schematic sheet simulation commands)

More...
 

Detailed Description

Special netlist exporter flavor that allows one to override simulation commands.

Definition at line 36 of file netlist_exporter_pspice_sim.h.

Member Typedef Documentation

◆ NET_INDEX_MAP

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

Net name to circuit node number mapping

Definition at line 117 of file netlist_exporter_pspice.h.

◆ SPICE_ITEM_LIST

Definition at line 114 of file netlist_exporter_pspice.h.

Constructor & Destructor Documentation

◆ NETLIST_EXPORTER_PSPICE_SIM()

NETLIST_EXPORTER_PSPICE_SIM::NETLIST_EXPORTER_PSPICE_SIM ( NETLIST_OBJECT_LIST aMasterList,
PROJECT aProject = nullptr 
)
inline

Definition at line 39 of file netlist_exporter_pspice_sim.h.

39  :
40  NETLIST_EXPORTER_PSPICE( aMasterList, aProject )
41  {
42  }
NETLIST_EXPORTER_PSPICE(NETLIST_OBJECT_LIST *aMasterList, PROJECT *aProject=NULL)

Member Function Documentation

◆ addPinToComponentPinList()

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 238 of file netlist_exporter.cpp.

240 {
241  // Search the PIN description for Pin in g_NetObjectslist
242  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
243  {
244  NETLIST_OBJECT* pin = m_masterList->GetItem( ii );
245 
246  if( pin->m_Type != NET_PIN )
247  continue;
248 
249  if( pin->m_Link != aComponent )
250  continue;
251 
252  if( pin->m_PinNum != aPin->GetNumber() )
253  continue;
254 
255  // most expensive test at the end.
256  if( pin->m_SheetPath != *aSheetPath )
257  continue;
258 
259  m_SortedComponentPinList.push_back( pin );
260 
261  if( m_SortedComponentPinList.size() >= MAXPIN )
262  {
263  // Log message for Internal error
264  DisplayError( NULL, wxT( "addPinToComponentPinList err: MAXPIN reached" ) );
265  }
266 
267  return true; // we're done, we appended.
268  }
269 
270  return false;
271 }
#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
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in 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:244

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().

◆ ClearSimCommand()

void NETLIST_EXPORTER_PSPICE_SIM::ClearSimCommand ( )
inline

Clears the simulation command directive.

Definition at line 80 of file netlist_exporter_pspice_sim.h.

81  {
82  m_simCommand.Clear();
83  }
wxString m_simCommand
Custom simulation command (has priority over the schematic sheet simulation commands)

References m_simCommand.

◆ CommandToSimType()

SIM_TYPE NETLIST_EXPORTER_PSPICE_SIM::CommandToSimType ( const wxString &  aCmd)
static

Returns simulation type basing on a simulation command directive.

Definition at line 110 of file netlist_exporter_pspice_sim.cpp.

111 {
112  const std::map<wxString, SIM_TYPE> simCmds = {
113  { ".ac", ST_AC }, { ".dc", ST_DC }, { ".disto", ST_DISTORTION }, { ".noise", ST_NOISE },
114  { ".op", ST_OP }, { ".pz", ST_POLE_ZERO }, { ".sens", ST_SENSITIVITY }, { ".tf", ST_TRANS_FUNC },
115  { ".tran", ST_TRANSIENT }
116  };
117  wxString lcaseCmd = aCmd.Lower();
118 
119  for( const auto& c : simCmds )
120  {
121  if( lcaseCmd.StartsWith( c.first ) )
122  return c.second;
123  }
124 
125  return ST_UNKNOWN;
126 }

References ST_AC, ST_DC, ST_DISTORTION, ST_NOISE, ST_OP, ST_POLE_ZERO, ST_SENSITIVITY, ST_TRANS_FUNC, ST_TRANSIENT, and ST_UNKNOWN.

Referenced by GetSimType(), IsSimCommand(), and SIM_PLOT_FRAME::onSettings().

◆ eraseDuplicatePins()

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 274 of file netlist_exporter.cpp.

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

References NETLIST_EXPORTER::m_SortedComponentPinList, and PAD_CONNECT.

Referenced by NETLIST_EXPORTER::findNextComponentAndCreatePinList().

◆ findAllUnitsOfComponent()

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 325 of file netlist_exporter.cpp.

327 {
328  wxString ref = aComponent->GetRef( aSheetPath );
329  wxString ref2;
330 
331  SCH_SHEET_LIST sheetList( g_RootSheet );
332 
333  for( unsigned i = 0; i < sheetList.size(); i++ )
334  {
335  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
336  {
337  if( item->Type() != SCH_COMPONENT_T )
338  continue;
339 
340  SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
341 
342  ref2 = comp2->GetRef( &sheetList[i] );
343 
344  if( ref2.CmpNoCase( ref ) != 0 )
345  continue;
346 
347  int unit2 = comp2->GetUnitSelection( &sheetList[i] ); // slow
348 
349  for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) )
350  {
351  wxASSERT( pin->Type() == LIB_PIN_T );
352 
353  if( pin->GetUnit() && pin->GetUnit() != unit2 )
354  continue;
355 
356  if( pin->GetConvert() && pin->GetConvert() != comp2->GetConvert() )
357  continue;
358 
359  // A suitable pin is found: add it to the current list
360  addPinToComponentPinList( comp2, &sheetList[i], pin );
361  }
362  }
363  }
364 }
Class SCH_SHEET_LIST.
int GetUnitSelection(SCH_SHEET_PATH *aSheet)
EDA_ITEM * Next() const
Definition: base_struct.h:212
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:73
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:157
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...
int GetConvert() const

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().

◆ findNextComponent()

SCH_COMPONENT * NETLIST_EXPORTER::findNextComponent ( EDA_ITEM aItem,
SCH_SHEET_PATH aSheetPath 
)
protectedinherited

Definition at line 101 of file netlist_exporter.cpp.

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

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().

◆ findNextComponentAndCreatePinList()

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 158 of file netlist_exporter.cpp.

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

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().

◆ Format()

bool NETLIST_EXPORTER_PSPICE::Format ( OUTPUTFORMATTER aFormatter,
unsigned  aCtl 
)
inherited

Definition at line 78 of file netlist_exporter_pspice.cpp.

79 {
80  // Netlist options
81  const bool useNetcodeAsNetName = false;//aCtl & NET_USE_NETCODES_AS_NETNAMES;
82 
83  // default title
84  m_title = "KiCad schematic";
85 
86  if( !ProcessNetlist( aCtl ) )
87  return false;
88 
89  aFormatter->Print( 0, ".title %s\n", (const char*) m_title.c_str() );
90 
91  // Write .include directives
92  for( const auto& lib : m_libraries )
93  {
94  wxString full_path;
95 
96  if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) )
97  {
98  // Look for the library in known search locations
99  full_path = ResolveFile( lib, &Pgm().GetLocalEnvVariables(), m_project );
100 
101  if( full_path.IsEmpty() )
102  {
103  DisplayError( NULL, wxString::Format( _( "Could not find library file %s" ), lib ) );
104  full_path = lib;
105  }
106  }
107  else
108  full_path = lib; // just use the unaltered path
109 
110  aFormatter->Print( 0, ".include \"%s\"\n", (const char*) full_path.c_str() );
111  }
112 
113  unsigned int NC_counter = 1;
114 
115  for( const auto& item : m_spiceItems )
116  {
117  if( !item.m_enabled )
118  continue;
119 
120  wxString device = GetSpiceDevice( item.m_refName );
121  aFormatter->Print( 0, "%s ", (const char*) device.c_str() );
122 
123  size_t pspiceNodes = item.m_pinSequence.empty() ? item.m_pins.size() : item.m_pinSequence.size();
124 
125  for( size_t ii = 0; ii < pspiceNodes; ii++ )
126  {
127  // Use the custom order if defined, otherwise use the standard pin order as defined in the compon
128  size_t activePinIndex = item.m_pinSequence.empty() ? ii : item.m_pinSequence[ii];
129  // Valid used Node Indexes are in the set
130  // {0,1,2,...m_item.m_pin.size()-1}
131  if( activePinIndex >= item.m_pins.size() )
132  {
133  wxASSERT_MSG( false, "Used an invalid pin number in node sequence" );
134  continue;
135  }
136 
137  NETLIST_OBJECT* pin = item.m_pins[activePinIndex];
138  assert( pin );
139  wxString netName = pin->GetNetName();
140 
141  if( useNetcodeAsNetName )
142  {
143  assert( m_netMap.count( netName ) );
144  aFormatter->Print( 0, "%d ", m_netMap[netName] );
145  }
146  else
147  {
148  sprintPinNetName( netName , wxT( "N-%.6d" ), pin, useNetcodeAsNetName );
149 
150  // Replace parenthesis with underscore to prevent parse issues with simulators
151  ReplaceForbiddenChars( netName );
152 
153  // Add quotes to nets containing slashes. This isn't added to ReplaceForbidenChars
154  // because this is only necessary for file writing; nets with slashes can be
155  // handled by ngspice after loading.
156  if( netName.Contains( "/" ) )
157  {
158  netName.Prepend( '"' );
159  netName.Append( '"' );
160  }
161 
162  // Borrow LTSpice's nomenclature for unconnected nets
163  if( netName.IsEmpty() )
164  netName = wxString::Format( wxT( "NC_%.2u" ), NC_counter++ );
165 
166  aFormatter->Print( 0, "%s ", TO_UTF8( netName ) );
167  }
168  }
169 
170  aFormatter->Print( 0, "%s\n", (const char*) item.m_model.c_str() );
171  }
172 
173  // Print out all directives found in the text fields on the schematics
174  writeDirectives( aFormatter, aCtl );
175 
176  aFormatter->Print( 0, ".end\n" );
177 
178  return true;
179 }
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:138
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:66
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
wxString m_title
Spice simulation title found in the processed schematic sheet
NET_INDEX_MAP m_netMap
Maps circuit nodes to net names
virtual void writeDirectives(OUTPUTFORMATTER *aFormatter, unsigned aCtl) const
Saves the Spice directives.
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)
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
wxString GetNetName(bool adoptTimestamp=false) const
Function GetNetName.
wxString GetSpiceDevice(const wxString &aComponent) const
Returns name of Spice device corresponding to a schematic component.
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:244

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

Referenced by NETLIST_EXPORTER_PSPICE::WriteNetlist().

◆ GetCurrents()

const std::vector< wxString > & NETLIST_EXPORTER_PSPICE_SIM::GetCurrents ( SPICE_PRIMITIVE  aPrimitive)
static

Returns a list of currents that can be probed in a Spice primitive.

Definition at line 57 of file netlist_exporter_pspice_sim.cpp.

58 {
59  static const std::vector<wxString> passive = { "I" };
60  static const std::vector<wxString> diode = { "Id" };
61  static const std::vector<wxString> bjt = { "Ib", "Ic", "Ie" };
62  static const std::vector<wxString> mos = { "Ig", "Id", "Is" };
63  static const std::vector<wxString> empty;
64 
65  switch( aPrimitive )
66  {
67  case SP_RESISTOR:
68  case SP_CAPACITOR:
69  case SP_INDUCTOR:
70  case SP_VSOURCE:
71  return passive;
72 
73  case SP_DIODE:
74  return diode;
75 
76  case SP_BJT:
77  return bjt;
78 
79  case SP_MOSFET:
80  return mos;
81 
82  default:
83  return empty;
84  }
85 }
static bool empty(const wxTextEntryBase *aCtrl)

References empty(), SP_BJT, SP_CAPACITOR, SP_DIODE, SP_INDUCTOR, SP_MOSFET, SP_RESISTOR, and SP_VSOURCE.

Referenced by DIALOG_SIGNAL_LIST::TransferDataToWindow(), and writeDirectives().

◆ GetDirectives()

const std::vector<wxString> NETLIST_EXPORTER_PSPICE::GetDirectives ( ) const
inlineinherited

Returnss a vector of Spice directives found in the schematics.

Definition at line 206 of file netlist_exporter_pspice.h.

207  {
208  return m_directives;
209  }
std::vector< wxString > m_directives
Spice directives found in the processed schematic sheet

References NETLIST_EXPORTER_PSPICE::m_directives.

Referenced by GetSheetSimCommand(), and writeDirectives().

◆ GetNetIndexMap()

const NET_INDEX_MAP& NETLIST_EXPORTER_PSPICE::GetNetIndexMap ( ) const
inlineinherited

Returns a map of circuit nodes to net names.

Definition at line 167 of file netlist_exporter_pspice.h.

168  {
169  return m_netMap;
170  }
NET_INDEX_MAP m_netMap
Maps circuit nodes to net names

References NETLIST_EXPORTER_PSPICE::m_netMap.

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

◆ GetSheetSimCommand()

wxString NETLIST_EXPORTER_PSPICE_SIM::GetSheetSimCommand ( )

Returns simulation command directives placed in schematic sheets (if any).

Definition at line 88 of file netlist_exporter_pspice_sim.cpp.

89 {
90  wxString simCmd;
91 
93 
94  for( const auto& dir : GetDirectives() )
95  {
96  if( IsSimCommand( dir ) )
97  simCmd += wxString::Format( "%s\r\n", dir );
98  }
99 
100  return simCmd;
101 }
const std::vector< wxString > GetDirectives() const
Returnss a vector of Spice directives found in the schematics.
static bool IsSimCommand(const wxString &aCmd)
Determines if a directive is a simulation command.
void UpdateDirectives(unsigned aCtl)
Updates the vector of Spice directives placed in the schematics.
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

References Format(), NETLIST_EXPORTER_PSPICE::GetDirectives(), IsSimCommand(), NET_ALL_FLAGS, and NETLIST_EXPORTER_PSPICE::UpdateDirectives().

Referenced by GetSimType(), and DIALOG_SIM_SETTINGS::loadDirectives().

◆ GetSimCommand()

const wxString& NETLIST_EXPORTER_PSPICE_SIM::GetSimCommand ( ) const
inline

Returns the simulation command directive.

Definition at line 72 of file netlist_exporter_pspice_sim.h.

73  {
74  return m_simCommand;
75  }
wxString m_simCommand
Custom simulation command (has priority over the schematic sheet simulation commands)

References m_simCommand.

◆ GetSimType()

SIM_TYPE NETLIST_EXPORTER_PSPICE_SIM::GetSimType ( )

Returns simulation type basing on the simulation command directives.

Simulation directives set using SetSimCommand() have priority over the ones placed in schematic sheets.

Definition at line 104 of file netlist_exporter_pspice_sim.cpp.

105 {
107 }
wxString m_simCommand
Custom simulation command (has priority over the schematic sheet simulation commands)
static SIM_TYPE CommandToSimType(const wxString &aCmd)
Returns simulation type basing on a simulation command directive.
wxString GetSheetSimCommand()
Returns simulation command directives placed in schematic sheets (if any).

References CommandToSimType(), GetSheetSimCommand(), and m_simCommand.

Referenced by DIALOG_SIGNAL_LIST::TransferDataToWindow().

◆ GetSpiceDevice()

wxString NETLIST_EXPORTER_PSPICE::GetSpiceDevice ( const wxString &  aComponent) const
inherited

Returns name of Spice device corresponding to a schematic component.

Parameters
aComponentis the component reference.
Returns
Spice device name or empty string if there is no such component in the netlist. The name is either plain reference if the first character of reference corresponds to the assigned device model type or it is the reference prefixed with a character defining the device model type.

Definition at line 43 of file netlist_exporter_pspice.cpp.

44 {
45  const auto& spiceItems = GetSpiceItems();
46 
47  auto it = std::find_if( spiceItems.begin(), spiceItems.end(), [&]( const SPICE_ITEM& item ) {
48  return item.m_refName == aComponent;
49  } );
50 
51  if( it == spiceItems.end() )
52  return wxEmptyString;
53 
54  // Prefix the device type if plain reference would result in a different device type
55  return it->m_primitive != it->m_refName[0] ?
56  wxString( it->m_primitive + it->m_refName ) : it->m_refName;
57 }
const SPICE_ITEM_LIST & GetSpiceItems() const
Returns list of items representing schematic components in the Spice world.
Structure to represent a schematic component in the Spice simulation.

References NETLIST_EXPORTER_PSPICE::GetSpiceItems().

Referenced by NETLIST_EXPORTER_PSPICE::Format(), GetSpiceVector(), DIALOG_SIM_SETTINGS::TransferDataFromWindow(), and TUNER_SLIDER::TUNER_SLIDER().

◆ GetSpiceField()

wxString NETLIST_EXPORTER_PSPICE::GetSpiceField ( SPICE_FIELD  aField,
SCH_COMPONENT aComponent,
unsigned  aCtl 
)
staticinherited

Retrieves either the requested field value or the default value.

Definition at line 182 of file netlist_exporter_pspice.cpp.

184 {
185  SCH_FIELD* field = aComponent->FindField( GetSpiceFieldName( aField ) );
186  return field ? field->GetText() : GetSpiceFieldDefVal( aField, aComponent, aCtl );
187 }
Class SCH_FIELD instances are attached to a component and provide a place for the component's value,...
Definition: sch_field.h:52
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
const wxString GetText() const override
Function GetText returns the string associated with the text object.
Definition: sch_field.cpp:105
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.

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

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

◆ GetSpiceFieldDefVal()

wxString NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal ( SPICE_FIELD  aField,
SCH_COMPONENT aComponent,
unsigned  aCtl 
)
staticinherited

Retrieves the default value for a given field.

Definition at line 190 of file netlist_exporter_pspice.cpp.

192 {
193  switch( aField )
194  {
195  case SF_PRIMITIVE:
196  {
197  const wxString refName = aComponent->GetField( REFERENCE )->GetText();
198  return refName.GetChar( 0 );
199  break;
200  }
201 
202  case SF_MODEL:
203  {
204  wxChar prim = aComponent->GetField( REFERENCE )->GetText().GetChar( 0 );
205  wxString value = aComponent->GetField( VALUE )->GetText();
206 
207  // Is it a passive component?
208  if( aCtl & NET_ADJUST_PASSIVE_VALS && ( prim == 'C' || prim == 'L' || prim == 'R' ) )
209  {
210  // Regular expression to match common formats used for passive parts description
211  // (e.g. 100k, 2k3, 1 uF)
212  wxRegEx passiveVal( "^([0-9\\. ]+)([fFpPnNuUmMkKgGtT]|M(e|E)(g|G))?([fFhH]|ohm)?([-1-9 ]*)$" );
213 
214  if( passiveVal.Matches( value ) )
215  {
216  wxString prefix( passiveVal.GetMatch( value, 1 ) );
217  wxString unit( passiveVal.GetMatch( value, 2 ) );
218  wxString suffix( passiveVal.GetMatch( value, 6 ) );
219 
220  prefix.Trim(); prefix.Trim( false );
221  unit.Trim(); unit.Trim( false );
222  suffix.Trim(); suffix.Trim( false );
223 
224  // Make 'mega' units comply with the Spice expectations
225  if( unit == "M" )
226  unit = "Meg";
227 
228  value = prefix + unit + suffix;
229  }
230  }
231 
232  return value;
233  break;
234  }
235 
236  case SF_ENABLED:
237  return wxString( "Y" );
238  break;
239 
240  case SF_NODE_SEQUENCE:
241  {
242  wxString nodeSeq;
243  std::vector<LIB_PIN*> pins;
244 
245  auto part = aComponent->GetPartRef().lock();
246  wxCHECK( part, wxString() );
247  part->GetPins( pins );
248 
249  for( auto pin : pins )
250  nodeSeq += pin->GetNumber() + " ";
251 
252  nodeSeq.Trim();
253 
254  return nodeSeq;
255  break;
256  }
257 
258  case SF_LIB_FILE:
259  // There is no default Spice library
260  return wxEmptyString;
261  break;
262 
263  default:
264  wxASSERT_MSG( false, "Missing default value definition for a Spice field" );
265  break;
266  }
267 
268 
269  return wxString( "<unknown>" );
270 }
PART_REF & GetPartRef()
const wxString GetText() const override
Function GetText returns the string associated with the text object.
Definition: sch_field.cpp:105
Field Reference of part, i.e. "IC21".
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
#define VALUE

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

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

◆ GetSpiceFieldName()

static const wxString& NETLIST_EXPORTER_PSPICE::GetSpiceFieldName ( SPICE_FIELD  aField)
inlinestaticinherited

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

Definition at line 183 of file netlist_exporter_pspice.h.

184  {
185  return m_spiceFields[(int) aField];
186  }
static const std::vector< wxString > m_spiceFields

References NETLIST_EXPORTER_PSPICE::m_spiceFields.

Referenced by DIALOG_SPICE_MODEL::getLibField(), DIALOG_SPICE_MODEL::getSchField(), NETLIST_EXPORTER_PSPICE::GetSpiceField(), NETLIST_EXPORTER_PSPICE::ProcessNetlist(), and DIALOG_SPICE_MODEL::TransferDataFromWindow().

◆ GetSpiceFields()

static const std::vector<wxString>& NETLIST_EXPORTER_PSPICE::GetSpiceFields ( )
inlinestaticinherited

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

Definition at line 175 of file netlist_exporter_pspice.h.

176  {
177  return m_spiceFields;
178  }
static const std::vector< wxString > m_spiceFields

References NETLIST_EXPORTER_PSPICE::m_spiceFields.

Referenced by DIALOG_SPICE_MODEL::TransferDataToWindow().

◆ GetSpiceItems()

const SPICE_ITEM_LIST& NETLIST_EXPORTER_PSPICE::GetSpiceItems ( ) const
inlineinherited

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

Definition at line 122 of file netlist_exporter_pspice.h.

123  {
124  return m_spiceItems;
125  }
SPICE_ITEM_LIST m_spiceItems
List of items representing schematic components in the Spice world

References NETLIST_EXPORTER_PSPICE::m_spiceItems.

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

◆ GetSpiceVector()

wxString NETLIST_EXPORTER_PSPICE_SIM::GetSpiceVector ( const wxString &  aName,
SIM_PLOT_TYPE  aType,
const wxString &  aParam = wxEmptyString 
) const

Returns name of Spice dataset for a specific plot.

Parameters
aNameis name of the measured net or device
aTypedescribes the type of expected plot
aParamis an optional parameter for devices, if absent it will return current (only for passive devices).
Returns
Empty string if query is invalid, otherwise a plot name that can be requested from the simulator.

Definition at line 27 of file netlist_exporter_pspice_sim.cpp.

29 {
30  wxString res;
31 
32  // Some of the flags should exclude mutually
33  assert( ( ( aType & SPT_VOLTAGE ) == 0 ) != ( ( aType & SPT_CURRENT ) == 0 ) );
34  assert( ( ( aType & SPT_AC_PHASE ) == 0 ) || ( ( aType & SPT_AC_MAG ) == 0 ) );
35 
36  if( aType & SPT_VOLTAGE )
37  {
38  // Spice netlist netnames does not accept some chars, whicyh are replaced
39  // by eeschema netlist generator.
40  // Replace these forbidden chars to find the actual spice net name
41  wxString spicenet = aName;
43 
44  return wxString::Format( "V(%s)", spicenet.GetData() );
45  }
46 
47  else if( aType & SPT_CURRENT )
48  {
49  return wxString::Format( "@%s[%s]", GetSpiceDevice( aName ).Lower(),
50  aParam.IsEmpty() ? "i" : aParam.Lower() );
51  }
52 
53  return res;
54 }
static void ReplaceForbiddenChars(wxString &aNetName)
some chars are not accepted in netnames in spice netlists.
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
wxString GetSpiceDevice(const wxString &aComponent) const
Returns name of Spice device corresponding to a schematic component.

References Format(), NETLIST_EXPORTER_PSPICE::GetSpiceDevice(), NETLIST_EXPORTER_PSPICE::ReplaceForbiddenChars(), SPT_AC_MAG, SPT_AC_PHASE, SPT_CURRENT, and SPT_VOLTAGE.

Referenced by writeDirectives().

◆ IsSimCommand()

static bool NETLIST_EXPORTER_PSPICE_SIM::IsSimCommand ( const wxString &  aCmd)
inlinestatic

Determines if a directive is a simulation command.

Definition at line 100 of file netlist_exporter_pspice_sim.h.

101  {
102  return CommandToSimType( aCmd ) != ST_UNKNOWN;
103  }
static SIM_TYPE CommandToSimType(const wxString &aCmd)
Returns simulation type basing on a simulation command directive.

References CommandToSimType(), and ST_UNKNOWN.

Referenced by GetSheetSimCommand(), and writeDirectives().

◆ MakeCommandLine()

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 39 of file netlist_exporter.cpp.

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

Referenced by SCH_EDIT_FRAME::WriteNetListFile().

◆ ProcessNetlist()

bool NETLIST_EXPORTER_PSPICE::ProcessNetlist ( unsigned  aCtl)
inherited

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 273 of file netlist_exporter_pspice.cpp.

274 {
275  const wxString delimiters( "{:,; }" );
276  SCH_SHEET_LIST sheetList( g_RootSheet );
277  // Set of reference names, to check for duplications
278  std::set<wxString> refNames;
279 
280  // Prepare list of nets generation (not used here, but...
281  for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
282  m_masterList->GetItem( ii )->m_Flag = 0;
283 
284  m_netMap.clear();
285  m_netMap["GND"] = 0; // 0 is reserved for "GND"
286  int netIdx = 1;
287 
288  m_libraries.clear();
290 
291  UpdateDirectives( aCtl );
292 
293  for( unsigned sheet_idx = 0; sheet_idx < sheetList.size(); sheet_idx++ )
294  {
295  // Process component attributes to find Spice directives
296  for( EDA_ITEM* item = sheetList[sheet_idx].LastDrawList(); item; item = item->Next() )
297  {
298  SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[sheet_idx] );
299 
300  if( !comp )
301  break;
302 
303  item = comp;
304 
305  SPICE_ITEM spiceItem;
306  spiceItem.m_parent = comp;
307 
308  // Obtain Spice fields
309  SCH_FIELD* fieldLibFile = comp->FindField( GetSpiceFieldName( SF_LIB_FILE ) );
310  SCH_FIELD* fieldSeq = comp->FindField( GetSpiceFieldName( SF_NODE_SEQUENCE ) );
311 
312  spiceItem.m_primitive = GetSpiceField( SF_PRIMITIVE, comp, aCtl )[0];
313  spiceItem.m_model = GetSpiceField( SF_MODEL, comp, aCtl );
314  spiceItem.m_refName = comp->GetRef( &sheetList[sheet_idx] );
315 
316  // Duplicate references will result in simulation errors
317  if( refNames.count( spiceItem.m_refName ) )
318  {
319  DisplayError( NULL, wxT( "There are duplicate components. "
320  "You need to annotate schematics first." ) );
321  return false;
322  }
323 
324  refNames.insert( spiceItem.m_refName );
325 
326  // Check to see if component should be removed from Spice netlist
327  spiceItem.m_enabled = StringToBool( GetSpiceField( SF_ENABLED, comp, aCtl ) );
328 
329  if( fieldLibFile && !fieldLibFile->GetText().IsEmpty() )
330  m_libraries.insert( fieldLibFile->GetText() );
331 
332  wxArrayString pinNames;
333 
334  // Store pin information
335  for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
336  {
338 
339  // NETLIST_EXPORTER marks removed pins by setting them to NULL
340  if( !pin )
341  continue;
342 
343  spiceItem.m_pins.push_back( pin );
344  pinNames.Add( pin->GetPinNumText() );
345 
346  // Create net mapping
347  const wxString& netName = pin->GetNetName();
348  if( m_netMap.count( netName ) == 0 )
349  m_netMap[netName] = netIdx++;
350  }
351 
352  // Check if an alternative pin sequence is available:
353  if( fieldSeq )
354  {
355  // Get the string containing the sequence of nodes:
356  const wxString nodeSeqIndexLineStr = fieldSeq->GetText();
357 
358  // Verify field exists and is not empty:
359  if( !nodeSeqIndexLineStr.IsEmpty() )
360  {
361  // Get Alt Pin Name Array From User:
362  wxStringTokenizer tkz( nodeSeqIndexLineStr, delimiters );
363 
364  while( tkz.HasMoreTokens() )
365  {
366  wxString pinIndex = tkz.GetNextToken();
367  int seq;
368 
369  // Find PinName In Standard List assign Standard List Index to Name:
370  seq = pinNames.Index( pinIndex );
371 
372  if( seq != wxNOT_FOUND )
373  spiceItem.m_pinSequence.push_back( seq );
374  }
375  }
376  }
377 
378  m_spiceItems.push_back( spiceItem );
379  }
380  }
381 
382  return true;
383 }
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:52
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.
UNIQUE_STRINGS m_ReferencesAlreadyFound
Used for "multi parts per package" components, avoids processing a lib component more than once.
std::set< wxString > m_libraries
Libraries used by the simulated circuit
SCH_COMPONENT * m_parent
Schematic component represented by this SPICE_ITEM.
const wxString GetText() const override
Function GetText returns the string associated with the text object.
Definition: sch_field.cpp:105
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.
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
EDA_ITEM * Next() const
Definition: base_struct.h:212
NET_INDEX_MAP m_netMap
Maps circuit nodes to net names
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:56
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.
const wxString & GetPinNumText() const
Function GetPinNum returns a pin number in wxString form.
NETLIST_OBJECTS m_SortedComponentPinList
yes ownership, connected items flat list
NETLIST_OBJECT * GetItem(unsigned aIdx) const
Acces to an item in list.
wxString GetNetName(bool adoptTimestamp=false) const
Function GetNetName.
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:73
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:157
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:244

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(), NETLIST_EXPORTER_PSPICE::GetSpiceField(), NETLIST_EXPORTER_PSPICE::GetSpiceFieldName(), SCH_FIELD::GetText(), SPICE_ITEM::m_enabled, NETLIST_OBJECT::m_Flag, NETLIST_EXPORTER_PSPICE::m_libraries, NETLIST_EXPORTER::m_masterList, SPICE_ITEM::m_model, NETLIST_EXPORTER_PSPICE::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, NETLIST_EXPORTER_PSPICE::m_spiceItems, SF_ENABLED, SF_LIB_FILE, SF_MODEL, SF_NODE_SEQUENCE, SF_PRIMITIVE, NETLIST_EXPORTER_PSPICE::StringToBool(), and NETLIST_EXPORTER_PSPICE::UpdateDirectives().

Referenced by NETLIST_EXPORTER_PSPICE::Format().

◆ ReplaceForbiddenChars()

void NETLIST_EXPORTER_PSPICE::ReplaceForbiddenChars ( wxString &  aNetName)
staticinherited

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 67 of file netlist_exporter_pspice.cpp.

68 {
69  // some chars are not accepted in netnames in spice netlists, because they are separators
70  // they are replaced an underscore or some other allowed char.
71  // Note: this is a static function
72 
73  aNetName.Replace( "(", "_" );
74  aNetName.Replace( ")", "_" );
75 }

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

◆ SetSimCommand()

void NETLIST_EXPORTER_PSPICE_SIM::SetSimCommand ( const wxString &  aCmd)
inline

Overrides the simulation command directive.

Definition at line 64 of file netlist_exporter_pspice_sim.h.

65  {
66  m_simCommand = aCmd;
67  }
wxString m_simCommand
Custom simulation command (has priority over the schematic sheet simulation commands)

References m_simCommand.

◆ sprintPinNetName()

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 73 of file netlist_exporter.cpp.

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

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

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

◆ StringToBool()

static bool NETLIST_EXPORTER_PSPICE::StringToBool ( const wxString &  aStr)
inlinestaticinherited

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

Definition at line 214 of file netlist_exporter_pspice.h.

215  {
216  if( aStr.IsEmpty() )
217  return false;
218 
219  char c = tolower( aStr[0] );
220 
221  // Different ways of saying false (no/false/0)
222  return !( c == 'n' || c == 'f' || c == '0' );
223  }

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

◆ UpdateDirectives()

void NETLIST_EXPORTER_PSPICE::UpdateDirectives ( unsigned  aCtl)
inherited

Updates the vector of Spice directives placed in the schematics.

Definition at line 386 of file netlist_exporter_pspice.cpp.

387 {
388  const SCH_SHEET_LIST& sheetList = g_RootSheet;
389  wxRegEx couplingK( "^[kK][[:digit:]]*[[:space:]]+[[:alnum:]]+[[:space:]]+[[:alnum:]]+",
390  wxRE_ADVANCED );
391 
392  m_directives.clear();
393  bool controlBlock = false;
394 
395  for( unsigned i = 0; i < sheetList.size(); i++ )
396  {
397  for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
398  {
399  if( item->Type() != SCH_TEXT_T )
400  continue;
401 
402  wxString text = static_cast<SCH_TEXT*>( item )->GetText();
403 
404  if( text.IsEmpty() )
405  continue;
406 
407  // Analyze each line of a text field
408  wxStringTokenizer tokenizer( text, "\r\n" );
409 
410  // Flag to follow multiline directives
411  bool directiveStarted = false;
412 
413  while( tokenizer.HasMoreTokens() )
414  {
415  wxString line( tokenizer.GetNextToken() );
416 
417  // Cleanup: remove preceding and trailing white-space characters
418  line.Trim( true ).Trim( false );
419  // Convert to lower-case for parsing purposes only
420  wxString lowercaseline = line;
421  lowercaseline.MakeLower();
422 
423  // 'Include' directive stores the library file name, so it
424  // can be later resolved using a list of paths
425  if( lowercaseline.StartsWith( ".inc" ) )
426  {
427  wxString lib = line.AfterFirst( ' ' );
428 
429  if( lib.IsEmpty() )
430  continue;
431 
432  // Strip quotes if present
433  if( ( lib.StartsWith( "\"" ) && lib.EndsWith( "\"" ) )
434  || ( lib.StartsWith( "'" ) && lib.EndsWith( "'" ) ) )
435  {
436  lib = lib.Mid( 1, lib.Length() - 2 );
437  }
438 
439  m_libraries.insert( lib );
440  }
441 
442  // Store the title to be sure it appears
443  // in the first line of output
444  else if( lowercaseline.StartsWith( ".title " ) )
445  {
446  m_title = line.AfterFirst( ' ' );
447  }
448 
449  // Handle .control .. .endc blocks
450  else if( lowercaseline.IsSameAs( ".control" ) && ( !controlBlock ) )
451  {
452  controlBlock = true;
453  m_directives.push_back( line );
454  }
455  else if( lowercaseline.IsSameAs( ".endc" ) && controlBlock )
456  {
457  controlBlock = false;
458  m_directives.push_back( line );
459  }
460 
461  else if( line.StartsWith( '.' ) // one-line directives
462  || controlBlock // .control .. .endc block
463  || couplingK.Matches( line ) // K## L## L## coupling constant
464  || ( directiveStarted && line.StartsWith( '+' ) ) ) // multiline directives
465  {
466  m_directives.push_back( line );
467  }
468 
469  // Mark directive as started or continued in case it is a multi-line one
470  directiveStarted = line.StartsWith( '.' )
471  || ( directiveStarted && line.StartsWith( '+' ) );
472  }
473  }
474  }
475 }
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
EDA_ITEM * Next() const
Definition: base_struct.h:212
wxString m_title
Spice simulation title found in the processed schematic sheet
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:56
size_t i
Definition: json11.cpp:597
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:157

References g_RootSheet, i, NETLIST_EXPORTER_PSPICE::m_directives, NETLIST_EXPORTER_PSPICE::m_libraries, NETLIST_EXPORTER_PSPICE::m_title, and SCH_TEXT_T.

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

◆ writeDirectives()

void NETLIST_EXPORTER_PSPICE_SIM::writeDirectives ( OUTPUTFORMATTER aFormatter,
unsigned  aCtl 
) const
overrideprotectedvirtual

Saves the Spice directives.

Todo:
is it required to switch to lowercase

Reimplemented from NETLIST_EXPORTER_PSPICE.

Definition at line 129 of file netlist_exporter_pspice_sim.cpp.

130 {
131  // Add a directive to obtain currents
132  //aFormatter->Print( 0, ".options savecurrents\n" ); // does not work :(
133 
134  for( const auto& item : GetSpiceItems() )
135  {
136  for( const auto& current :
138  {
139  if( !item.m_enabled )
140  continue;
141 
143  aFormatter->Print( 0, ".save %s\n",
144  (const char*) GetSpiceVector( item.m_refName, SPT_CURRENT, current ).c_str() );
145  }
146  }
147 
148  // If we print out .save directives for currents, then it needs to be done for voltages as well
149  for( const auto& netMap : GetNetIndexMap() )
150  {
151  aFormatter->Print( 0, ".save %s\n",
152  (const char*) GetSpiceVector( netMap.first, SPT_VOLTAGE ).c_str() );
153  }
154 
155  if( m_simCommand.IsEmpty() )
156  {
157  // Fallback to the default behavior and just write all directives
158  NETLIST_EXPORTER_PSPICE::writeDirectives( aFormatter, aCtl );
159  }
160  else
161  {
162  // Dump all directives but simulation commands
163  for( const auto& dir : GetDirectives() )
164  {
165  if( !IsSimCommand( dir ) )
166  aFormatter->Print( 0, "%s\n", (const char*) dir.c_str() );
167  }
168 
169  // Finish with our custom simulation command
170  aFormatter->Print( 0, "%s\n", (const char*) m_simCommand.c_str() );
171  }
172 }
wxString m_simCommand
Custom simulation command (has priority over the schematic sheet simulation commands)
const SPICE_ITEM_LIST & GetSpiceItems() const
Returns list of items representing schematic components in the Spice world.
const std::vector< wxString > GetDirectives() const
Returnss a vector of Spice directives found in the schematics.
static bool IsSimCommand(const wxString &aCmd)
Determines if a directive is a simulation command.
static const std::vector< wxString > & GetCurrents(SPICE_PRIMITIVE aPrimitive)
Returns a list of currents that can be probed in a Spice primitive.
virtual void writeDirectives(OUTPUTFORMATTER *aFormatter, unsigned aCtl) const
Saves the Spice directives.
wxString GetSpiceVector(const wxString &aName, SIM_PLOT_TYPE aType, const wxString &aParam=wxEmptyString) const
Returns name of Spice dataset for a specific plot.
const NET_INDEX_MAP & GetNetIndexMap() const
Returns a map of circuit nodes to net names.
SPICE_PRIMITIVE
Basic Spice component primitives
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References GetCurrents(), NETLIST_EXPORTER_PSPICE::GetDirectives(), NETLIST_EXPORTER_PSPICE::GetNetIndexMap(), NETLIST_EXPORTER_PSPICE::GetSpiceItems(), GetSpiceVector(), IsSimCommand(), m_simCommand, OUTPUTFORMATTER::Print(), SPT_CURRENT, SPT_VOLTAGE, and NETLIST_EXPORTER_PSPICE::writeDirectives().

◆ WriteNetlist()

bool NETLIST_EXPORTER_PSPICE::WriteNetlist ( const wxString &  aOutFileName,
unsigned  aNetlistOptions 
)
overridevirtualinherited

Function WriteNetlist writes to specified output file.

Reimplemented from NETLIST_EXPORTER.

Definition at line 60 of file netlist_exporter_pspice.cpp.

61 {
62  FILE_OUTPUTFORMATTER outputFile( aOutFileName, wxT( "wt" ), '\'' );
63 
64  return Format( &outputFile, aNetlistOptions );
65 }
bool Format(OUTPUTFORMATTER *aFormatter, unsigned aCtl)
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492

References NETLIST_EXPORTER_PSPICE::Format().

Member Data Documentation

◆ m_LibParts

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

◆ m_masterList

◆ m_ReferencesAlreadyFound

UNIQUE_STRINGS NETLIST_EXPORTER::m_ReferencesAlreadyFound
protectedinherited

◆ m_simCommand

wxString NETLIST_EXPORTER_PSPICE_SIM::m_simCommand
private

Custom simulation command (has priority over the schematic sheet simulation commands)

Definition at line 116 of file netlist_exporter_pspice_sim.h.

Referenced by ClearSimCommand(), GetSimCommand(), GetSimType(), SetSimCommand(), and writeDirectives().

◆ m_SortedComponentPinList

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: