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;
171 m_type->SetSelection(
static_cast<int>( aProfile.
m_Type ) );
181 if( frequency >= 1e9 )
186 else if( frequency >= 1e6 )
191 else if( frequency >= 1e3 )
201 m_frequency->SetValue( wxString::FromDouble( frequency ) );
220 board->
GetLayerName( entry.GetBottomReferenceLayer() ) );
254 double targetImpedance = 0.0;
271 m_parentPanel->m_layerNamesToIDs.contains( topReferenceLayerName ) )
280 if( wxString bottomReferenceLayerName =
282 m_parentPanel->m_layerNamesToIDs.contains( bottomReferenceLayerName ) )
313 std::swap( signalLayerIdFrom, signalLayerIdTo );
316 std::swap( viaLayerIdFrom, viaLayerIdTo );
336 wxArrayString layerNames, layerNamesWithNone;
337 layerNamesWithNone.push_back(
"<None>" );
339 [&layerNames, &layerNamesWithNone](
const wxString& aLayerName )
341 layerNames.push_back( aLayerName );
342 layerNamesWithNone.push_back( aLayerName );
347 std::vector<wxString> currentSignalLayer;
348 std::vector<wxString> currentTopReferenceLayer;
349 std::vector<wxString> currentBottomReferenceLayer;
355 currentBottomReferenceLayer.emplace_back(
360 std::vector<wxString> currentSignalLayersFrom;
361 std::vector<wxString> currentSignalLayersTo;
362 std::vector<wxString> currentViaLayersFrom;
363 std::vector<wxString> currentViaLayersTo;
374 wxGridCellAttr* attr =
new wxGridCellAttr;
375 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
378 attr =
new wxGridCellAttr;
379 attr->SetEditor(
new wxGridCellChoiceEditor( layerNamesWithNone,
false ) );
382 attr =
new wxGridCellAttr;
383 attr->SetEditor(
new wxGridCellChoiceEditor( layerNamesWithNone,
false ) );
386 attr =
new wxGridCellAttr;
387 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
390 attr =
new wxGridCellAttr;
391 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
394 attr =
new wxGridCellAttr;
395 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
398 attr =
new wxGridCellAttr;
399 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
405 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentSignalLayer[row] ) )
409 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalId ) )
421 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentTopReferenceLayer[row] ) )
425 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastTopReferenceId ) )
427 m_parentPanel->m_board->GetLayerName( lastTopReferenceId ) );
436 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentBottomReferenceLayer[row] ) )
439 m_parentPanel->m_prevLayerNamesToIDs[currentBottomReferenceLayer[row]];
441 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastBottomReferenceId ) )
443 m_parentPanel->m_board->GetLayerName( lastBottomReferenceId ) );
457 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalFromId ) )
465 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalToId ) )
473 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastViaFromId ) )
481 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastViaToId ) )
506 const int titleSize = GetTextExtent(
m_viaOverrides->GetColLabelValue( i ) ).x;
508 m_viaOverrides->SetColSize( i, std::max( titleSize, minValueWidth ) );
513 const int impedanceWidth =
m_targetImpedance->GetTextExtent( wxT(
"0000.00" ) ).x;
522 const wxString newName =
event.GetString();
529 if( event.GetSelection() == 0 )
553 auto setFrontRowLayers = [&](
const int row )
570 auto setRowLayers = [&]()
574 setFrontRowLayers( 0 );
578 const wxString lastSignalLayerName =
581 lastSignalLayerName );
588 setFrontRowLayers( numRows );
619 if( selRows.size() == 1 )
641 if( selRows.size() == 1 )
648 return m_name->GetValue();
653 const double aSigma )
662 bool layerFound =
false;
663 int layerStackupId = 0;
665 while( layerStackupId <
static_cast<int>( aLayerList.size() ) && !layerFound )
667 if( aLayerList.at( layerStackupId )->GetBrdLayerId() != aPcbLayerId )
676 return layerStackupId;
685 if( !zStr.ToDouble( &z ) )
693 const std::vector<BOARD_STACKUP_ITEM*>& aStackupLayerList,
const std::vector<int>& dielectricLayerStackupIds,
696 double totalHeight = 0.0;
698 double lossTangent = 0.0;
700 for(
int i : dielectricLayerStackupIds )
704 for(
int subLayerIdx = 0; subLayerIdx < layer->
GetSublayersCount(); ++subLayerIdx )
709 double e_r_layer = layer->
GetEpsilonR( subLayerIdx );
711 const double spec_freq = layer->
GetSpecFreq( subLayerIdx );
715 && std::isfinite( spec_freq ) && spec_freq > 0.0 )
720 ds.
Fit( e_r_layer, l_t_layer, spec_freq );
724 catch(
const std::invalid_argument& )
736 if( totalHeight <= 0.0 )
737 return { 0.0, 0.0, 0.0 };
739 e_r = e_r / totalHeight;
740 lossTangent = lossTangent / totalHeight;
741 totalHeight /= 1000.0;
743 return { totalHeight, e_r, lossTangent };
748 const int aSignalLayerId,
const int aReferenceLayerId,
749 std::vector<int>& aDielectricLayerStackupIds )
751 for(
int i = std::min( aSignalLayerId, aReferenceLayerId ) + 1; i < std::max( aSignalLayerId, aReferenceLayerId );
762 aDielectricLayerStackupIds.push_back( i );
773 if( aSignalLayerId ==
F_Cu )
775 else if( aSignalLayerId ==
B_Cu )
778 return { 0.0, 0.0, 0.0 };
783 return { 0.0, 0.0, 0.0 };
797 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
817 int calculatedWidth = 0;
818 int calculatedGap = 0;
819 int calculatedDelay = 0;
834 calculatedWidth =
result.Width;
835 calculatedGap =
result.DiffPairGap;
836 calculatedDelay =
result.Delay;
838 const bool widthOk = calculatedWidth > 0;
839 const bool gapOk = calculatedGap > 0;
840 const bool delayOk = calculatedDelay > 0;
871 int calculatedWidth = 0;
872 int calculatedDelay = 0;
887 calculatedWidth =
result.Width;
888 calculatedDelay =
result.Delay;
890 const bool widthOk = calculatedWidth > 0;
891 const bool delayOk = calculatedDelay > 0;
916 if(
m_name->GetValue() == wxEmptyString )
920 const wxString msg =
_(
"Tuning profile must have a name" );
925 for(
size_t i = 0; i <
m_parentPanel->m_tuningProfiles->GetPageCount(); ++i )
927 const auto* otherProfile =
930 if( otherProfile !=
this && otherProfile->GetProfileName() ==
m_name->GetValue() )
934 const wxString msg =
_(
"Tuning profile name already in use" );
940 std::set<wxString> layerNames;
946 if( layerNames.contains( layerName ) )
950 const wxString msg =
_(
"Duplicated signal layer configuration in tuning profile" );
956 layerNames.insert( layerName );
973 const std::vector<BOARD_STACKUP_ITEM*>& stackupLayerList = stackup.
GetList();
977 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
983 if( signalLayer !=
F_Cu && signalLayer !=
B_Cu )
984 return { {},
CALCULATION_RESULT{
_(
"Internal error: Microstrip can only be on an outer copper layer" ) } };
986 const int signalLayerStackupId =
getStackupLayerId( stackupLayerList, signalLayer );
988 if( signalLayerStackupId == -1 )
991 const double signalLayerThickness =
992 aScale.
IUTomm( stackupLayerList.at( signalLayerStackupId )->GetThickness() ) / 1000.0;
994 if( signalLayerThickness <= 0 )
998 wxString referenceLayerName;
1000 if( signalLayer ==
F_Cu )
1005 if( !
m_parentPanel->m_layerNamesToIDs.contains( referenceLayerName ) )
1009 const int referenceLayerStackupId =
getStackupLayerId( stackupLayerList, referenceLayer );
1011 if( signalLayerStackupId == referenceLayerStackupId )
1012 return { {},
CALCULATION_RESULT{
_(
"Reference layer must be different to signal layer" ) } };
1015 std::vector<int> dielectricLayerStackupIds;
1016 getDielectricLayers( stackupLayerList, signalLayerStackupId, referenceLayerStackupId, dielectricLayerStackupIds );
1022 if( dielectricInfo.
Height <= 0.0 )
1032 signalLayerThickness,
1040 return { boardParameters,
result };
1050 const std::vector<BOARD_STACKUP_ITEM*>& stackupLayerList = stackup.
GetList();
1054 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
1058 const int signalLayerStackupId =
getStackupLayerId( stackupLayerList, signalLayer );
1060 if( signalLayerStackupId == -1 )
1063 const double signalLayerThickness =
1064 aScale.
IUTomm( stackupLayerList.at( signalLayerStackupId )->GetThickness() ) / 1000.0;
1066 if( signalLayerThickness <= 0 )
1067 return { {},
CALCULATION_RESULT{
_(
"Signal layer thickness must be greater than 0" ) } };
1072 if( !
m_parentPanel->m_layerNamesToIDs.contains( topReferenceLayerName ) )
1076 const int topReferenceLayerStackupId =
getStackupLayerId( stackupLayerList, topReferenceLayer );
1079 return { {},
CALCULATION_RESULT{
_(
"Top reference layer must be above signal layer in board stackup" ) } };
1084 if( !
m_parentPanel->m_layerNamesToIDs.contains( bottomReferenceLayerName ) )
1088 const int bottomReferenceLayerStackupId =
getStackupLayerId( stackupLayerList, bottomReferenceLayer );
1091 return { {},
CALCULATION_RESULT{
_(
"Bottom reference layer must be below signal layer in board stackup" ) } };
1094 std::vector<int> topDielectricLayerStackupIds, bottomDielectricLayerStackupIds;
1097 topDielectricLayerStackupIds );
1098 getDielectricLayers( stackupLayerList, signalLayerStackupId, bottomReferenceLayerStackupId,
1099 bottomDielectricLayerStackupIds );
1102 std::vector<int> allDielectricLayerStackupIds( topDielectricLayerStackupIds );
1103 allDielectricLayerStackupIds.insert( allDielectricLayerStackupIds.end(), bottomDielectricLayerStackupIds.begin(),
1104 bottomDielectricLayerStackupIds.end() );
1113 if( topDielectricInfo.
Height <= 0.0 && bottomDielectricInfo.
Height <= 0.0 )
1117 signalLayer, allDielectricInfo.
E_r, topDielectricInfo.
Height, bottomDielectricInfo.
Height,
1123 return { boardParameters,
result };
1153 const double width = iuScale.
IUTomm( widthInt ) / 1000.0;
1181 boardParameters.SolderMaskThickness );
1183 boardParameters.SolderMaskDielectricConstant );
1192 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1193 [
this, aCalculationType]() ->
decltype(
m_microstripCalc.GetSynthesisResults() )
1242 const double width = iuScale.
IUTomm( widthInt ) / 1000.0;
1252 + boardParameters.SignalLayerThickness
1253 + boardParameters.BottomDielectricLayerThickness );
1267 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1268 [
this, aCalculationType]() ->
decltype(
m_striplineCalc.GetSynthesisResults() )
1317 if( !gapOpt || *gapOpt <= 0 )
1318 return CALCULATION_RESULT{
_(
"Diff pair gap must be greater than 0 to calculate width" ) };
1320 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1324 if( !widthOpt || *widthOpt <= 0 )
1325 return CALCULATION_RESULT{
_(
"Width must be greater than 0 to calculate diff pair gap" ) };
1327 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1331 if( !widthOpt || !gapOpt || *widthOpt <= 0 || *gapOpt <= 0 )
1332 return CALCULATION_RESULT{
_(
"Width and diff pair gap must be greater than 0 to calculate delay" ) };
1334 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1335 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1362 boardParameters.SolderMaskThickness );
1364 boardParameters.SolderMaskDielectricConstant );
1366 boardParameters.SolderMaskLossTangent );
1369 switch( aCalculationType )
1376 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1377 [
this, aCalculationType]() ->
decltype(
m_microstripCalc.GetSynthesisResults() )
1431 if( !gapOpt || *gapOpt <= 0 )
1432 return CALCULATION_RESULT{
_(
"Diff pair gap must be greater than 0 to calculate width" ) };
1434 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1438 if( !widthOpt || *widthOpt <= 0 )
1439 return CALCULATION_RESULT{
_(
"Width must be greater than 0 to calculate diff pair gap" ) };
1441 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1445 if( !widthOpt || !gapOpt || *widthOpt <= 0 || *gapOpt <= 0 )
1446 return CALCULATION_RESULT{
_(
"Width and diff pair gap must be greater than 0 to calculate delay" ) };
1448 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1449 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1460 const double totalH = boardParameters.TopDielectricLayerThickness + boardParameters.SignalLayerThickness
1461 + boardParameters.BottomDielectricLayerThickness;
1468 const double striplineA = boardParameters.TopDielectricLayerThickness
1469 + 0.5 * boardParameters.SignalLayerThickness;
1493 switch( aCalculationType )
1500 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1531 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
Add a via override row.
static constexpr double RHO
Electrical resistivity or specific electrical resistance of copper (ohm*meter)
MICROSTRIP m_microstripCalc
Calculator for single microstrip parameters.
COUPLED_STRIPLINE m_coupledStriplineCalc
Calculator for coupled (differential) stripline parameters.
void initPanel()
Initialise all controls on the panel.
void calculateTrackParametersForCell(int aRow, int aCol)
Calculate 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)
Calculate the track width or delay for the given propagation grid row.
double getTargetImpedance() const
Get the target impedance for the profile.
CALCULATION_RESULT calculateSingleMicrostrip(const int aRow, CalculationType aCalculationType)
Calculate 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()
Update the displayed layer names in all grids.
static int getStackupLayerId(const std::vector< BOARD_STACKUP_ITEM * > &aLayerList, PCB_LAYER_ID aPcbLayerId)
Get 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)
Calculate 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)
Get the board parameters for microstrip calculations.
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)
Calculate the geometric average of the dielectric material properties.
void LoadProfile(const TUNING_PROFILE &aProfile)
Load the given profile in to the panel.
TUNING_PROFILE GetProfile() const
Save 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)
Get the dielectric information for the solder mask covering a given signallayer.
double getFrequency() const
Get 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
Change between Single and Differential profiles.
std::pair< CALCULATION_BOARD_PARAMETERS, CALCULATION_RESULT > getStriplineBoardParameters(int aRow, const EDA_IU_SCALE &aScale)
Get the board parameters for stripline calculations.
void getDielectricLayers(const std::vector< BOARD_STACKUP_ITEM * > &aStackupLayerList, int aSignalLayerId, int aReferenceLayerId, std::vector< int > &aDielectricLayerStackupIds)
Get the dielectric layers for dielectrics between the two given copper layer IDs.
void OnRemoveTrackRow(wxCommandEvent &event) override
Remove 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
Get the name of this profile.
COUPLED_MICROSTRIP m_coupledMicrostripCalc
Calculator for coupled (differential) microstrip parameters.
CALCULATION_RESULT calculateDifferentialStripline(int aRow, CalculationType aCalculationType)
Calculate the track width, pair gap, or delay for the given propagation grid row.
void onChangeProfileType(TUNING_PROFILE::PROFILE_TYPE aType) const
Set the panel display for the given tuning type.
wxString m_lastSyncedName
The profile name as of the last rename sync.
void OnRemoveViaOverride(wxCommandEvent &event) override
Remove a via override row.
void OnAddTrackRow(wxCommandEvent &event) override
Add a row to the track propagation grid.
void setColumnWidths()
Set up the widths of all grid columns.
void OnProfileNameChanged(wxCommandEvent &event) override
Update 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.