65 m_name->GetTextExtent(
"XXXXXXXXXXXXXXXXXXXXX", &x, &y );
66 m_name->SetMinSize( wxSize( x, -1 ) );
69 GetTextExtent(
"GHZ XXXX", &x, &y );
96 std::vector<int> trackColIds;
109 wxGridCellAttr* attr =
new wxGridCellAttr;
112 [
this](
int row,
int col )
114 calculateTrackParametersForCell( row, col );
119 attr =
new wxGridCellAttr;
122 [
this](
int row,
int col )
124 calculateTrackParametersForCell( row, col );
129 attr =
new wxGridCellAttr;
132 [
this](
int row,
int col )
134 calculateTrackParametersForCell( row, col );
149 std::vector<int> viaColIds;
170 m_type->SetSelection(
static_cast<int>( aProfile.
m_Type ) );
180 if( frequency >= 1e9 )
185 else if( frequency >= 1e6 )
190 else if( frequency >= 1e3 )
200 m_frequency->SetValue( wxString::FromDouble( frequency ) );
219 board->
GetLayerName( entry.GetBottomReferenceLayer() ) );
253 double targetImpedance = 0.0;
270 m_parentPanel->m_layerNamesToIDs.contains( topReferenceLayerName ) )
279 if( wxString bottomReferenceLayerName =
281 m_parentPanel->m_layerNamesToIDs.contains( bottomReferenceLayerName ) )
312 std::swap( signalLayerIdFrom, signalLayerIdTo );
315 std::swap( viaLayerIdFrom, viaLayerIdTo );
335 wxArrayString layerNames, layerNamesWithNone;
336 layerNamesWithNone.push_back(
"<None>" );
338 [&layerNames, &layerNamesWithNone](
const wxString& aLayerName )
340 layerNames.push_back( aLayerName );
341 layerNamesWithNone.push_back( aLayerName );
346 std::vector<wxString> currentSignalLayer;
347 std::vector<wxString> currentTopReferenceLayer;
348 std::vector<wxString> currentBottomReferenceLayer;
354 currentBottomReferenceLayer.emplace_back(
359 std::vector<wxString> currentSignalLayersFrom;
360 std::vector<wxString> currentSignalLayersTo;
361 std::vector<wxString> currentViaLayersFrom;
362 std::vector<wxString> currentViaLayersTo;
373 wxGridCellAttr* attr =
new wxGridCellAttr;
374 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
377 attr =
new wxGridCellAttr;
378 attr->SetEditor(
new wxGridCellChoiceEditor( layerNamesWithNone,
false ) );
381 attr =
new wxGridCellAttr;
382 attr->SetEditor(
new wxGridCellChoiceEditor( layerNamesWithNone,
false ) );
385 attr =
new wxGridCellAttr;
386 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
389 attr =
new wxGridCellAttr;
390 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
393 attr =
new wxGridCellAttr;
394 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
397 attr =
new wxGridCellAttr;
398 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
404 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentSignalLayer[row] ) )
408 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalId ) )
420 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentTopReferenceLayer[row] ) )
424 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastTopReferenceId ) )
426 m_parentPanel->m_board->GetLayerName( lastTopReferenceId ) );
435 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentBottomReferenceLayer[row] ) )
438 m_parentPanel->m_prevLayerNamesToIDs[currentBottomReferenceLayer[row]];
440 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastBottomReferenceId ) )
442 m_parentPanel->m_board->GetLayerName( lastBottomReferenceId ) );
456 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalFromId ) )
464 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalToId ) )
472 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastViaFromId ) )
480 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastViaToId ) )
505 const int titleSize = GetTextExtent(
m_viaOverrides->GetColLabelValue( i ) ).x;
507 m_viaOverrides->SetColSize( i, std::max( titleSize, minValueWidth ) );
512 const int impedanceWidth =
m_targetImpedance->GetTextExtent( wxT(
"0000.00" ) ).x;
521 const wxString newName =
event.GetString();
528 if( event.GetSelection() == 0 )
552 auto setFrontRowLayers = [&](
const int row )
569 auto setRowLayers = [&]()
573 setFrontRowLayers( 0 );
577 const wxString lastSignalLayerName =
580 lastSignalLayerName );
587 setFrontRowLayers( numRows );
618 if( selRows.size() == 1 )
640 if( selRows.size() == 1 )
647 return m_name->GetValue();
652 const double aSigma )
661 bool layerFound =
false;
662 int layerStackupId = 0;
664 while( layerStackupId <
static_cast<int>( aLayerList.size() ) && !layerFound )
666 if( aLayerList.at( layerStackupId )->GetBrdLayerId() != aPcbLayerId )
675 return layerStackupId;
684 if( !zStr.ToDouble( &z ) )
692 const std::vector<BOARD_STACKUP_ITEM*>& aStackupLayerList,
const std::vector<int>& dielectricLayerStackupIds,
695 double totalHeight = 0.0;
697 double lossTangent = 0.0;
699 for(
int i : dielectricLayerStackupIds )
703 for(
int subLayerIdx = 0; subLayerIdx < layer->
GetSublayersCount(); ++subLayerIdx )
708 double e_r_layer = layer->
GetEpsilonR( subLayerIdx );
710 const double spec_freq = layer->
GetSpecFreq( subLayerIdx );
714 && std::isfinite( spec_freq ) && spec_freq > 0.0 )
719 ds.
Fit( e_r_layer, l_t_layer, spec_freq );
723 catch(
const std::invalid_argument& )
735 if( totalHeight <= 0.0 )
736 return { 0.0, 0.0, 0.0 };
738 e_r = e_r / totalHeight;
739 lossTangent = lossTangent / totalHeight;
740 totalHeight /= 1000.0;
742 return { totalHeight, e_r, lossTangent };
747 const int aSignalLayerId,
const int aReferenceLayerId,
748 std::vector<int>& aDielectricLayerStackupIds )
750 for(
int i = std::min( aSignalLayerId, aReferenceLayerId ) + 1; i < std::max( aSignalLayerId, aReferenceLayerId );
761 aDielectricLayerStackupIds.push_back( i );
772 if( aSignalLayerId ==
F_Cu )
774 else if( aSignalLayerId ==
B_Cu )
777 return { 0.0, 0.0, 0.0 };
782 return { 0.0, 0.0, 0.0 };
796 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
816 int calculatedWidth = 0;
817 int calculatedGap = 0;
818 int calculatedDelay = 0;
833 calculatedWidth =
result.Width;
834 calculatedGap =
result.DiffPairGap;
835 calculatedDelay =
result.Delay;
837 const bool widthOk = calculatedWidth > 0;
838 const bool gapOk = calculatedGap > 0;
839 const bool delayOk = calculatedDelay > 0;
870 int calculatedWidth = 0;
871 int calculatedDelay = 0;
886 calculatedWidth =
result.Width;
887 calculatedDelay =
result.Delay;
889 const bool widthOk = calculatedWidth > 0;
890 const bool delayOk = calculatedDelay > 0;
915 if(
m_name->GetValue() == wxEmptyString )
919 const wxString msg =
_(
"Tuning profile must have a name" );
924 std::set<wxString> layerNames;
930 if( layerNames.contains( layerName ) )
934 const wxString msg =
_(
"Duplicated signal layer configuration in tuning profile" );
940 layerNames.insert( layerName );
957 const std::vector<BOARD_STACKUP_ITEM*>& stackupLayerList = stackup.
GetList();
961 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
967 if( signalLayer !=
F_Cu && signalLayer !=
B_Cu )
968 return { {},
CALCULATION_RESULT{
_(
"Internal error: Microstrip can only be on an outer copper layer" ) } };
970 const int signalLayerStackupId =
getStackupLayerId( stackupLayerList, signalLayer );
972 if( signalLayerStackupId == -1 )
975 const double signalLayerThickness =
976 aScale.
IUTomm( stackupLayerList.at( signalLayerStackupId )->GetThickness() ) / 1000.0;
978 if( signalLayerThickness <= 0 )
982 wxString referenceLayerName;
984 if( signalLayer ==
F_Cu )
989 if( !
m_parentPanel->m_layerNamesToIDs.contains( referenceLayerName ) )
993 const int referenceLayerStackupId =
getStackupLayerId( stackupLayerList, referenceLayer );
995 if( signalLayerStackupId == referenceLayerStackupId )
996 return { {},
CALCULATION_RESULT{
_(
"Reference layer must be different to signal layer" ) } };
999 std::vector<int> dielectricLayerStackupIds;
1000 getDielectricLayers( stackupLayerList, signalLayerStackupId, referenceLayerStackupId, dielectricLayerStackupIds );
1006 if( dielectricInfo.
Height <= 0.0 )
1016 signalLayerThickness,
1024 return { boardParameters,
result };
1034 const std::vector<BOARD_STACKUP_ITEM*>& stackupLayerList = stackup.
GetList();
1038 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
1042 const int signalLayerStackupId =
getStackupLayerId( stackupLayerList, signalLayer );
1044 if( signalLayerStackupId == -1 )
1047 const double signalLayerThickness =
1048 aScale.
IUTomm( stackupLayerList.at( signalLayerStackupId )->GetThickness() ) / 1000.0;
1050 if( signalLayerThickness <= 0 )
1051 return { {},
CALCULATION_RESULT{
_(
"Signal layer thickness must be greater than 0" ) } };
1056 if( !
m_parentPanel->m_layerNamesToIDs.contains( topReferenceLayerName ) )
1060 const int topReferenceLayerStackupId =
getStackupLayerId( stackupLayerList, topReferenceLayer );
1063 return { {},
CALCULATION_RESULT{
_(
"Top reference layer must be above signal layer in board stackup" ) } };
1068 if( !
m_parentPanel->m_layerNamesToIDs.contains( bottomReferenceLayerName ) )
1072 const int bottomReferenceLayerStackupId =
getStackupLayerId( stackupLayerList, bottomReferenceLayer );
1075 return { {},
CALCULATION_RESULT{
_(
"Bottom reference layer must be below signal layer in board stackup" ) } };
1078 std::vector<int> topDielectricLayerStackupIds, bottomDielectricLayerStackupIds;
1081 topDielectricLayerStackupIds );
1082 getDielectricLayers( stackupLayerList, signalLayerStackupId, bottomReferenceLayerStackupId,
1083 bottomDielectricLayerStackupIds );
1086 std::vector<int> allDielectricLayerStackupIds( topDielectricLayerStackupIds );
1087 allDielectricLayerStackupIds.insert( allDielectricLayerStackupIds.end(), bottomDielectricLayerStackupIds.begin(),
1088 bottomDielectricLayerStackupIds.end() );
1097 if( topDielectricInfo.
Height <= 0.0 && bottomDielectricInfo.
Height <= 0.0 )
1101 signalLayer, allDielectricInfo.
E_r, topDielectricInfo.
Height, bottomDielectricInfo.
Height,
1107 return { boardParameters,
result };
1137 const double width = iuScale.
IUTomm( widthInt ) / 1000.0;
1165 boardParameters.SolderMaskThickness );
1167 boardParameters.SolderMaskDielectricConstant );
1176 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1177 [
this, aCalculationType]() ->
decltype(
m_microstripCalc.GetSynthesisResults() )
1226 const double width = iuScale.
IUTomm( widthInt ) / 1000.0;
1236 + boardParameters.SignalLayerThickness
1237 + boardParameters.BottomDielectricLayerThickness );
1251 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1252 [
this, aCalculationType]() ->
decltype(
m_striplineCalc.GetSynthesisResults() )
1301 if( !gapOpt || *gapOpt <= 0 )
1302 return CALCULATION_RESULT{
_(
"Diff pair gap must be greater than 0 to calculate width" ) };
1304 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1308 if( !widthOpt || *widthOpt <= 0 )
1309 return CALCULATION_RESULT{
_(
"Width must be greater than 0 to calculate diff pair gap" ) };
1311 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1315 if( !widthOpt || !gapOpt || *widthOpt <= 0 || *gapOpt <= 0 )
1316 return CALCULATION_RESULT{
_(
"Width and diff pair gap must be greater than 0 to calculate delay" ) };
1318 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1319 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1346 boardParameters.SolderMaskThickness );
1348 boardParameters.SolderMaskDielectricConstant );
1350 boardParameters.SolderMaskLossTangent );
1353 switch( aCalculationType )
1360 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1361 [
this, aCalculationType]() ->
decltype(
m_microstripCalc.GetSynthesisResults() )
1415 if( !gapOpt || *gapOpt <= 0 )
1416 return CALCULATION_RESULT{
_(
"Diff pair gap must be greater than 0 to calculate width" ) };
1418 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1422 if( !widthOpt || *widthOpt <= 0 )
1423 return CALCULATION_RESULT{
_(
"Width must be greater than 0 to calculate diff pair gap" ) };
1425 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1429 if( !widthOpt || !gapOpt || *widthOpt <= 0 || *gapOpt <= 0 )
1430 return CALCULATION_RESULT{
_(
"Width and diff pair gap must be greater than 0 to calculate delay" ) };
1432 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1433 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1444 const double totalH = boardParameters.TopDielectricLayerThickness + boardParameters.SignalLayerThickness
1445 + boardParameters.BottomDielectricLayerThickness;
1452 const double striplineA = boardParameters.TopDielectricLayerThickness
1453 + 0.5 * boardParameters.SignalLayerThickness;
1477 switch( aCalculationType )
1484 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1515 double frequency = 0.0;
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
@ BS_ITEM_TYPE_DIELECTRIC
Manage one layer needed to make a physical board.
DIELECTRIC_MODEL GetDielectricModel(int aDielectricSubLayer=0) const
int GetSublayersCount() const
double GetEpsilonR(int aDielectricSubLayer=0) const
bool HasEpsilonRValue() const
int GetThickness(int aDielectricSubLayer=0) const
BOARD_STACKUP_ITEM_TYPE GetType() const
double GetSpecFreq(int aDielectricSubLayer=0) const
double GetLossTangent(int aDielectricSubLayer=0) const
Manage layers needed to make a physical board.
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
Information pertinent to a Pcbnew printed circuit board.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
static bool IsCenteredOffset(double a, double h)
Returns true when the strip plane offset a is effectively at the centre (a = h/2 within numerical tol...
Represents a single line in a time domain profile track propagation setup.
void SetWidth(const int aWidth)
void SetEnableTimeDomainTuning(bool aEnable)
void SetDiffPairGap(const int aDiffPairGap)
void SetTopReferenceLayer(const PCB_LAYER_ID aLayer)
void SetSignalLayer(const PCB_LAYER_ID aLayer)
void SetDelay(const int aDelay)
void SetBottomReferenceLayer(const PCB_LAYER_ID aLayer)
PCB_LAYER_ID GetSignalLayer() const
Kramers-Kronig-consistent wideband dielectric model after Djordjevic et al.
double TanDeltaAt(double aF) const
Loss tangent tan delta = -Im(eps) / Re(eps) at aF.
double EpsilonRealAt(double aF) const
Real part of relative permittivity at aF.
void Fit(double aEpsRSpec, double aTanDSpec, double aFSpec, double aF1=1.0e3, double aF2=1.0e12)
Fit the model from a single (epsR, tan delta) datapoint at f_spec.
A cell editor which runs a provided function when the grid cell button is clicked.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
static PAGED_DIALOG * GetDialog(wxWindow *aWindow)
void SetError(const wxString &aMessage, const wxString &aPageName, int aCtrlId, int aRow=-1, int aCol=-1)
WX_GRID * m_trackPropagationGrid
PANEL_SETUP_TUNING_PROFILE_INFO_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(719, 506), long style=wxTAB_TRAVERSAL, const wxString &name=wxEmptyString)
wxStaticText * m_viaPropSpeedUnits
STD_BITMAP_BUTTON * m_deleteTrackPropogationLayer
STD_BITMAP_BUTTON * m_addViaPropagationOverride
STD_BITMAP_BUTTON * m_addTrackPropogationLayer
wxStaticText * m_netChainBridgePropagationSpeedLabel
wxChoice * m_frequencyUnits
wxTextCtrl * m_viaPropagationSpeed
wxStaticText * m_netChainBridgePropSpeedUnits
wxCheckBox * m_enableDelayTuning
wxCheckBox * m_modelSolderMask
STD_BITMAP_BUTTON * m_removeViaPropagationOverride
wxStaticText * m_viaPropagationSpeedLabel
wxTextCtrl * m_netChainBridgePropagationSpeed
wxTextCtrl * m_targetImpedance
void OnAddViaOverride(wxCommandEvent &event) override
Adds a via override row.
static constexpr double RHO
MICROSTRIP m_microstripCalc
Calculator for single microstrip parameters.
COUPLED_STRIPLINE m_coupledStriplineCalc
Calculator for coupled (differential) stripline parameters.
void initPanel()
Initialises all controls on the panel.
void calculateTrackParametersForCell(int aRow, int aCol)
Calculates the required track parameters for the given track parameters grid row and col.
@ TRACK_GRID_BOTTOM_REFERENCE
@ TRACK_GRID_TOP_REFERENCE
@ TRACK_GRID_SIGNAL_LAYER
CALCULATION_RESULT calculateSingleStripline(const int aRow, CalculationType aCalculationType)
Calculates the track width or delay for the given propagation grid row.
double getTargetImpedance() const
Gets the target impedance for the profile.
CALCULATION_RESULT calculateSingleMicrostrip(const int aRow, CalculationType aCalculationType)
Calculates the track width or delay for the given propagation grid row.
STRIPLINE m_striplineCalc
Calculator for single stripline parameters.
static double calculateSkinDepth(double aFreq, double aMurc, double aSigma)
Calculate the effective skin depth for the given parameters.
UNIT_BINDER m_netchainBridgePropagationUnits
Units for global net chain bridge propagation unit delay.
bool ValidateProfile(size_t aPageIndex)
Validate this panel's data.
void UpdateLayerNames()
Updates the displayed layer names in all grids.
static int getStackupLayerId(const std::vector< BOARD_STACKUP_ITEM * > &aLayerList, PCB_LAYER_ID aPcbLayerId)
Gets the index in to the layer list for the given layer.
UNIT_BINDER m_viaPropagationUnits
Units for global via propagation unit delay.
CALCULATION_RESULT calculateDifferentialMicrostrip(int aRow, CalculationType aCalculationType)
Calculates the track width, pair gap, or delay for the given propagation grid row.
std::pair< CALCULATION_BOARD_PARAMETERS, CALCULATION_RESULT > getMicrostripBoardParameters(int aRow, const EDA_IU_SCALE &aScale)
Gets the board parameters for microstrip calculations @parameter aRow The grid row to calculate board...
PANEL_SETUP_TUNING_PROFILE_INFO(wxWindow *aParentWindow, PANEL_SETUP_TUNING_PROFILES *parentPanel)
DIELECTRIC_INFO calculateAverageDielectricConstants(const std::vector< BOARD_STACKUP_ITEM * > &aStackupLayerList, const std::vector< int > &dielectricLayerStackupIds, const EDA_IU_SCALE &aIuScale)
Calculates the geometric average of the dielectric material properties.
void LoadProfile(const TUNING_PROFILE &aProfile)
Loads the given profile in to the panel.
TUNING_PROFILE GetProfile() const
Saves the panel to the given profile.
static DIELECTRIC_INFO getSolderMaskParameters(const std::vector< BOARD_STACKUP_ITEM * > &aStackupLayerList, const EDA_IU_SCALE &aScale, PCB_LAYER_ID aSignalLayerId)
Gets the dielectric information for the solder mask covering a given signallayer.
double getFrequency() const
Gets the target frequency in Hz.
~PANEL_SETUP_TUNING_PROFILE_INFO() override
PANEL_SETUP_TUNING_PROFILES * m_parentPanel
The parent setup panel.
void OnChangeProfileType(wxCommandEvent &event) override
Changes between Single and Differential profiles.
std::pair< CALCULATION_BOARD_PARAMETERS, CALCULATION_RESULT > getStriplineBoardParameters(int aRow, const EDA_IU_SCALE &aScale)
Gets the board parameters for stripline calculations @parameter aRow The grid row to calculate board ...
void getDielectricLayers(const std::vector< BOARD_STACKUP_ITEM * > &aStackupLayerList, int aSignalLayerId, int aReferenceLayerId, std::vector< int > &aDielectricLayerStackupIds)
Gets the dielectric layers for dielectrics between the two given copper layer IDs.
void OnRemoveTrackRow(wxCommandEvent &event) override
Removes a row from the track propagation grid.
@ VIA_GRID_SIGNAL_LAYER_TO
@ VIA_GRID_SIGNAL_LAYER_FROM
@ VIA_GRID_VIA_LAYER_FROM
wxString GetProfileName() const
Gets the name of this profile.
COUPLED_MICROSTRIP m_coupledMicrostripCalc
Calculator for coupled (differential) microstrip parameters.
CALCULATION_RESULT calculateDifferentialStripline(int aRow, CalculationType aCalculationType)
Calculates the track width, pair gap, or delay for the given propagation grid row.
void onChangeProfileType(TUNING_PROFILE::PROFILE_TYPE aType) const
Sets the panel display for the given tuning type.
void OnRemoveViaOverride(wxCommandEvent &event) override
Removes a via override row.
void OnAddTrackRow(wxCommandEvent &event) override
Adds a row to the track propagation grid.
void setColumnWidths()
Set up the widths of all grid columns.
void OnProfileNameChanged(wxCommandEvent &event) override
Updates the parent notebook control.
EDA_UNITS GetUnitsFromType(EDA_DATA_TYPE aType) const
Gets the units to use in the conversion based on the underlying user units.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
bool IsCopperLayerLowerThan(PCB_LAYER_ID aLayerA, PCB_LAYER_ID aLayerB)
Return true if copper aLayerA is placed lower than aLayerB, false otherwise.
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
PCB_LAYER_ID
A quick note on layer IDs:
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
KICOMMON_API bool IsImperialUnit(EDA_UNITS aUnit)
Represents a single line in the time domain configuration via overrides configuration grid.
constexpr double IUTomm(int iu) const
Represents a single line in the tuning profile configuration grid.
int m_NetChainBridgePropagationDelay
bool m_EnableTimeDomainTuning
std::map< PCB_LAYER_ID, DELAY_PROFILE_TRACK_PROPAGATION_ENTRY > m_TrackPropagationEntriesMap
std::vector< DELAY_PROFILE_VIA_OVERRIDE_ENTRY > m_ViaOverrides
int m_ViaPropagationDelay
std::vector< DELAY_PROFILE_TRACK_PROPAGATION_ENTRY > m_TrackPropagationEntries
wxString result
Test unit parsing edge cases and error handling.