KiCad PCB EDA Suite
NETLIST_EXPORTER_PSPICE Class Reference

Generate a PSPICE compatible netlist. More...

#include <netlist_exporter_pspice.h>

Inheritance diagram for NETLIST_EXPORTER_PSPICE:
NETLIST_EXPORTER_BASE NETLIST_EXPORTER_PSPICE_SIM

Public Types

typedef std::list< SPICE_ITEMSPICE_ITEM_LIST
 Net name to circuit node number mapping. More...
 
typedef std::map< wxString, int > NET_INDEX_MAP
 

Public Member Functions

 NETLIST_EXPORTER_PSPICE (SCHEMATIC_IFACE *aSchematic)
 
virtual ~NETLIST_EXPORTER_PSPICE ()
 
const SPICE_ITEM_LISTGetSpiceItems () const
 Return list of items representing schematic components in the Spice world. More...
 
wxString GetSpiceDevice (const wxString &aSymbol) const
 Return name of Spice device corresponding to a schematic symbol. More...
 
bool WriteNetlist (const wxString &aOutFileName, unsigned aNetlistOptions) override
 Write to specified output file. More...
 
bool Format (OUTPUTFORMATTER *aFormatter, unsigned aCtl)
 
bool ProcessNetlist (unsigned aCtl)
 Process the netlist to create net mapping and a list of SPICE_ITEMs. More...
 
const NET_INDEX_MAPGetNetIndexMap () const
 Return a map of circuit nodes to net names. More...
 
void UpdateDirectives (unsigned aCtl)
 Update the vector of Spice directives placed in the schematics. More...
 
const std::vector< wxString > GetDirectives () const
 Return a vector of Spice directives found in the schematics. More...
 

Static Public Member Functions

static void ReplaceForbiddenChars (wxString &aNetName)
 Replace illegal spice net name characters with an underscore. More...
 
static const std::vector< wxString > & GetSpiceFields ()
 Return a vector of component field names related to Spice simulation. More...
 
static const wxString & GetSpiceFieldName (SPICE_FIELD aField)
 Return a string used for a particular component field related to Spice simulation. More...
 
static wxString GetSpiceField (SPICE_FIELD aField, SCH_SYMBOL *aSymbol, unsigned aCtl)
 Retrieve either the requested field value or the default value. More...
 
static wxString GetSpiceFieldDefVal (SPICE_FIELD aField, SCH_SYMBOL *aSymbol, unsigned aCtl)
 Retrieve the default value for a given field. More...
 
static bool StringToBool (const wxString &aStr)
 Convert 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)
 Build 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
 Save the Spice directives. More...
 
void CreatePinList (SCH_SYMBOL *aSymbol, SCH_SHEET_PATH *aSheetPath, bool aKeepUnconnectedPins)
 Find a symbol from the DrawList and builds its pin list in m_sortedSymbolPinList. More...
 
SCH_SYMBOLfindNextSymbol (EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
 Check if the given symbol should be processed for netlisting. More...
 
void eraseDuplicatePins ()
 Erase duplicate pins from m_sortedSymbolPinList (i.e. More...
 
void findAllUnitsOfSymbol (SCH_SYMBOL *aSchSymbol, LIB_SYMBOL *aLibSymbol, SCH_SHEET_PATH *aSheetPath, bool aKeepUnconnectedPins)
 Find all units for symbols with multiple symbols per package. More...
 

Protected Attributes

std::vector< PIN_INFOm_sortedSymbolPinList
 Used to temporarily store and filter the list of pins of a schematic symbol when generating schematic symbol data in netlist (comp section). More...
 
UNIQUE_STRINGS m_referencesAlreadyFound
 Used for "multiple symbols per package" symbols to avoid processing a lib symbol more than once. More...
 
std::set< LIB_SYMBOL *, LIB_SYMBOL_LESS_THANm_libParts
 unique library symbols used. LIB_SYMBOL items are sorted by names More...
 
SCHEMATIC_IFACEm_schematic
 The schematic we're generating a netlist for. More...
 
SCH_SHEET_PATH m_savedCurrentSheet
 The schematic's CurrentSheet when we entered. Restore on exiting. More...
 

Private Attributes

wxString m_title
 < Spice simulation title found in the processed schematic sheet More...
 
std::vector< wxString > m_directives
 Libraries used by the simulated circuit. More...
 
std::set< wxString > m_libraries
 Map circuit nodes to net names. More...
 
NET_INDEX_MAP m_netMap
 List of items representing schematic components in the Spice world. More...
 
SPICE_ITEM_LIST m_spiceItems
 

Static Private Attributes

static const std::vector< wxString > m_spiceFields
 

Detailed Description

Generate a PSPICE compatible netlist.

Definition at line 101 of file netlist_exporter_pspice.h.

Member Typedef Documentation

◆ NET_INDEX_MAP

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

Definition at line 116 of file netlist_exporter_pspice.h.

◆ SPICE_ITEM_LIST

Net name to circuit node number mapping.

Definition at line 113 of file netlist_exporter_pspice.h.

Constructor & Destructor Documentation

◆ NETLIST_EXPORTER_PSPICE()

NETLIST_EXPORTER_PSPICE::NETLIST_EXPORTER_PSPICE ( SCHEMATIC_IFACE aSchematic)
inline

Definition at line 104 of file netlist_exporter_pspice.h.

104  :
105  NETLIST_EXPORTER_BASE( aSchematic )
106  {
107  }
NETLIST_EXPORTER_BASE(SCHEMATIC_IFACE *aSchematic)

◆ ~NETLIST_EXPORTER_PSPICE()

virtual NETLIST_EXPORTER_PSPICE::~NETLIST_EXPORTER_PSPICE ( )
inlinevirtual

Definition at line 109 of file netlist_exporter_pspice.h.

110  {
111  }

Member Function Documentation

◆ CreatePinList()

void NETLIST_EXPORTER_BASE::CreatePinList ( SCH_SYMBOL aSymbol,
SCH_SHEET_PATH aSheetPath,
bool  aKeepUnconnectedPins 
)
protectedinherited

Find a symbol from the DrawList and builds its pin list in m_sortedSymbolPinList.

This list is sorted by pin number. The symbol is the next actual symbol after aSymbol. Power symbols and virtual symbols that have their reference designators starting with '#' are skipped. if aKeepUnconnectedPins = false, unconnected pins will be removed from list but usually we need all pins in netlists.

Definition at line 121 of file netlist_exporter_base.cpp.

124 {
125  wxString ref( aSymbol->GetRef( aSheetPath ) );
126 
127  // Power symbols and other symbols which have the reference starting with "#" are not
128  // included in netlist (pseudo or virtual symbols)
129 
130  if( ref[0] == wxChar( '#' ) )
131  return;
132 
133  // if( aSymbol->m_FlagControlMulti == 1 )
134  // continue; /* yes */
135  // removed because with multiple instances of one schematic (several sheets pointing to
136  // 1 screen), this will be erroneously be toggled.
137 
138  if( !aSymbol->GetLibSymbolRef() )
139  return;
140 
141  m_sortedSymbolPinList.clear();
142 
143  // If symbol is a "multi parts per package" type
144  if( aSymbol->GetLibSymbolRef()->GetUnitCount() > 1 )
145  {
146  // Collect all pins for this reference designator by searching the entire design for
147  // other parts with the same reference designator.
148  // This is only done once, it would be too expensive otherwise.
149  findAllUnitsOfSymbol( aSymbol, aSymbol->GetLibSymbolRef().get(),
150  aSheetPath, aKeepUnconnectedPins );
151  }
152 
153  else // GetUnitCount() <= 1 means one part per package
154  {
156 
157  for( const SCH_PIN* pin : aSymbol->GetPins( aSheetPath ) )
158  {
159  if( SCH_CONNECTION* conn = pin->Connection( aSheetPath ) )
160  {
161  const wxString& netName = conn->Name();
162 
163  if( !aKeepUnconnectedPins ) // Skip unconnected pins if requested
164  {
165  CONNECTION_SUBGRAPH* sg = graph->FindSubgraphByName( netName, *aSheetPath );
166 
167  if( !sg || sg->m_no_connect || sg->m_items.size() < 2 )
168  continue;
169  }
170 
171  m_sortedSymbolPinList.emplace_back( pin->GetShownNumber(), netName );
172  }
173  }
174  }
175 
176  // Sort pins in m_SortedSymbolPinList by pin number
178 
179  // Remove duplicate Pins in m_SortedSymbolPinList
181 
182  // record the usage of this library symbol
183  m_libParts.insert( aSymbol->GetLibSymbolRef().get() ); // rejects non-unique pointers
184 }
CONNECTION_SUBGRAPH * FindSubgraphByName(const wxString &aNetName, const SCH_SHEET_PATH &aPath)
Returns the subgraph for a given net name on a given sheet.
std::vector< PIN_INFO > m_sortedSymbolPinList
Used to temporarily store and filter the list of pins of a schematic symbol when generating schematic...
Calculates the connectivity of a schematic and generates netlists.
void eraseDuplicatePins()
Erase duplicate pins from m_sortedSymbolPinList (i.e.
virtual CONNECTION_GRAPH * ConnectionGraph() const =0
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
Definition: sch_symbol.cpp:432
static bool sortPinsByNum(PIN_INFO &aPin1, PIN_INFO &aPin2)
Comparison routine for sorting by pin numbers.
A subgraph is a set of items that are electrically connected on a single sheet.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:164
SCHEMATIC_IFACE * m_schematic
The schematic we're generating a netlist for.
std::vector< SCH_ITEM * > m_items
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void findAllUnitsOfSymbol(SCH_SYMBOL *aSchSymbol, LIB_SYMBOL *aLibSymbol, SCH_SHEET_PATH *aSheetPath, bool aKeepUnconnectedPins)
Find all units for symbols with multiple symbols per package.
SCH_ITEM * m_no_connect
No-connect item in graph, if any.
std::set< LIB_SYMBOL *, LIB_SYMBOL_LESS_THAN > m_libParts
unique library symbols used. LIB_SYMBOL items are sorted by names
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
Definition: sch_symbol.cpp:857

References SCHEMATIC_IFACE::ConnectionGraph(), NETLIST_EXPORTER_BASE::eraseDuplicatePins(), NETLIST_EXPORTER_BASE::findAllUnitsOfSymbol(), CONNECTION_GRAPH::FindSubgraphByName(), SCH_SYMBOL::GetLibSymbolRef(), SCH_SYMBOL::GetPins(), SCH_SYMBOL::GetRef(), CONNECTION_SUBGRAPH::m_items, NETLIST_EXPORTER_BASE::m_libParts, CONNECTION_SUBGRAPH::m_no_connect, NETLIST_EXPORTER_BASE::m_schematic, NETLIST_EXPORTER_BASE::m_sortedSymbolPinList, pin, and sortPinsByNum().

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

◆ eraseDuplicatePins()

void NETLIST_EXPORTER_BASE::eraseDuplicatePins ( )
protectedinherited

Erase duplicate pins from m_sortedSymbolPinList (i.e.

set pointer in this list to NULL).

(This is a list of pins found in the whole schematic, for a single symbol.) These duplicate pins were put in list because some pins (power pins...) are found more than once when in "multiple symbols per package" symbols. For instance, a 74ls00 has 4 symbols, 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 187 of file netlist_exporter_base.cpp.

188 {
189  for( unsigned ii = 0; ii < m_sortedSymbolPinList.size(); ii++ )
190  {
191  if( m_sortedSymbolPinList[ii].num.empty() ) /* already deleted */
192  continue;
193 
194  /* Search for duplicated pins
195  * If found, remove duplicates. The priority is to keep connected pins
196  * and remove unconnected
197  * - So this allows (for instance when using multi op amps per package
198  * - to connect only one op amp to power
199  * Because the pin list is sorted by m_PinNum value, duplicated pins
200  * are necessary successive in list
201  */
202  int idxref = ii;
203 
204  for( unsigned jj = ii + 1; jj < m_sortedSymbolPinList.size(); jj++ )
205  {
206  if( m_sortedSymbolPinList[jj].num.empty() ) // Already removed
207  continue;
208 
209  // if other pin num, stop search,
210  // because all pins having the same number are consecutive in list.
211  if( m_sortedSymbolPinList[idxref].num != m_sortedSymbolPinList[jj].num )
212  break;
213 
214  m_sortedSymbolPinList[jj].num.clear();
215  }
216  }
217 }
std::vector< PIN_INFO > m_sortedSymbolPinList
Used to temporarily store and filter the list of pins of a schematic symbol when generating schematic...

References NETLIST_EXPORTER_BASE::m_sortedSymbolPinList.

Referenced by NETLIST_EXPORTER_BASE::CreatePinList().

◆ findAllUnitsOfSymbol()

void NETLIST_EXPORTER_BASE::findAllUnitsOfSymbol ( SCH_SYMBOL aSchSymbol,
LIB_SYMBOL aLibSymbol,
SCH_SHEET_PATH aSheetPath,
bool  aKeepUnconnectedPins 
)
protectedinherited

Find all units for symbols with multiple symbols per package.

Search the entire design for all units of aSymbol based on matching reference designator, and for each unit, add all its pins to the temporary sorted pin list, m_sortedSymbolPinList. if aKeepUnconnectedPins = false, unconnected pins will be removed from list but usually we need all pins in netlists.

Definition at line 220 of file netlist_exporter_base.cpp.

223 {
224  wxString ref = aSchSymbol->GetRef( aSheetPath );
225  wxString ref2;
226 
227  SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
229 
230  for( unsigned i = 0; i < sheetList.size(); i++ )
231  {
232  SCH_SHEET_PATH& sheet = sheetList[i];
233 
234  for( SCH_ITEM* item : sheetList[i].LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
235  {
236  SCH_SYMBOL* comp2 = static_cast<SCH_SYMBOL*>( item );
237 
238  ref2 = comp2->GetRef( &sheet );
239 
240  if( ref2.CmpNoCase( ref ) != 0 )
241  continue;
242 
243  for( const SCH_PIN* pin : comp2->GetPins( &sheet ) )
244  {
245  if( SCH_CONNECTION* conn = pin->Connection( &sheet ) )
246  {
247  const wxString& netName = conn->Name();
248 
249  if( !aKeepUnconnectedPins ) // Skip unconnected pins if requested
250  {
251  CONNECTION_SUBGRAPH* sg = graph->FindSubgraphByName( netName, sheet );
252 
253  if( !sg || sg->m_no_connect || sg->m_items.size() < 2 )
254  continue;
255  }
256 
257  m_sortedSymbolPinList.emplace_back( pin->GetShownNumber(), netName );
258  }
259  }
260  }
261  }
262 }
CONNECTION_SUBGRAPH * FindSubgraphByName(const wxString &aNetName, const SCH_SHEET_PATH &aPath)
Returns the subgraph for a given net name on a given sheet.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
std::vector< PIN_INFO > m_sortedSymbolPinList
Used to temporarily store and filter the list of pins of a schematic symbol when generating schematic...
Calculates the connectivity of a schematic and generates netlists.
virtual CONNECTION_GRAPH * ConnectionGraph() const =0
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
Definition: sch_symbol.cpp:432
A subgraph is a set of items that are electrically connected on a single sheet.
SCHEMATIC_IFACE * m_schematic
The schematic we're generating a netlist for.
std::vector< SCH_ITEM * > m_items
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Schematic symbol object.
Definition: sch_symbol.h:78
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
SCH_ITEM * m_no_connect
No-connect item in graph, if any.
virtual SCH_SHEET_LIST GetSheets() const =0
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
Definition: sch_symbol.cpp:857

References SCHEMATIC_IFACE::ConnectionGraph(), CONNECTION_GRAPH::FindSubgraphByName(), SCH_SYMBOL::GetPins(), SCH_SYMBOL::GetRef(), SCHEMATIC_IFACE::GetSheets(), CONNECTION_SUBGRAPH::m_items, CONNECTION_SUBGRAPH::m_no_connect, NETLIST_EXPORTER_BASE::m_schematic, NETLIST_EXPORTER_BASE::m_sortedSymbolPinList, pin, and SCH_SYMBOL_T.

Referenced by NETLIST_EXPORTER_BASE::CreatePinList().

◆ findNextSymbol()

SCH_SYMBOL * NETLIST_EXPORTER_BASE::findNextSymbol ( EDA_ITEM aItem,
SCH_SHEET_PATH aSheetPath 
)
protectedinherited

Check if the given symbol should be processed for netlisting.

Prevent processing multi-unit symbols more than once, etc.

Parameters
aItemis a symbol to check
aSheetPathis the sheet to check the symbol for
Returns
the symbol if it should be processed, or nullptr

Definition at line 73 of file netlist_exporter_base.cpp.

74 {
75  wxString ref;
76 
77  if( aItem->Type() != SCH_SYMBOL_T )
78  return nullptr;
79 
80  // found next symbol
81  SCH_SYMBOL* symbol = (SCH_SYMBOL*) aItem;
82 
83  // Power symbols and other symbols which have the reference starting with "#" are not
84  // included in netlist (pseudo or virtual symbols)
85  ref = symbol->GetRef( aSheetPath );
86 
87  if( ref[0] == wxChar( '#' ) )
88  return nullptr;
89 
90  // if( symbol->m_FlagControlMulti == 1 )
91  // continue; /* yes */
92  // removed because with multiple instances of one schematic (several sheets pointing to
93  // 1 screen), this will be erroneously be toggled.
94 
95  if( !symbol->GetLibSymbolRef() )
96  return nullptr;
97 
98  // If symbol is a "multi parts per package" type
99  if( symbol->GetLibSymbolRef()->GetUnitCount() > 1 )
100  {
101  // test if this reference has already been processed, and if so skip
102  if( m_referencesAlreadyFound.Lookup( ref ) )
103  return nullptr;
104  }
105 
106  // record the usage of this library symbol entry.
107  m_libParts.insert( symbol->GetLibSymbolRef().get() ); // rejects non-unique pointers
108 
109  return symbol;
110 }
bool Lookup(const wxString &aString)
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
Definition: sch_symbol.cpp:432
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:164
UNIQUE_STRINGS m_referencesAlreadyFound
Used for "multiple symbols per package" symbols to avoid processing a lib symbol more than once.
Schematic symbol object.
Definition: sch_symbol.h:78
std::set< LIB_SYMBOL *, LIB_SYMBOL_LESS_THAN > m_libParts
unique library symbols used. LIB_SYMBOL items are sorted by names
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:113

References SCH_SYMBOL::GetLibSymbolRef(), SCH_SYMBOL::GetRef(), UNIQUE_STRINGS::Lookup(), NETLIST_EXPORTER_BASE::m_libParts, NETLIST_EXPORTER_BASE::m_referencesAlreadyFound, SCH_SYMBOL_T, and EDA_ITEM::Type().

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

◆ Format()

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

Definition at line 84 of file netlist_exporter_pspice.cpp.

85 {
86  // Netlist options
87  const bool useNetcodeAsNetName = false;//aCtl & NET_USE_NETCODES_AS_NETNAMES;
88 
89  // default title
90  m_title = "KiCad schematic";
91 
92  if( !ProcessNetlist( aCtl ) )
93  return false;
94 
95  aFormatter->Print( 0, ".title %s\n", TO_UTF8( m_title ) );
96 
97  // Write .include directives
98  for( const wxString& curr_lib : m_libraries )
99  {
100  // First, expand env vars, if any
101  wxString libname = ExpandEnvVarSubstitutions( curr_lib, &m_schematic->Prj() );
102  wxString full_path;
103 
104  if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) )
105  {
106  // Look for the library in known search locations
107  full_path = ResolveFile( libname, &Pgm().GetLocalEnvVariables(), &m_schematic->Prj() );
108 
109  if( full_path.IsEmpty() )
110  {
111  DisplayError( nullptr, wxString::Format( _( "Could not find library file %s." ),
112  libname ) );
113  full_path = libname;
114  }
115  }
116  else
117  {
118  full_path = libname; // just use the unaltered path
119  }
120 
121  aFormatter->Print( 0, ".include \"%s\"\n", TO_UTF8( full_path ) );
122  }
123 
124  unsigned int NC_counter = 1;
125 
126  for( const SPICE_ITEM& item : m_spiceItems )
127  {
128  if( !item.m_enabled )
129  continue;
130 
131  wxString device = GetSpiceDevice( item.m_refName );
132  aFormatter->Print( 0, "%s ", TO_UTF8( device ) );
133 
134  size_t pspiceNodes =
135  item.m_pinSequence.empty() ? item.m_pins.size() : item.m_pinSequence.size();
136 
137  for( size_t ii = 0; ii < pspiceNodes; ii++ )
138  {
139  // Use the custom order if defined, otherwise use the standard pin order as defined
140  // in the symbol.
141  size_t activePinIndex = item.m_pinSequence.empty() ? ii : item.m_pinSequence[ii];
142 
143  // Valid used Node Indexes are in the set
144  // {0,1,2,...m_item.m_pin.size()-1}
145  if( activePinIndex >= item.m_pins.size() )
146  {
147  wxASSERT_MSG( false, "Used an invalid pin number in node sequence" );
148  continue;
149  }
150 
151  wxString netName = item.m_pins[activePinIndex];
152 
153  wxASSERT( m_netMap.count( netName ) );
154 
155  if( useNetcodeAsNetName )
156  {
157  aFormatter->Print( 0, "%d ", m_netMap[netName] );
158  }
159  else
160  {
161  // Replace parenthesis with underscore to prevent parse issues with simulators
162  ReplaceForbiddenChars( netName );
163 
164  // unescape net names that contain a escaped sequence ("{slash}"):
165  netName = UnescapeString( netName );
166 
167  // Borrow LTSpice's nomenclature for unconnected nets
168  if( netName.IsEmpty() )
169  netName = wxString::Format( wxT( "NC_%.2u" ), NC_counter++ );
170 
171  aFormatter->Print( 0, "%s ", TO_UTF8( netName ) );
172  }
173  }
174 
175  aFormatter->Print( 0, "%s\n", TO_UTF8( item.m_model ) );
176  }
177 
178  // Print out all directives found in the text fields on the schematics
179  writeDirectives( aFormatter, aCtl );
180 
181  aFormatter->Print( 0, ".end\n" );
182 
183  return true;
184 }
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:252
wxString ResolveFile(const wxString &aFileName, const ENV_VAR_MAP *aEnvVars, const PROJECT *aProject)
Search the default paths trying to find one with the requested file.
Definition: env_paths.cpp:152
std::set< wxString > m_libraries
Map circuit nodes to net names.
Structure to represent a schematic symbol in the Spice simulation.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, PROJECT *aProject)
Replace any environment variable & text variable references with their values.
Definition: common.cpp:279
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
SCHEMATIC_IFACE * m_schematic
The schematic we're generating a netlist for.
virtual PROJECT & Prj() const =0
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
wxString m_title
< Spice simulation title found in the processed schematic sheet
NET_INDEX_MAP m_netMap
List of items representing schematic components in the Spice world.
virtual void writeDirectives(OUTPUTFORMATTER *aFormatter, unsigned aCtl) const
Save the Spice directives.
wxString GetSpiceDevice(const wxString &aSymbol) const
Return name of Spice device corresponding to a schematic symbol.
bool ProcessNetlist(unsigned aCtl)
Process the netlist to create net mapping and a list of SPICE_ITEMs.
#define _(s)
static void ReplaceForbiddenChars(wxString &aNetName)
Replace illegal spice net name characters with an underscore.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
wxString UnescapeString(const wxString &aSource)
Definition: string.cpp:222
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:426

References _, DisplayError(), ExpandEnvVarSubstitutions(), Format(), GetSpiceDevice(), m_libraries, m_netMap, NETLIST_EXPORTER_BASE::m_schematic, m_spiceItems, m_title, NET_ADJUST_INCLUDE_PATHS, Pgm(), OUTPUTFORMATTER::Print(), SCHEMATIC_IFACE::Prj(), ProcessNetlist(), ReplaceForbiddenChars(), ResolveFile(), TO_UTF8, UnescapeString(), and writeDirectives().

Referenced by WriteNetlist().

◆ GetDirectives()

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

Return a vector of Spice directives found in the schematics.

Definition at line 203 of file netlist_exporter_pspice.h.

204  {
205  return m_directives;
206  }
std::vector< wxString > m_directives
Libraries used by the simulated circuit.

References m_directives.

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

◆ GetNetIndexMap()

const NET_INDEX_MAP& NETLIST_EXPORTER_PSPICE::GetNetIndexMap ( ) const
inline

Return a map of circuit nodes to net names.

Definition at line 164 of file netlist_exporter_pspice.h.

165  {
166  return m_netMap;
167  }
NET_INDEX_MAP m_netMap
List of items representing schematic components in the Spice world.

References m_netMap.

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

◆ GetSpiceDevice()

wxString NETLIST_EXPORTER_PSPICE::GetSpiceDevice ( const wxString &  aSymbol) const

Return name of Spice device corresponding to a schematic symbol.

Parameters
aSymbolis the component reference.
Returns
Spice device name or empty string if there is no such symbol 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 45 of file netlist_exporter_pspice.cpp.

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

References GetSpiceItems().

Referenced by NETLIST_EXPORTER_PSPICE_SIM::ComponentToVector(), DIALOG_SIM_SETTINGS::evaluateDCControls(), Format(), DIALOG_SIM_SETTINGS::TransferDataFromWindow(), and TUNER_SLIDER::TUNER_SLIDER().

◆ GetSpiceField()

wxString NETLIST_EXPORTER_PSPICE::GetSpiceField ( SPICE_FIELD  aField,
SCH_SYMBOL aSymbol,
unsigned  aCtl 
)
static

Retrieve either the requested field value or the default value.

Definition at line 187 of file netlist_exporter_pspice.cpp.

189 {
190  SCH_FIELD* field = aSymbol->FindField( GetSpiceFieldName( aField ) );
191  return field ? field->GetShownText() : GetSpiceFieldDefVal( aField, aSymbol, aCtl );
192 }
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:49
static const wxString & GetSpiceFieldName(SPICE_FIELD aField)
Return a string used for a particular component field related to Spice simulation.
wxString GetShownText(int aDepth=0) const override
Return the string actually shown after processing of the base text.
Definition: sch_field.cpp:106
static wxString GetSpiceFieldDefVal(SPICE_FIELD aField, SCH_SYMBOL *aSymbol, unsigned aCtl)
Retrieve the default value for a given field.
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
Definition: sch_symbol.cpp:734

References SCH_SYMBOL::FindField(), SCH_FIELD::GetShownText(), GetSpiceFieldDefVal(), and GetSpiceFieldName().

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

◆ GetSpiceFieldDefVal()

wxString NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal ( SPICE_FIELD  aField,
SCH_SYMBOL aSymbol,
unsigned  aCtl 
)
static

Retrieve the default value for a given field.

Definition at line 195 of file netlist_exporter_pspice.cpp.

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

References SCH_SYMBOL::GetField(), SCH_SYMBOL::GetLibSymbolRef(), SCH_FIELD::GetShownText(), NET_ADJUST_PASSIVE_VALS, pin, REFERENCE_FIELD, SF_ENABLED, SF_LIB_FILE, SF_MODEL, SF_NODE_SEQUENCE, SF_PRIMITIVE, and VALUE_FIELD.

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

◆ GetSpiceFieldName()

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

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

Definition at line 180 of file netlist_exporter_pspice.h.

181  {
182  return m_spiceFields[(int) aField];
183  }
static const std::vector< wxString > m_spiceFields

References m_spiceFields.

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

◆ GetSpiceFields()

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

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

Definition at line 172 of file netlist_exporter_pspice.h.

173  {
174  return m_spiceFields;
175  }
static const std::vector< wxString > m_spiceFields

References m_spiceFields.

Referenced by DIALOG_SPICE_MODEL::TransferDataToWindow().

◆ GetSpiceItems()

const SPICE_ITEM_LIST& NETLIST_EXPORTER_PSPICE::GetSpiceItems ( ) const
inline

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

Definition at line 121 of file netlist_exporter_pspice.h.

122  {
123  return m_spiceItems;
124  }

References m_spiceItems.

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

◆ MakeCommandLine()

wxString NETLIST_EXPORTER_BASE::MakeCommandLine ( const wxString &  aFormatString,
const wxString &  aNetlistFile,
const wxString &  aFinalFile,
const wxString &  aProjectDirectory 
)
staticinherited

Build 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 37 of file netlist_exporter_base.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)

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

271 {
272  const wxString delimiters( "{:,; }" );
273 
274  SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
275  // Set of reference names, to check for duplication
276  std::set<wxString> refNames;
277 
278  m_netMap.clear();
279  m_netMap["GND"] = 0; // 0 is reserved for "GND"
280  int netIdx = 1;
281 
282  m_libraries.clear();
284  m_libParts.clear();
285 
286  UpdateDirectives( aCtl );
287 
288  for( unsigned sheet_idx = 0; sheet_idx < sheetList.size(); sheet_idx++ )
289  {
290  SCH_SHEET_PATH sheet = sheetList[sheet_idx];
291 
292  // Process symbol attributes to find Spice directives
293  for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
294  {
295  SCH_SYMBOL* symbol = findNextSymbol( item, &sheet );
296 
297  if( !symbol )
298  continue;
299 
300  CreatePinList( symbol, &sheet, true );
301  SPICE_ITEM spiceItem;
302  spiceItem.m_parent = symbol;
303 
304  // Obtain Spice fields
305  SCH_FIELD* fieldLibFile = symbol->FindField( GetSpiceFieldName( SF_LIB_FILE ) );
306  SCH_FIELD* fieldSeq = symbol->FindField( GetSpiceFieldName( SF_NODE_SEQUENCE ) );
307 
308  spiceItem.m_primitive = GetSpiceField( SF_PRIMITIVE, symbol, aCtl )[0];
309  spiceItem.m_model = GetSpiceField( SF_MODEL, symbol, aCtl );
310  spiceItem.m_refName = symbol->GetRef( &sheet );
311 
312  // Duplicate references will result in simulation errors
313  if( refNames.count( spiceItem.m_refName ) )
314  {
315  DisplayError( nullptr, _( "Multiple symbols have the same reference designator.\n"
316  "Annotation must be corrected before simulating." ) );
317  return false;
318  }
319 
320  refNames.insert( spiceItem.m_refName );
321 
322  // Check to see if symbol should be removed from Spice netlist
323  spiceItem.m_enabled = StringToBool( GetSpiceField( SF_ENABLED, symbol, aCtl ) );
324 
325  if( fieldLibFile && !fieldLibFile->GetShownText().IsEmpty() )
326  m_libraries.insert( fieldLibFile->GetShownText() );
327 
328  wxArrayString pinNames;
329 
330  // Store pin information
331  for( const PIN_INFO& pin : m_sortedSymbolPinList )
332  {
333  // Create net mapping
334  spiceItem.m_pins.push_back( pin.netName );
335  pinNames.Add( pin.num );
336 
337  if( m_netMap.count( pin.netName ) == 0 )
338  m_netMap[pin.netName] = netIdx++;
339  }
340 
341  // Check if an alternative pin sequence is available:
342  if( fieldSeq )
343  {
344  // Get the string containing the sequence of nodes:
345  const wxString& nodeSeqIndexLineStr = fieldSeq->GetShownText();
346 
347  // Verify field exists and is not empty:
348  if( !nodeSeqIndexLineStr.IsEmpty() )
349  {
350  // Get Alt Pin Name Array From User:
351  wxStringTokenizer tkz( nodeSeqIndexLineStr, delimiters );
352 
353  while( tkz.HasMoreTokens() )
354  {
355  wxString pinIndex = tkz.GetNextToken();
356  int seq;
357 
358  // Find PinName In Standard List assign Standard List Index to Name:
359  seq = pinNames.Index( pinIndex );
360 
361  if( seq != wxNOT_FOUND )
362  spiceItem.m_pinSequence.push_back( seq );
363  }
364  }
365  }
366 
367  m_spiceItems.push_back( spiceItem );
368  }
369  }
370 
371  return true;
372 }
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:252
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:216
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:49
std::set< wxString > m_libraries
Map circuit nodes to net names.
std::vector< PIN_INFO > m_sortedSymbolPinList
Used to temporarily store and filter the list of pins of a schematic symbol when generating schematic...
Structure to represent a schematic symbol in the Spice simulation.
std::vector< wxString > m_pins
Numeric indices into m_SortedSymbolPinList.
static const wxString & GetSpiceFieldName(SPICE_FIELD aField)
Return a string used for a particular component field related to Spice simulation.
bool m_enabled
Array containing Standard Pin Name.
void Clear()
Erase the record.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
Definition: sch_symbol.cpp:432
static bool StringToBool(const wxString &aStr)
Convert typical boolean string values (no/yes, true/false, 1/0) to a boolean value.
SCH_SYMBOL * m_parent
< Schematic symbol represented by this SPICE_ITEM.
wxString GetShownText(int aDepth=0) const override
Return the string actually shown after processing of the base text.
Definition: sch_field.cpp:106
SCH_SYMBOL * findNextSymbol(EDA_ITEM *aItem, SCH_SHEET_PATH *aSheetPath)
Check if the given symbol should be processed for netlisting.
SCHEMATIC_IFACE * m_schematic
The schematic we're generating a netlist for.
UNIQUE_STRINGS m_referencesAlreadyFound
Used for "multiple symbols per package" symbols to avoid processing a lib symbol more than once.
wxString m_refName
Flag to indicate whether the symbol should be used in simulation.
NET_INDEX_MAP m_netMap
List of items representing schematic components in the Spice world.
void CreatePinList(SCH_SYMBOL *aSymbol, SCH_SHEET_PATH *aSheetPath, bool aKeepUnconnectedPins)
Find a symbol from the DrawList and builds its pin list in m_sortedSymbolPinList.
void UpdateDirectives(unsigned aCtl)
Update the vector of Spice directives placed in the schematics.
#define _(s)
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
Definition: sch_symbol.cpp:734
static wxString GetSpiceField(SPICE_FIELD aField, SCH_SYMBOL *aSymbol, unsigned aCtl)
Retrieve either the requested field value or the default value.
Schematic symbol object.
Definition: sch_symbol.h:78
SCH_SCREEN * LastScreen()
EE_RTREE & Items()
Definition: sch_screen.h:102
wxChar m_primitive
Library model (for semiconductors and subcircuits), component value (for passive components) or volta...
std::vector< int > m_pinSequence
std::set< LIB_SYMBOL *, LIB_SYMBOL_LESS_THAN > m_libParts
unique library symbols used. LIB_SYMBOL items are sorted by names
virtual SCH_SHEET_LIST GetSheets() const =0
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197

References _, UNIQUE_STRINGS::Clear(), NETLIST_EXPORTER_BASE::CreatePinList(), DisplayError(), SCH_SYMBOL::FindField(), NETLIST_EXPORTER_BASE::findNextSymbol(), SCH_SYMBOL::GetRef(), SCHEMATIC_IFACE::GetSheets(), SCH_FIELD::GetShownText(), GetSpiceField(), GetSpiceFieldName(), SCH_SCREEN::Items(), SCH_SHEET_PATH::LastScreen(), SPICE_ITEM::m_enabled, NETLIST_EXPORTER_BASE::m_libParts, m_libraries, SPICE_ITEM::m_model, m_netMap, SPICE_ITEM::m_parent, SPICE_ITEM::m_pins, SPICE_ITEM::m_pinSequence, SPICE_ITEM::m_primitive, NETLIST_EXPORTER_BASE::m_referencesAlreadyFound, SPICE_ITEM::m_refName, NETLIST_EXPORTER_BASE::m_schematic, NETLIST_EXPORTER_BASE::m_sortedSymbolPinList, m_spiceItems, EE_RTREE::OfType(), pin, SCH_SYMBOL_T, SF_ENABLED, SF_LIB_FILE, SF_MODEL, SF_NODE_SEQUENCE, SF_PRIMITIVE, StringToBool(), and UpdateDirectives().

Referenced by Format().

◆ ReplaceForbiddenChars()

void NETLIST_EXPORTER_PSPICE::ReplaceForbiddenChars ( wxString &  aNetName)
static

Replace illegal spice net name characters with an underscore.

Parameters
aNetNameis the net name to modify.

Definition at line 72 of file netlist_exporter_pspice.cpp.

73 {
74  // some chars are not accepted in netnames in spice netlists, because they are separators
75  // they are replaced an underscore or some other allowed char.
76  // Note: this is a static function
77 
78  aNetName.Replace( "(", "_" );
79  aNetName.Replace( ")", "_" );
80  aNetName.Replace( " ", "_" );
81 }

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

◆ StringToBool()

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

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

Definition at line 211 of file netlist_exporter_pspice.h.

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

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

◆ UpdateDirectives()

void NETLIST_EXPORTER_PSPICE::UpdateDirectives ( unsigned  aCtl)

Update the vector of Spice directives placed in the schematics.

Definition at line 375 of file netlist_exporter_pspice.cpp.

376 {
377  const SCH_SHEET_LIST& sheetList = m_schematic->GetSheets();
378  wxRegEx couplingK( "^[kK][[:digit:]]*[[:space:]]+[[:alnum:]]+[[:space:]]+[[:alnum:]]+",
379  wxRE_ADVANCED );
380 
381  m_directives.clear();
382  bool controlBlock = false;
383  bool circuitBlock = false;
384 
385  for( unsigned i = 0; i < sheetList.size(); i++ )
386  {
387  for( SCH_ITEM* item : sheetList[i].LastScreen()->Items().OfType( SCH_TEXT_T ) )
388  {
389  wxString text = static_cast<SCH_TEXT*>( item )->GetShownText();
390 
391  if( text.IsEmpty() )
392  continue;
393 
394  // Analyze each line of a text field
395  wxStringTokenizer tokenizer( text, "\r\n" );
396 
397  // Flag to follow multiline directives
398  bool directiveStarted = false;
399 
400  while( tokenizer.HasMoreTokens() )
401  {
402  wxString line( tokenizer.GetNextToken() );
403 
404  // Cleanup: remove preceding and trailing white-space characters
405  line.Trim( true ).Trim( false );
406  // Convert to lower-case for parsing purposes only
407  wxString lowercaseline = line;
408  lowercaseline.MakeLower();
409 
410  // 'Include' directive stores the library file name, so it
411  // can be later resolved using a list of paths
412  if( lowercaseline.StartsWith( ".inc" ) )
413  {
414  wxString lib = line.AfterFirst( ' ' );
415 
416  if( lib.IsEmpty() )
417  continue;
418 
419  // Strip quotes if present
420  if( ( lib.StartsWith( "\"" ) && lib.EndsWith( "\"" ) )
421  || ( lib.StartsWith( "'" ) && lib.EndsWith( "'" ) ) )
422  {
423  lib = lib.Mid( 1, lib.Length() - 2 );
424  }
425 
426  m_libraries.insert( lib );
427  }
428 
429  // Store the title to be sure it appears
430  // in the first line of output
431  else if( lowercaseline.StartsWith( ".title " ) )
432  {
433  m_title = line.AfterFirst( ' ' );
434  }
435 
436  else if( line.StartsWith( '.' ) // one-line directives
437  || controlBlock // .control .. .endc block
438  || circuitBlock // .subckt .. .ends block
439  || couplingK.Matches( line ) // K## L## L## coupling constant
440  || ( directiveStarted && line.StartsWith( '+' ) ) ) // multiline directives
441  {
442  m_directives.push_back( line );
443  }
444 
445  // Handle .control .. .endc blocks
446  if( lowercaseline.IsSameAs( ".control" ) && ( !controlBlock ) )
447  controlBlock = true;
448 
449  if( lowercaseline.IsSameAs( ".endc" ) && controlBlock )
450  controlBlock = false;
451 
452  // Handle .subckt .. .ends blocks
453  if( lowercaseline.StartsWith( ".subckt" ) && ( !circuitBlock ) )
454  circuitBlock = true;
455 
456  if( lowercaseline.IsSameAs( ".ends" ) && circuitBlock )
457  circuitBlock = false;
458 
459  // Mark directive as started or continued in case it is a multi-line one
460  directiveStarted = line.StartsWith( '.' )
461  || ( directiveStarted && line.StartsWith( '+' ) );
462  }
463  }
464  }
465 }
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
std::set< wxString > m_libraries
Map circuit nodes to net names.
std::vector< wxString > m_directives
Libraries used by the simulated circuit.
SCHEMATIC_IFACE * m_schematic
The schematic we're generating a netlist for.
wxString m_title
< Spice simulation title found in the processed schematic sheet
virtual SCH_SHEET_LIST GetSheets() const =0
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197

References SCHEMATIC_IFACE::GetSheets(), m_directives, m_libraries, NETLIST_EXPORTER_BASE::m_schematic, m_title, SCH_TEXT_T, and text.

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

◆ writeDirectives()

void NETLIST_EXPORTER_PSPICE::writeDirectives ( OUTPUTFORMATTER aFormatter,
unsigned  aCtl 
) const
protectedvirtual

Save the Spice directives.

Reimplemented in NETLIST_EXPORTER_PSPICE_SIM.

Definition at line 468 of file netlist_exporter_pspice.cpp.

469 {
470  for( const wxString& dir : m_directives )
471  {
472  aFormatter->Print( 0, "%s\n", TO_UTF8( dir ) );
473  }
474 }
std::vector< wxString > m_directives
Libraries used by the simulated circuit.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:426

References m_directives, OUTPUTFORMATTER::Print(), and TO_UTF8.

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

◆ WriteNetlist()

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

Write to specified output file.

Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.

Reimplemented from NETLIST_EXPORTER_BASE.

Definition at line 64 of file netlist_exporter_pspice.cpp.

65 {
66  FILE_OUTPUTFORMATTER outputFile( aOutFileName, wxT( "wt" ), '\'' );
67 
68  return Format( &outputFile, aNetlistOptions );
69 }
bool Format(OUTPUTFORMATTER *aFormatter, unsigned aCtl)
Used for text file output.
Definition: richio.h:456

References Format().

Member Data Documentation

◆ m_directives

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

Libraries used by the simulated circuit.

Definition at line 233 of file netlist_exporter_pspice.h.

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

◆ m_libParts

std::set<LIB_SYMBOL*, LIB_SYMBOL_LESS_THAN> NETLIST_EXPORTER_BASE::m_libParts
protectedinherited

◆ m_libraries

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

Map circuit nodes to net names.

Definition at line 236 of file netlist_exporter_pspice.h.

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

◆ m_netMap

NET_INDEX_MAP NETLIST_EXPORTER_PSPICE::m_netMap
private

List of items representing schematic components in the Spice world.

Definition at line 239 of file netlist_exporter_pspice.h.

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

◆ m_referencesAlreadyFound

UNIQUE_STRINGS NETLIST_EXPORTER_BASE::m_referencesAlreadyFound
protectedinherited

Used for "multiple symbols per package" symbols to avoid processing a lib symbol more than once.

Definition at line 101 of file netlist_exporter_base.h.

Referenced by NETLIST_EXPORTER_BASE::findNextSymbol(), NETLIST_EXPORTER_XML::makeSymbols(), ProcessNetlist(), NETLIST_EXPORTER_ORCADPCB2::WriteNetlist(), and NETLIST_EXPORTER_CADSTAR::WriteNetlist().

◆ m_savedCurrentSheet

SCH_SHEET_PATH NETLIST_EXPORTER_BASE::m_savedCurrentSheet
protectedinherited

The schematic's CurrentSheet when we entered. Restore on exiting.

Definition at line 110 of file netlist_exporter_base.h.

Referenced by NETLIST_EXPORTER_BASE::NETLIST_EXPORTER_BASE(), and NETLIST_EXPORTER_BASE::~NETLIST_EXPORTER_BASE().

◆ m_schematic

◆ m_sortedSymbolPinList

std::vector<PIN_INFO> NETLIST_EXPORTER_BASE::m_sortedSymbolPinList
protectedinherited

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

No ownership of members. TODO(snh): Descope this object

Definition at line 97 of file netlist_exporter_base.h.

Referenced by NETLIST_EXPORTER_BASE::CreatePinList(), NETLIST_EXPORTER_BASE::eraseDuplicatePins(), NETLIST_EXPORTER_BASE::findAllUnitsOfSymbol(), ProcessNetlist(), and NETLIST_EXPORTER_ORCADPCB2::WriteNetlist().

◆ m_spiceFields

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 245 of file netlist_exporter_pspice.h.

Referenced by GetSpiceFieldName(), and GetSpiceFields().

◆ m_spiceItems

SPICE_ITEM_LIST NETLIST_EXPORTER_PSPICE::m_spiceItems
private

Definition at line 242 of file netlist_exporter_pspice.h.

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

◆ m_title

wxString NETLIST_EXPORTER_PSPICE::m_title
private

< Spice simulation title found in the processed schematic sheet

Spice directives found in the processed schematic sheet

Definition at line 230 of file netlist_exporter_pspice.h.

Referenced by Format(), and UpdateDirectives().


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