42#include <wx/filedlg.h>
43#include <fmt/format.h>
48#include <wx/filedlg.h>
53#define FORCE_REFRESH_FROM_MODEL true
56bool equivalent( SIM_MODEL::DEVICE_T a, SIM_MODEL::DEVICE_T b )
67 std::vector<SCH_FIELD>& aFields ) :
85 if constexpr (std::is_same_v<T, SCH_SYMBOL>)
91 if(
EMBEDDED_FILES* symbolEmbeddedFiles = aSymbol.GetEmbeddedFiles() )
93 m_filesStack.push_back( symbolEmbeddedFiles );
95 if constexpr (std::is_same_v<T, SCH_SYMBOL>)
97 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( &aSymbol );
98 symbol->GetLibSymbolRef()->AppendParentEmbeddedFiles( m_filesStack );
100 else if constexpr (std::is_same_v<T, LIB_SYMBOL>)
107 m_libraryModelsMgr.SetFilesStack( m_filesStack );
108 m_builtinModelsMgr.SetFilesStack( m_filesStack );
113 if( !pin->GetParentSymbol()->IsMultiBodyStyle() || pin->GetBodyStyle() < 2 )
114 m_sortedPartPins.push_back( pin );
117 std::sort( m_sortedPartPins.begin(), m_sortedPartPins.end(),
121 return StrNumCmp( lhs->GetNumber(), rhs->GetNumber(), true ) < 0;
124 m_waveformChoice->Clear();
125 m_deviceChoice->Clear();
126 m_deviceSubtypeChoice->Clear();
128 m_scintillaTricksCode =
new SCINTILLA_TRICKS( m_codePreview, wxT(
"{}" ),
false );
129 m_scintillaTricksSubckt =
new SCINTILLA_TRICKS( m_subckt, wxT(
"()" ),
false );
133 wxPropertyGrid*
grid = m_paramGrid->GetGrid();
134 grid->SetCellDisabledTextColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
138 grid->DedicateKey( WXK_RETURN );
139 grid->DedicateKey( WXK_NUMPAD_ENTER );
140 grid->DedicateKey( WXK_UP );
141 grid->DedicateKey( WXK_DOWN );
143#if wxCHECK_VERSION( 3, 3, 0 )
144 grid->AddActionTrigger( wxPGKeyboardAction::Edit, WXK_RETURN );
145 grid->AddActionTrigger( wxPGKeyboardAction::NextProperty, WXK_RETURN );
146 grid->AddActionTrigger( wxPGKeyboardAction::Edit, WXK_NUMPAD_ENTER );
147 grid->AddActionTrigger( wxPGKeyboardAction::NextProperty, WXK_NUMPAD_ENTER );
149 grid->AddActionTrigger( wxPG_ACTION_EDIT, WXK_RETURN );
150 grid->AddActionTrigger( wxPG_ACTION_NEXT_PROPERTY, WXK_RETURN );
151 grid->AddActionTrigger( wxPG_ACTION_EDIT, WXK_NUMPAD_ENTER );
152 grid->AddActionTrigger( wxPG_ACTION_NEXT_PROPERTY, WXK_NUMPAD_ENTER );
155 m_pinAssignmentsGrid->ClearRows();
156 m_pinAssignmentsGrid->PushEventHandler(
new GRID_TRICKS( m_pinAssignmentsGrid ) );
159 finishDialogSettings();
168 for( wxPropertyGridIterator it =
m_paramGrid->GetIterator(); !it.AtEnd(); ++it )
185 wxCommandEvent dummyEvent;
188 wxString modelParams;
190 bool storeInValue =
false;
196 &deviceType, &modelType, &modelParams, &pinMap ) )
200 if( !modelType.IsEmpty() )
215 wxFileName tmp( libraryFilename );
217 if( !tmp.GetFullName().IsEmpty() )
241 if( modelIdx == wxNOT_FOUND )
243 m_infoBar->ShowMessage( wxString::Format(
_(
"No model named '%s' in library." ),
274 for(
const std::pair<std::string, std::string>& strs : ibismodel->
GetIbisPins() )
280 ibismodel->
ChangePin( *ibisLibrary, strs.first );
287 if( i <
static_cast<int>( ibismodel->
GetIbisPins().size() ) )
321 for( SIM_MODEL::TYPE type : SIM_MODEL::TYPE_ITERATOR() )
346 curModel().SetIsStoredInValue(
true );
351 return DIALOG_SIM_MODEL_BASE::TransferDataToWindow();
361 if( !
m_paramGrid->GetGrid()->CommitChangesFromEditor() )
364 if( !DIALOG_SIM_MODEL_BASE::TransferDataFromWindow() )
374 wxFileName fn(
path );
377 && !fn.GetFullPath().StartsWith(
".." ) )
379 path = fn.GetFullPath();
406 std::string differential;
409 pins = ibismodel->GetIbisPins().at(
m_pinCombobox->GetSelection() ).first;
420 if(
model.GetType() == SIM_MODEL::TYPE::RAWSPICE )
425 wxString code =
m_codePreview->GetText().Trim(
true ).Trim(
false );
426 model.SetParamValue(
"model", std::string( code.ToUTF8() ) );
437 std::string( symbolPinName.ToUTF8() ) );
493 SendSizeEvent( wxSEND_EVENT_POST );
517 for( SIM_MODEL::TYPE type : { SIM_MODEL::TYPE::KIBIS_DEVICE,
518 SIM_MODEL::TYPE::KIBIS_DRIVER_DC,
519 SIM_MODEL::TYPE::KIBIS_DRIVER_RECT,
520 SIM_MODEL::TYPE::KIBIS_DRIVER_PRBS } )
530 if( type == aModel->
GetType() )
553 for( SIM_MODEL::DEVICE_T deviceType : SIM_MODEL::DEVICE_T_ITERATOR() )
564 for( SIM_MODEL::TYPE type : SIM_MODEL::TYPE_ITERATOR() )
566 if( type == SIM_MODEL::TYPE::KIBIS_DEVICE
567 || type == SIM_MODEL::TYPE::KIBIS_DRIVER_DC
568 || type == SIM_MODEL::TYPE::KIBIS_DRIVER_RECT
569 || type == SIM_MODEL::TYPE::KIBIS_DRIVER_PRBS )
582 if( type == aModel->
GetType() )
639 m_paramGrid->Append(
new wxPropertyCategory(
"AC" ) );
642 m_paramGrid->Append(
new wxPropertyCategory(
"DC" ) );
645 m_paramGrid->Append(
new wxPropertyCategory(
"S-Parameters" ) );
648 m_paramGrid->Append(
new wxPropertyCategory(
"Capacitance" ) );
651 m_paramGrid->Append(
new wxPropertyCategory(
"Temperature" ) );
654 m_paramGrid->Append(
new wxPropertyCategory(
"Noise" ) );
657 m_paramGrid->Append(
new wxPropertyCategory(
"Distributed Quantities" ) );
658 m_paramGrid->HideProperty(
"Distributed Quantities" );
660 m_paramGrid->Append(
new wxPropertyCategory(
"Waveform" ) );
663 m_paramGrid->Append(
new wxPropertyCategory(
"Limiting Values" ) );
666 m_paramGrid->Append(
new wxPropertyCategory(
"Advanced" ) );
669 m_paramGrid->Append(
new wxPropertyCategory(
"Flags" ) );
686 for( wxPropertyGridIterator it =
m_paramGrid->GetIterator(); !it.AtEnd(); ++it )
688 wxColour bgCol =
m_paramGrid->GetGrid()->GetPropertyDefaultCell().GetBgCol();
689 wxColour fgCol =
m_paramGrid->GetGrid()->GetPropertyDefaultCell().GetFgCol();
693 ( *it )->GetCell( col ).SetBgCol( bgCol );
694 ( *it )->GetCell( col ).SetFgCol( fgCol );
708 ( *it )->SetValueFromString( param.
value );
749 aForceRefreshFromModel =
true;
752 if( aForceRefreshFromModel )
759 for(
int modelPinIndex = 0; modelPinIndex < aModel->
GetPinCount(); ++modelPinIndex )
763 if( symbolPinNumber ==
"" )
768 if( symbolPinRow == -1 )
779 std::vector<BITMAPS> modelPinIcons;
780 wxArrayString modelPinChoices;
782 for(
int jj = 0; jj < aModel->
GetPinCount(); ++jj )
793 modelPinChoices.Add(
_(
"Not Connected" ) );
802 if( modelPinIndex >= 0 )
808 if( aModel->
GetType() == SIM_MODEL::TYPE::SUBCKT )
860 for(
const auto& [baseModelName, baseModel] :
library()->GetModels() )
862 if( baseModelName == modelName )
870 wxArrayString modelNames;
872 bool modelNameExists =
false;
875 modelNames.Add(
name );
878 if(
name == modelName )
879 modelNameExists =
true;
887 if( !modelNameExists )
889 m_infoBar->ShowMessage( wxString::Format(
_(
"No model named '%s' in '%s'." ),
897 wxArrayString emptyArray;
934 case CATEGORY::S_PARAM:
935 m_paramGrid->HideProperty(
"S-Parameters",
false );
939 case CATEGORY::CAPACITANCE:
944 case CATEGORY::TEMPERATURE:
949 case CATEGORY::NOISE:
954 case CATEGORY::DISTRIBUTED_QUANTITIES:
955 m_paramGrid->HideProperty(
"Distributed Quantities",
false );
959 case CATEGORY::WAVEFORM:
964 case CATEGORY::GEOMETRY:
969 case CATEGORY::LIMITING_VALUES:
970 m_paramGrid->HideProperty(
"Limiting Values",
false );
974 case CATEGORY::ADVANCED:
979 case CATEGORY::FLAGS:
988 case CATEGORY::INITIAL_CONDITIONS:
989 case CATEGORY::SUPERFLUOUS:
999 wxString paramDescription;
1002 paramDescription = wxString::Format(
"%s", param.
info.
name );
1006 wxPGProperty* prop =
nullptr;
1013 prop->SetAttribute( wxPG_BOOL_USE_CHECKBOX,
true );
1035 wxArrayString inductors;
1046 if( item.model->GetDeviceType() == SIM_MODEL::DEVICE_T::L )
1047 inductors.push_back( item.refName );
1051 [](
const wxString& a,
const wxString& b ) ->
int
1057 if( inductors.empty() )
1075 wxArrayString values;
1078 values.Add(
string );
1086 prop =
new wxStringProperty( paramDescription, param.
info.
name );
1090 prop->SetAttribute( wxPG_ATTR_UNITS, wxString::FromUTF8( param.
info.
unit.c_str() ) );
1116template <
typename T>
1119 for(
int row = 0; row < static_cast<int>(
m_sortedPartPins.size() ); ++row )
1123 if(
pin->GetNumber() == aSymbolPinNumber )
1131template <
typename T>
1151template <
typename T>
1161template <
typename T>
1170 pinNumber =
pin->GetShownNumber();
1171 pinName =
pin->GetShownName();
1174 if( !pinName.IsEmpty() && pinName != pinNumber )
1175 pinNumber += wxString::Format( wxT(
" (\"%s\")" ), pinName );
1181template <
typename T>
1184 wxString modelPinName;
1186 if( aModelPinIndex >= 0 && aModelPinIndex < aModel->GetPinCount() )
1189 wxString modelPinNumber = wxString::Format(
"%d", aModelPinIndex + 1 );
1191 if( !modelPinName.IsEmpty() && modelPinName != modelPinNumber )
1192 modelPinNumber += wxString::Format( wxT(
" (\"%s\")" ), modelPinName );
1194 return modelPinNumber;
1198template <
typename T>
1201 if( aModelPinString ==
"Not Connected" )
1204 int length = aModelPinString.Find(
" " );
1206 if( length == wxNOT_FOUND )
1207 length =
static_cast<int>( aModelPinString.Length() );
1210 aModelPinString.Mid( 0, length ).ToCLong( &
result );
1212 return static_cast<int>(
result - 1 );
1216template <
typename T>
1224template <
typename T>
1231template <
typename T>
1248template <
typename T>
1258 wxCommandEvent
dummy;
1266template <
typename T>
1269 static wxString s_mruPath;
1272 wxFileDialog dlg(
this,
_(
"Browse Models" ),
path );
1275 dlg.SetCustomizeHook( customize );
1277 if( dlg.ShowModal() == wxID_CANCEL )
1282 path = dlg.GetPath();
1283 wxFileName fn(
path );
1284 s_mruPath = fn.GetPath();
1291 else if( fn.MakeRelativeTo(
Prj().GetProjectPath() ) && !fn.GetFullPath().StartsWith( wxS(
".." ) ) )
1293 path = fn.GetFullPath();
1307template <
typename T>
1312 switch( aKeyStroke.GetKeyCode() )
1315 if( sel == wxNOT_FOUND )
1323 if( sel == wxNOT_FOUND )
1331 wxPostEvent(
this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ) );
1344template <
typename T>
1350 wxArrayString modelNames;
1356 wxString wx_name(
name );
1358 if( wx_name.Matches(
filter ) )
1359 modelNames.Add( wx_name );
1375template <
typename T>
1380 wxArrayString pinLabels;
1383 wxCHECK2( modelkibis,
return );
1385 for( std::pair<wxString, wxString> strs : modelkibis->
GetIbisPins() )
1386 pinLabels.Add( strs.first + wxT(
" - " ) + strs.second );
1390 wxArrayString emptyArray;
1399 wxArrayString lines = wxSplit( fallback->GetSpiceCode(),
'\n' );
1402 for(
const wxString& line : lines )
1404 if( !line.StartsWith(
'*' ) )
1406 if( !code.IsEmpty() )
1413 m_infoBar->ShowMessage( wxString::Format(
_(
"Failed to parse:\n\n"
1415 "Using generic SPICE model." ),
1427template <
typename T>
1430 wxArrayString modelLabels;
1434 std::vector<std::pair<std::string, std::string>> strs = ibisModel.
GetIbisPins();
1435 std::string pinNumber = strs.at(
m_pinCombobox->GetSelection() ).first;
1439 ibisModel.
ChangePin( *ibisLibrary, pinNumber );
1444 modelLabels.Add( modelName );
1457template <
typename T>
1466template <
typename T>
1473template <
typename T>
1480template <
typename T>
1486 modelibis->SwitchSingleEndedDiff( diff );
1493template <
typename T>
1498 for( SIM_MODEL::DEVICE_T deviceType : SIM_MODEL::DEVICE_T_ITERATOR() )
1511template <
typename T>
1514 SIM_MODEL::DEVICE_T deviceType =
curModel().GetDeviceType();
1517 for( SIM_MODEL::TYPE type : { SIM_MODEL::TYPE::KIBIS_DEVICE,
1518 SIM_MODEL::TYPE::KIBIS_DRIVER_DC,
1519 SIM_MODEL::TYPE::KIBIS_DRIVER_RECT,
1520 SIM_MODEL::TYPE::KIBIS_DRIVER_PRBS } )
1533 m_libraryModelsMgr.SetModel( idx, std::make_unique<SIM_MODEL_IBIS>( type, baseModel ) );
1554template <
typename T>
1557 SIM_MODEL::DEVICE_T deviceType =
curModel().GetDeviceType();
1560 for( SIM_MODEL::TYPE type : SIM_MODEL::TYPE_ITERATOR() )
1575template <
typename T>
1582template <
typename T>
1585 int symbolPinIndex = aEvent.GetRow();
1586 wxString oldModelPinName = aEvent.GetString();
1587 wxString modelPinName =
m_pinAssignmentsGrid->GetCellValue( aEvent.GetRow(), aEvent.GetCol() );
1593 curModel().AssignSymbolPinNumberToModelPin( oldModelPinIndex,
"" );
1608template <
typename T>
1621template <
typename T>
1628 wxPGProperty* selected =
grid->GetSelection();
1631 selected =
grid->wxPropertyGridInterface::GetFirst();
1633#if wxCHECK_VERSION( 3, 3, 0 )
1635 grid->DoSelectProperty( selected, wxPGSelectPropertyFlags::Focus );
1638 grid->DoSelectProperty( selected, wxPG_SEL_FOCUS );
1645template <
typename T>
1651 if(
grid->GetSelection() &&
grid->GetSelection()->IsCategory() )
1653 wxPGProperty* selection =
grid->GetSelection();
1658 wxPropertyGridIterator it =
grid->GetIterator( wxPG_ITERATE_VISIBLE, selection );
1661 wxKeyEvent* keyEvent =
new wxKeyEvent( wxEVT_KEY_DOWN );
1665 if( !selection->IsExpanded() )
1667 grid->Expand( selection );
1668 keyEvent->m_keyCode = WXK_DOWN;
1669 wxQueueEvent(
grid, keyEvent );
1677 keyEvent->m_keyCode = WXK_UP;
1678 wxQueueEvent(
grid, keyEvent );
1683 if( !selection->IsExpanded() )
1684 grid->Expand( selection );
1686 keyEvent->m_keyCode = WXK_DOWN;
1687 wxQueueEvent(
grid, keyEvent );
1694 wxWindow* editorControl =
grid->GetEditorControl();
1696 if( !editorControl )
1703 editorControl->SetFocus();
1708template <
typename T>
1720 wxTextCtrl* ctrl =
grid->GetEditorTextCtrl();
1724 wxRect ctrlRect = ctrl->GetScreenRect();
1725 wxRect gridRect =
grid->GetScreenRect();
1727 if( ctrlRect.GetTop() < gridRect.GetTop() || ctrlRect.GetBottom() > gridRect.GetBottom() )
1728 grid->ClearSelection();
1734template <
typename T>
1747 std::vector<int> colWidths;
1749 for(
size_t ii = 0; ii <
grid->GetColumnCount(); ii++ )
1752 colWidths.push_back(
grid->GetState()->GetColumnWidth( ii ) + margin + indent );
1754 colWidths.push_back( std::max( 72,
grid->GetState()->GetColumnWidth( ii ) ) + margin );
1756 colWidths.push_back( 60 + margin );
1758 aWidth -= colWidths[ ii ];
1761 for(
size_t ii = 0; ii <
grid->GetColumnCount(); ii++ )
1762 grid->SetColumnProportion( ii, colWidths[ ii ] );
1764 grid->ResetColumnSizes();
1765 grid->RefreshEditor();
1770template <
typename T>
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
wxNotebook * m_modelNotebook
wxStaticText * m_subcktLabel
wxStaticText * m_modelNameLabel
wxPropertyGridManager * m_paramGridMgr
wxStaticText * m_pathLabel
wxRadioButton * m_rbBuiltinModel
wxListBox * m_modelListBox
wxComboBox * m_pinCombobox
DIALOG_SIM_MODEL_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Simulation Model Editor"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
wxChoice * m_deviceSubtypeChoice
wxSearchCtrl * m_modelFilter
wxStaticText * m_waveformLabel
wxTextCtrl * m_libraryPathText
wxStaticText * m_pinLabel
wxChoice * m_deviceChoice
wxComboBox * m_pinModelCombobox
wxRadioButton * m_rbLibraryModel
wxChoice * m_waveformChoice
wxStaticText * m_deviceLabel
WX_GRID * m_pinAssignmentsGrid
wxStaticText * m_pinModelLabel
wxPanel * m_parametersPanel
wxStaticText * m_deviceSubtypeLabel
wxCheckBox * m_saveInValueCheckbox
STD_BITMAP_BUTTON * m_browseButton
wxStyledTextCtrl * m_subckt
wxPropertyGridPage * m_paramGrid
wxPanel * m_pinAssignmentsPanel
wxCheckBox * m_differentialCheckbox
wxStyledTextCtrl * m_codePreview
const SIM_MODEL * m_prevModel
void onTypeChoice(wxCommandEvent &aEvent) override
void onLibraryPathTextKillFocus(wxFocusEvent &aEvent) override
wxString getSymbolPinString(int aSymbolPinNumber) const
void updateBuiltinModelWidgets(SIM_MODEL *aModel)
void onPinAssignmentsGridCellChange(wxGridEvent &aEvent) override
void onFilterCharHook(wxKeyEvent &aKeyStroke) override
int findSymbolPinRow(const wxString &aSymbolPinNumber) const
void onModelNameChoice(wxCommandEvent &aEvent) override
void onRadioButton(wxCommandEvent &aEvent) override
SCINTILLA_TRICKS * m_scintillaTricksSubckt
bool loadLibrary(const wxString &aLibraryPath, REPORTER &aReporter, bool aForceReload=false)
SIM_LIB_MGR m_builtinModelsMgr
int getModelPinIndex(const wxString &aModelPinString) const
void onModelFilter(wxCommandEvent &aEvent) override
void onLibraryPathText(wxCommandEvent &aEvent) override
void onDifferentialCheckbox(wxCommandEvent &event) override
void onParamGridSelectionChange(wxPropertyGridEvent &aEvent)
void removeOrphanedPinAssignments(SIM_MODEL *aModel)
void adjustParamGridColumns(int aWidth, bool aForce)
std::vector< SCH_FIELD > & m_fields
std::vector< SCH_PIN * > m_sortedPartPins
Pins of the current part.
wxPGProperty * newParamProperty(SIM_MODEL *aModel, int aParamIndex) const
wxPGProperty * m_prevParamGridSelection
void onPinModelCombobox(wxCommandEvent &event) override
const SIM_LIBRARY * library() const
SIM_MODEL & curModel() const
SIM_LIB_MGR m_libraryModelsMgr
void onBrowseButtonClick(wxCommandEvent &aEvent) override
void onPinComboboxTextEnter(wxCommandEvent &event) override
void onPinCombobox(wxCommandEvent &event) override
wxPGProperty * m_firstCategory
SCINTILLA_TRICKS * m_scintillaTricksCode
std::map< wxString, int > m_modelListBoxEntryToLibraryIdx
void updatePinAssignments(SIM_MODEL *aModel, bool aForceUpdatePins)
void onUpdateUI(wxUpdateUIEvent &aEvent)
DIALOG_SIM_MODEL(wxWindow *aParent, EDA_BASE_FRAME *aFrame, T &aSymbol, std::vector< SCH_FIELD > &aFields)
wxString getModelPinString(SIM_MODEL *aModel, int aModelPinIndex) const
void onPinAssignmentsGridSize(wxSizeEvent &aEvent) override
void updateIbisWidgets(SIM_MODEL *aModel)
void onParamGridSetFocus(wxFocusEvent &aEvent)
void updateModelParamsTab(SIM_MODEL *aModel)
bool TransferDataFromWindow() override
SIM_MODEL::TYPE m_curModelType
void updateModelCodeTab(SIM_MODEL *aModel)
void onSizeParamGrid(wxSizeEvent &event) override
void onPageChanging(wxNotebookEvent &event) override
std::vector< EMBEDDED_FILES * > m_filesStack
void onWaveformChoice(wxCommandEvent &aEvent) override
std::map< SIM_MODEL::DEVICE_T, SIM_MODEL::TYPE > m_curModelTypeOfDeviceType
void onPinModelComboboxTextEnter(wxCommandEvent &event) override
void onLibraryPathTextEnter(wxCommandEvent &aEvent) override
void onDeviceTypeChoice(wxCommandEvent &aEvent) override
bool TransferDataToWindow() override
void addParamPropertyIfRelevant(SIM_MODEL *aModel, int aParamIndex)
The base frame for deriving all KiCad main window classes.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Define a library symbol object.
void AppendParentEmbeddedFiles(std::vector< EMBEDDED_FILES * > &aStack) const
virtual bool ReadSchematicAndLibraries(unsigned aNetlistOptions, REPORTER &aReporter)
Process the schematic and Spice libraries to create net mapping and a list of SPICE_ITEMs.
const std::list< SPICE_ITEM > & GetItems() const
Return the list of items representing schematic symbols in the Spice world.
A singleton reporter that reports to nowhere.
virtual const wxString GetProjectPath() const
Return the full path of the project.
A pure virtual class used to derive REPORTER objects from.
virtual bool HasMessageOfSeverity(int aSeverityMask) const
Returns true if the reporter has one or more messages matching the specified severity mask.
virtual bool HasMessage() const
Returns true if any messages were reported.
EMBEDDED_FILES * GetEmbeddedFiles() override
Schematic editor (Eeschema) main window.
void SetText(const wxString &aText) override
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
wxString GetShownNumber() const
Add cut/copy/paste, dark theme, autocomplete and brace highlighting to a wxStyleTextCtrl instance.
static constexpr auto MODEL_FIELD
static constexpr auto PIN_FIELD
static constexpr auto DIFF_FIELD
bool isPinDiff(const std::string &aComp, const std::string &aPinNumber) const
static constexpr auto LIBRARY_FIELD
static constexpr auto NAME_FIELD
std::vector< std::pair< std::string, std::string > > GetIbisPins() const
void SwitchSingleEndedDiff(bool aDiff) override
bool CanDifferential() const
std::vector< std::string > GetIbisModels() const
bool ChangePin(const SIM_LIBRARY_IBIS &aLib, const std::string &aPinNumber)
update the list of available models based on the pin number.
std::string GetComponentName() const
std::string GetSpiceCode() const
static INFO TypeInfo(TYPE aType)
static bool InferSimModel(T &aSymbol, std::vector< SCH_FIELD > *aFields, bool aResolve, int aDepth, SIM_VALUE_GRAMMAR::NOTATION aNotation, wxString *aDeviceType, wxString *aModelType, wxString *aModelParams, wxString *aPinMap)
const SPICE_GENERATOR & SpiceGenerator() const
virtual const PARAM & GetParam(unsigned aParamIndex) const
static TYPE ReadTypeFromFields(const std::vector< SCH_FIELD > &aFields, bool aResolve, int aDepth, REPORTER &aReporter)
int GetParamCount() const
void AssignSymbolPinNumberToModelPin(int aPinIndex, const wxString &aSymbolPinNumber)
DEVICE_INFO GetDeviceInfo() const
DEVICE_T GetDeviceType() const
static DEVICE_INFO DeviceInfo(DEVICE_T aDeviceType)
virtual bool HasAutofill() const
const SIM_MODEL_PIN & GetPin(unsigned aIndex) const
virtual bool HasPrimaryValue() const
const SIM_MODEL::PARAM & GetParam() const
Special netlist exporter flavor that allows one to override simulation commands.
virtual std::string Preview(const SPICE_ITEM &aItem) const
A wrapper for reporting to a wxString object.
const wxString & GetMessages() const
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
static bool empty(const wxTextEntryBase *aCtrl)
bool equivalent(SIM_MODEL::DEVICE_T a, SIM_MODEL::DEVICE_T b)
#define FORCE_REFRESH_FROM_MODEL
SIM_MODEL::PARAM::CATEGORY CATEGORY
static const std::string KiCadUriPrefix
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
BITMAPS PinShapeGetBitmap(GRAPHIC_PINSHAPE shape)
wxString GetFieldValue(const std::vector< SCH_FIELD > *aFields, FIELD_T aFieldType)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
void SetFieldValue(std::vector< SCH_FIELD > &aFields, const wxString &aFieldName, const std::string &aValue, bool aIsVisible=true)
#define SIM_REFERENCE_FIELD
#define SIM_DEVICE_SUBTYPE_FIELD
std::vector< FAB_LAYER_COLOR > dummy
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
std::vector< std::string > enumValues
static constexpr auto NOT_CONNECTED
const std::string modelPinName
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString result
Test unit parsing edge cases and error handling.