57 m_name->GetTextExtent(
"XXXXXXXXXXXXXXXXXXXXX", &x, &y );
58 m_name->SetMinSize( wxSize( x, -1 ) );
61 GetTextExtent(
"GHZ XXXX", &x, &y );
87 std::vector<int> trackColIds;
100 wxGridCellAttr* attr =
new wxGridCellAttr;
103 [
this](
int row,
int col )
105 calculateTrackParametersForCell( row, col );
110 attr =
new wxGridCellAttr;
113 [
this](
int row,
int col )
115 calculateTrackParametersForCell( row, col );
120 attr =
new wxGridCellAttr;
123 [
this](
int row,
int col )
125 calculateTrackParametersForCell( row, col );
140 std::vector<int> viaColIds;
161 m_type->SetSelection(
static_cast<int>( aProfile.
m_Type ) );
170 if( frequency >= 1e9 )
175 else if( frequency >= 1e6 )
180 else if( frequency >= 1e3 )
190 m_frequency->SetValue( wxString::FromDouble( frequency ) );
209 board->
GetLayerName( entry.GetBottomReferenceLayer() ) );
242 double targetImpedance = 0.0;
259 m_parentPanel->m_layerNamesToIDs.contains( topReferenceLayerName ) )
268 if( wxString bottomReferenceLayerName =
270 m_parentPanel->m_layerNamesToIDs.contains( bottomReferenceLayerName ) )
301 std::swap( signalLayerIdFrom, signalLayerIdTo );
304 std::swap( viaLayerIdFrom, viaLayerIdTo );
324 wxArrayString layerNames, layerNamesWithNone;
325 layerNamesWithNone.push_back(
"<None>" );
327 [&layerNames, &layerNamesWithNone](
const wxString& aLayerName )
329 layerNames.push_back( aLayerName );
330 layerNamesWithNone.push_back( aLayerName );
335 std::vector<wxString> currentSignalLayer;
336 std::vector<wxString> currentTopReferenceLayer;
337 std::vector<wxString> currentBottomReferenceLayer;
343 currentBottomReferenceLayer.emplace_back(
348 std::vector<wxString> currentSignalLayersFrom;
349 std::vector<wxString> currentSignalLayersTo;
350 std::vector<wxString> currentViaLayersFrom;
351 std::vector<wxString> currentViaLayersTo;
362 wxGridCellAttr* attr =
new wxGridCellAttr;
363 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
366 attr =
new wxGridCellAttr;
367 attr->SetEditor(
new wxGridCellChoiceEditor( layerNamesWithNone,
false ) );
370 attr =
new wxGridCellAttr;
371 attr->SetEditor(
new wxGridCellChoiceEditor( layerNamesWithNone,
false ) );
374 attr =
new wxGridCellAttr;
375 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
378 attr =
new wxGridCellAttr;
379 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
382 attr =
new wxGridCellAttr;
383 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
386 attr =
new wxGridCellAttr;
387 attr->SetEditor(
new wxGridCellChoiceEditor( layerNames,
false ) );
393 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentSignalLayer[row] ) )
397 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalId ) )
409 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentTopReferenceLayer[row] ) )
413 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastTopReferenceId ) )
415 m_parentPanel->m_board->GetLayerName( lastTopReferenceId ) );
424 if(
m_parentPanel->m_prevLayerNamesToIDs.contains( currentBottomReferenceLayer[row] ) )
427 m_parentPanel->m_prevLayerNamesToIDs[currentBottomReferenceLayer[row]];
429 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastBottomReferenceId ) )
431 m_parentPanel->m_board->GetLayerName( lastBottomReferenceId ) );
445 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalFromId ) )
453 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastSignalToId ) )
461 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastViaFromId ) )
469 if(
m_parentPanel->m_copperLayerIdsToIndex.contains( lastViaToId ) )
494 const int titleSize = GetTextExtent(
m_viaOverrides->GetColLabelValue( i ) ).x;
496 m_viaOverrides->SetColSize( i, std::max( titleSize, minValueWidth ) );
501 const int impedanceWidth =
m_targetImpedance->GetTextExtent( wxT(
"0000.00" ) ).x;
510 const wxString newName =
event.GetString();
517 if( event.GetSelection() == 0 )
541 auto setFrontRowLayers = [&](
const int row )
558 auto setRowLayers = [&]()
562 setFrontRowLayers( 0 );
566 const wxString lastSignalLayerName =
569 lastSignalLayerName );
576 setFrontRowLayers( numRows );
607 if( selRows.size() == 1 )
629 if( selRows.size() == 1 )
636 return m_name->GetValue();
641 const double aSigma )
650 bool layerFound =
false;
651 int layerStackupId = 0;
653 while( layerStackupId <
static_cast<int>( aLayerList.size() ) && !layerFound )
655 if( aLayerList.at( layerStackupId )->GetBrdLayerId() != aPcbLayerId )
664 return layerStackupId;
673 if( !zStr.ToDouble( &z ) )
681 const std::vector<BOARD_STACKUP_ITEM*>& aStackupLayerList,
const std::vector<int>& dielectricLayerStackupIds,
684 double totalHeight = 0.0;
686 double lossTangent = 0.0;
688 for(
int i : dielectricLayerStackupIds )
692 for(
int subLayerIdx = 0; subLayerIdx < layer->
GetSublayersCount(); ++subLayerIdx )
697 double e_r_layer = layer->
GetEpsilonR( subLayerIdx );
699 const double spec_freq = layer->
GetSpecFreq( subLayerIdx );
703 && std::isfinite( spec_freq ) && spec_freq > 0.0 )
708 ds.
Fit( e_r_layer, l_t_layer, spec_freq );
712 catch(
const std::invalid_argument& )
723 e_r = e_r / totalHeight;
724 lossTangent = lossTangent / totalHeight;
725 totalHeight /= 1000.0;
727 return { totalHeight, e_r, lossTangent };
732 const int aSignalLayerId,
const int aReferenceLayerId,
733 std::vector<int>& aDielectricLayerStackupIds )
735 for(
int i = std::min( aSignalLayerId, aReferenceLayerId ) + 1; i < std::max( aSignalLayerId, aReferenceLayerId );
746 aDielectricLayerStackupIds.push_back( i );
757 if( aSignalLayerId ==
F_Cu )
759 else if( aSignalLayerId ==
B_Cu )
762 return { 0.0, 0.0, 0.0 };
767 return { 0.0, 0.0, 0.0 };
781 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
801 int calculatedWidth = 0;
802 int calculatedGap = 0;
803 int calculatedDelay = 0;
818 calculatedWidth =
result.Width;
819 calculatedGap =
result.DiffPairGap;
820 calculatedDelay =
result.Delay;
822 const bool widthOk = calculatedWidth > 0;
823 const bool gapOk = calculatedGap > 0;
824 const bool delayOk = calculatedDelay > 0;
855 int calculatedWidth = 0;
856 int calculatedDelay = 0;
871 calculatedWidth =
result.Width;
872 calculatedDelay =
result.Delay;
874 const bool widthOk = calculatedWidth > 0;
875 const bool delayOk = calculatedDelay > 0;
900 if(
m_name->GetValue() == wxEmptyString )
904 const wxString msg =
_(
"Tuning profile must have a name" );
909 std::set<wxString> layerNames;
915 if( layerNames.contains( layerName ) )
919 const wxString msg =
_(
"Duplicated signal layer configuration in tuning profile" );
925 layerNames.insert( layerName );
942 const std::vector<BOARD_STACKUP_ITEM*>& stackupLayerList = stackup.
GetList();
946 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
952 if( signalLayer !=
F_Cu && signalLayer !=
B_Cu )
953 return { {},
CALCULATION_RESULT{
_(
"Internal error: Microstrip can only be on an outer copper layer" ) } };
955 const int signalLayerStackupId =
getStackupLayerId( stackupLayerList, signalLayer );
957 if( signalLayerStackupId == -1 )
960 const double signalLayerThickness =
961 aScale.
IUTomm( stackupLayerList.at( signalLayerStackupId )->GetThickness() ) / 1000.0;
963 if( signalLayerThickness <= 0 )
967 wxString referenceLayerName;
969 if( signalLayer ==
F_Cu )
974 if( !
m_parentPanel->m_layerNamesToIDs.contains( referenceLayerName ) )
978 const int referenceLayerStackupId =
getStackupLayerId( stackupLayerList, referenceLayer );
980 if( signalLayerStackupId == referenceLayerStackupId )
981 return { {},
CALCULATION_RESULT{
_(
"Reference layer must be different to signal layer" ) } };
984 std::vector<int> dielectricLayerStackupIds;
985 getDielectricLayers( stackupLayerList, signalLayerStackupId, referenceLayerStackupId, dielectricLayerStackupIds );
991 if( dielectricInfo.
Height <= 0.0 )
1001 signalLayerThickness,
1009 return { boardParameters,
result };
1019 const std::vector<BOARD_STACKUP_ITEM*>& stackupLayerList = stackup.
GetList();
1023 if( !
m_parentPanel->m_layerNamesToIDs.contains( signalLayerName ) )
1027 const int signalLayerStackupId =
getStackupLayerId( stackupLayerList, signalLayer );
1029 if( signalLayerStackupId == -1 )
1032 const double signalLayerThickness =
1033 aScale.
IUTomm( stackupLayerList.at( signalLayerStackupId )->GetThickness() ) / 1000.0;
1035 if( signalLayerThickness <= 0 )
1036 return { {},
CALCULATION_RESULT{
_(
"Signal layer thickness must be greater than 0" ) } };
1041 if( !
m_parentPanel->m_layerNamesToIDs.contains( topReferenceLayerName ) )
1045 const int topReferenceLayerStackupId =
getStackupLayerId( stackupLayerList, topReferenceLayer );
1048 return { {},
CALCULATION_RESULT{
_(
"Top reference layer must be above signal layer in board stackup" ) } };
1053 if( !
m_parentPanel->m_layerNamesToIDs.contains( bottomReferenceLayerName ) )
1057 const int bottomReferenceLayerStackupId =
getStackupLayerId( stackupLayerList, bottomReferenceLayer );
1060 return { {},
CALCULATION_RESULT{
_(
"Bottom reference layer must be below signal layer in board stackup" ) } };
1063 std::vector<int> topDielectricLayerStackupIds, bottomDielectricLayerStackupIds;
1066 topDielectricLayerStackupIds );
1067 getDielectricLayers( stackupLayerList, signalLayerStackupId, bottomReferenceLayerStackupId,
1068 bottomDielectricLayerStackupIds );
1071 std::vector<int> allDielectricLayerStackupIds( topDielectricLayerStackupIds );
1072 allDielectricLayerStackupIds.insert( allDielectricLayerStackupIds.end(), bottomDielectricLayerStackupIds.begin(),
1073 bottomDielectricLayerStackupIds.end() );
1082 if( topDielectricInfo.
Height <= 0.0 && bottomDielectricInfo.
Height <= 0.0 )
1086 signalLayer, allDielectricInfo.
E_r, topDielectricInfo.
Height, bottomDielectricInfo.
Height,
1092 return { boardParameters,
result };
1122 const double width = iuScale.
IUTomm( widthInt ) / 1000.0;
1150 boardParameters.SolderMaskThickness );
1152 boardParameters.SolderMaskDielectricConstant );
1161 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1162 [
this, aCalculationType]() ->
decltype(
m_microstripCalc.GetSynthesisResults() )
1211 const double width = iuScale.
IUTomm( widthInt ) / 1000.0;
1221 + boardParameters.SignalLayerThickness
1222 + boardParameters.BottomDielectricLayerThickness );
1236 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1237 [
this, aCalculationType]() ->
decltype(
m_striplineCalc.GetSynthesisResults() )
1286 if( !gapOpt || *gapOpt <= 0 )
1287 return CALCULATION_RESULT{
_(
"Diff pair gap must be greater than 0 to calculate width" ) };
1289 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1293 if( !widthOpt || *widthOpt <= 0 )
1294 return CALCULATION_RESULT{
_(
"Width must be greater than 0 to calculate diff pair gap" ) };
1296 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1300 if( !widthOpt || !gapOpt || *widthOpt <= 0 || *gapOpt <= 0 )
1301 return CALCULATION_RESULT{
_(
"Width and diff pair gap must be greater than 0 to calculate delay" ) };
1303 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1304 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1331 boardParameters.SolderMaskThickness );
1333 boardParameters.SolderMaskDielectricConstant );
1335 boardParameters.SolderMaskLossTangent );
1338 switch( aCalculationType )
1345 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1346 [
this, aCalculationType]() ->
decltype(
m_microstripCalc.GetSynthesisResults() )
1400 if( !gapOpt || *gapOpt <= 0 )
1401 return CALCULATION_RESULT{
_(
"Diff pair gap must be greater than 0 to calculate width" ) };
1403 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1407 if( !widthOpt || *widthOpt <= 0 )
1408 return CALCULATION_RESULT{
_(
"Width must be greater than 0 to calculate diff pair gap" ) };
1410 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1414 if( !widthOpt || !gapOpt || *widthOpt <= 0 || *gapOpt <= 0 )
1415 return CALCULATION_RESULT{
_(
"Width and diff pair gap must be greater than 0 to calculate delay" ) };
1417 width = iuScale.
IUTomm( widthOpt.value() ) / 1000.0;
1418 gap = iuScale.
IUTomm( gapOpt.value() ) / 1000.0;
1429 const double totalH = boardParameters.TopDielectricLayerThickness + boardParameters.SignalLayerThickness
1430 + boardParameters.BottomDielectricLayerThickness;
1437 const double striplineA = boardParameters.TopDielectricLayerThickness
1438 + 0.5 * boardParameters.SignalLayerThickness;
1462 switch( aCalculationType )
1469 std::unordered_map<TRANSLINE_PARAMETERS, std::pair<double, TRANSLINE_STATUS>>& results =
1500 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
wxChoice * m_frequencyUnits
wxTextCtrl * m_viaPropagationSpeed
wxCheckBox * m_enableDelayTuning
wxCheckBox * m_modelSolderMask
STD_BITMAP_BUTTON * m_removeViaPropagationOverride
wxStaticText * m_viaPropagationSpeedLabel
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.
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.
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.