Convert formatting constructs for SPICE consumption.

Fixes https://gitlab.com/kicad/code/kicad/issues/11383
This commit is contained in:
Jeff Young 2022-12-11 15:52:48 +00:00
parent 9c129ed03f
commit fbd2d66a75
3 changed files with 43 additions and 8 deletions

View File

@ -51,6 +51,7 @@
#include <pegtl/contrib/parse_tree.hpp>
#include <wx/dir.h>
#include <locale_io.h>
#include "markup_parser.h"
namespace NETLIST_EXPORTER_SPICE_PARSER
{
@ -280,11 +281,45 @@ bool NETLIST_EXPORTER_SPICE::ReadSchematicAndLibraries( unsigned aNetlistOptions
}
void NETLIST_EXPORTER_SPICE::ReplaceForbiddenChars( std::string& aNetName )
void NETLIST_EXPORTER_SPICE::ConvertToSpiceMarkup( std::string& aNetName )
{
boost::replace_all( aNetName, "(", "_" );
boost::replace_all( aNetName, ")", "_" );
boost::replace_all( aNetName, " ", "_" );
MARKUP::MARKUP_PARSER markupParser( aNetName );
std::unique_ptr<MARKUP::NODE> root = markupParser.Parse();
std::string converted;
std::function<void( const std::unique_ptr<MARKUP::NODE>&)> convertMarkup =
[&]( const std::unique_ptr<MARKUP::NODE>& aNode )
{
if( aNode )
{
if( !aNode->is_root() )
{
if( aNode->isOverbar() )
{
// ~{CLK} is a different signal than CLK
converted += '~';
}
else if( aNode->isSubscript() || aNode->isSuperscript() )
{
// V_{OUT} is just a pretty-printed version of VOUT
}
if( aNode->has_content() )
converted += aNode->string();
}
for( const std::unique_ptr<MARKUP::NODE>& child : aNode->children )
convertMarkup( child );
}
};
convertMarkup( root );
boost::replace_all( converted, "(", "_" );
boost::replace_all( converted, ")", "_" );
boost::replace_all( converted, " ", "_" );
aNetName = converted;
}
@ -560,7 +595,7 @@ std::string NETLIST_EXPORTER_SPICE::GenerateItemPinNetName( const std::string& a
{
std::string netName = aNetName;
ReplaceForbiddenChars( netName );
ConvertToSpiceMarkup( netName );
netName = std::string( UnescapeString( netName ).ToUTF8() );
if( netName == "" )

View File

@ -93,9 +93,9 @@ public:
virtual bool ReadSchematicAndLibraries( unsigned aNetlistOptions, REPORTER& aReporter );
/**
* Replace illegal spice net name characters with underscores.
* Remove formatting wrappers and replace illegal spice net name characters with underscores.
*/
static void ReplaceForbiddenChars( std::string& aNetName );
static void ConvertToSpiceMarkup( std::string& aNetName );
/**
* Return the list of nets.

View File

@ -911,7 +911,7 @@ int SCH_EDITOR_CONTROL::SimProbe( const TOOL_EVENT& aEvent )
if( SCH_CONNECTION* conn = static_cast<SCH_ITEM*>( item )->Connection() )
{
std::string spiceNet = std::string( UnescapeString( conn->Name() ).ToUTF8() );
NETLIST_EXPORTER_SPICE::ReplaceForbiddenChars( spiceNet );
NETLIST_EXPORTER_SPICE::ConvertToSpiceMarkup( spiceNet );
simFrame->AddVoltagePlot( wxString::Format( "V(%s)", spiceNet ) );
}