57 const double erEffUncoated =
er_eff_0;
62 const auto [ erEffCoated, tanDCoated ] =
65 if( erEffCoated != erEffUncoated )
68 Z0_0 *= std::sqrt( erEffUncoated / erEffCoated );
133 const bool Z0_invalid = !std::isfinite(
Z0 ) ||
Z0 < 0;
134 const bool ANG_L_invalid = !std::isfinite(
ANG_L ) ||
ANG_L < 0;
135 const bool L_invalid = !std::isfinite(
L ) ||
L < 0;
136 const bool W_invalid = !std::isfinite( W ) || W <= 0;
158 const bool Z0_invalid = !std::isfinite(
Z0 ) ||
Z0 < 0;
159 const bool ANG_L_invalid = !std::isfinite(
ANG_L ) ||
ANG_L < 0;
160 const bool L_invalid = !std::isfinite(
L ) ||
L < 0;
161 const bool W_invalid = !std::isfinite( W ) || W <= 0;
174 + ( ( e_r - 1 ) / ( e_r + 1 ) * ( 0.23 + ( 0.11 / e_r ) ) );
181 w_h = 8 * exp( a ) / ( exp( 2. * a ) - 2 );
186 * ( b - 1. - log( ( 2 * b ) - 1. )
187 + ( ( e_r - 1 ) / ( 2 * e_r ) ) * ( log( b - 1. ) + 0.39 - 0.61 / e_r ) );
203 const double R_1 = 0.03891 * pow( e_r, 1.4 );
204 const double R_2 = 0.267 * pow( u, 7.0 );
205 const double R_3 = 4.766 * exp( -3.228 * pow( u, 0.641 ) );
206 const double R_4 = 0.016 + pow( 0.0514 * e_r, 4.524 );
207 const double R_5 = pow( f_n / 28.843, 12.0 );
208 const double R_6 = 22.2 * pow( u, 1.92 );
209 const double R_7 = 1.206 - 0.3144 * exp( -R_1 ) * ( 1.0 - exp( -R_2 ) );
210 const double R_8 = 1.0 + 1.275 * ( 1.0 - exp( -0.004625 * R_3 * pow( e_r, 1.674 ) * pow( f_n / 18.365, 2.745 ) ) );
211 double tmpf = pow( e_r - 1.0, 6.0 );
212 const double R_9 = 5.086 * R_4 * ( R_5 / ( 0.3838 + 0.386 * R_4 ) ) * ( exp( -R_6 ) / ( 1.0 + 1.2992 * R_5 ) )
213 * ( tmpf / ( 1.0 + 10.0 * tmpf ) );
214 const double R_10 = 0.00044 * pow( e_r, 2.136 ) + 0.0184;
215 tmpf = pow( f_n / 19.47, 6.0 );
216 const double R_11 = tmpf / ( 1.0 + 0.0962 * tmpf );
217 const double R_12 = 1.0 / ( 1.0 + 0.00245 * u * u );
218 const double R_13 = 0.9408 * pow( e_r_eff_f, R_8 ) - 0.9603;
219 const double R_14 = ( 0.9408 - R_9 ) * pow( e_r_eff_0, R_8 ) - 0.9603;
220 const double R_15 = 0.707 * R_10 * pow( f_n / 12.3, 1.097 );
221 const double R_16 = 1.0 + 0.0503 * e_r * e_r * R_11 * ( 1.0 - exp( -pow( u / 15.0, 6.0 ) ) );
222 const double R_17 = R_7 * ( 1.0 - 1.1241 * ( R_12 / R_16 ) * exp( -0.026 * pow( f_n, 1.15656 ) - R_15 ) );
224 return pow( R_13 / R_14, R_17 );
230 const double freq = 6.0 + ( 2.0 *
M_PI - 6.0 ) * exp( -pow( 30.666 / u, 0.7528 ) );
231 return (
TC::ZF0 / ( 2.0 *
M_PI ) ) * log( freq / u + sqrt( 1.0 + 4.0 / ( u * u ) ) );
250 const double h2hp1 = 1.0 + h2h;
251 const double P = 270.0 * ( 1.0 - tanh( 0.28 + 1.2 * sqrt( h2h ) ) );
255 const double qArg = ( 0.48 * sqrt( std::max( 0.0, u - 1.0 ) ) ) / ( h2hp1 * h2hp1 );
260 const double Q = 1.0 -
atanh( qArg );
267 const double u2 = u * u;
268 const double u3 = u2 * u;
269 const double u4 = u3 * u;
270 const double a = 1.0 + log( ( u4 + u2 / 2704 ) / ( u4 + 0.432 ) ) / 49.0 + log( 1.0 + u3 / 5929.741 ) / 18.7;
271 const double b = 0.564 * pow( ( e_r - 0.9 ) / ( e_r + 3.0 ), 0.053 );
272 return pow( 1.0 + 10.0 / u, -a * b );
290 return tanh( 1.043 + 0.121 * h2h - 1.164 / h2h );
296 return ( 2.0 * log( 2.0 ) /
M_PI ) * ( t_h / sqrt( u ) );
302 return 0.5 * ( e_r + 1.0 ) + 0.5 * q * ( e_r - 1.0 );
313 delta_u = ( t_h /
M_PI ) * log( 1.0 + ( 4.0 * M_E ) * pow( tanh( sqrt( 6.517 * u ) ), 2.0 ) / t_h );
315 delta_u = 0.5 * delta_u * ( 1.0 + 1.0 / cosh( sqrt( e_r - 1.0 ) ) );
328 0.27488 + u * ( 0.6315 + 0.525 / pow( 1.0 + 0.0157 * f_n, 20.0 ) ) - 0.065683 * exp( -8.7513 * u );
329 const double P_2 = 0.33622 * ( 1.0 - exp( -0.03442 * e_r ) );
330 const double P_3 = 0.0363 * exp( -4.6 * u ) * ( 1.0 - exp( -pow( f_n / 38.7, 4.97 ) ) );
331 const double P_4 = 1.0 + 2.751 * ( 1.0 - exp( -pow( e_r / 15.916, 8.0 ) ) );
333 return P_1 * P_2 * pow( ( P_3 * P_4 + 0.1844 ) * f_n, 1.5763 );
401 const double q = ( q_inf - q_t ) * q_c;
407 const double e_r_eff = e_r_eff_t * pow(
Z0_h_1 / Z0_h_r, 2.0 );
430 const double e_r_eff_f = e_r - ( e_r - e_r_eff_0 ) / ( 1.0 + P );
432 const double D =
Z0_dispersion( u, e_r, e_r_eff_0, e_r_eff_f, f_n );
433 const double Z0_f =
Z0_0 *
D;
454 mur_eff = ( 2.0 * mur ) / ( ( 1.0 + mur ) + ( ( 1.0 - mur ) * pow( ( 1.0 + ( 10.0 * h / w ) ), -0.5 ) ) );
double w_eff
Effective width of line.
void microstrip_Z0()
Calculates the microstrip static impedance.
static double e_r_effective(double, double)
Calculates effective dielectric constant from material e_r and filling factor.
bool Synthesize(SYNTHESIZE_OPTS aOpts) override
Synthesis track geometry parameters to match given Z0.
double Z0_0
static characteristic impedance
void line_angle()
Calculates microstrip length in radians.
void Analyse() override
Analyse track geometry parameters to output Z0 and Ang_L.
static double Z0_dispersion(double, double, double, double, double)
Calculates the dispersion correction factor for the characteristic impedance static.
void dispersion()
Calculates frequency dependent parameters of the microstrip.
static double filling_factor(double, double)
Calculates the filling factor for a microstrip without cover and zero conductor thickness.
double SynthesizeWidth() const
Calculates the width with the current set of parameters.
static double e_r_dispersion(double, double, double)
Calculates the dispersion correction factor for the effective permeability.
static double delta_u_thickness(double, double, double)
Calculates the thickness effect on normalized width.
static double delta_q_thickness(double, double)
Calculates the thickness effect on filling factor.
static double delta_q_cover(double)
Calculates the cover effect on filling factor.
double mur_eff
Effective mag. permeability.
double er_eff_0
Static effective dielectric constant.
void mur_eff_ms()
Calculates the effective magnetic permeability.
void SetSynthesisResults() override
Sets the output values and status following synthesis.
void SetAnalysisResults() override
Sets the output values and status following analysis.
static double Z0_homogeneous(double)
Calculates the impedance for a stripline in a homogeneous medium, without cover effects.
double dielectric_losses() const
Calculates the microstrip dielectric losses per unit.
double Z0_h_1
homogeneous stripline impedance
void attenuation()
Calculates the attenuation of the microstrip.
static double delta_Z0_cover(double, double)
Calculates the cover effect on impedance for a stripline in a homogeneous medium.
double conductor_losses() const
Calculate the microstrip conductor losses per unit.
double GetDispersedEpsilonR(double aF) const
Dispersed permittivity at aF. Returns raw EPSILONR when the model is inactive.
double GetDispersedTanDelta(double aF) const
Dispersed loss tangent at aF. Returns raw TAND when the model is inactive.
double GetParameter(const TRANSLINE_PARAMETERS aParam) const
Gets the given calculation property.
void SetParameter(const TRANSLINE_PARAMETERS aParam, const double aValue)
Sets the given calculation property.
void SetSynthesisResult(TRANSLINE_PARAMETERS aParam, const double aValue, const TRANSLINE_STATUS aStatus=TRANSLINE_STATUS::OK)
Sets a synthesis result.
void UpdateDielectricModel()
Refit the Djordjevic-Sarkar model from the current parameter map.
std::pair< double, double > ApplySoldermaskCorrection(double aEpsEffUncoated, double aTanDeltaSubstrate, double aEpsRSubstrate, double aWOverH, double aF) const
Apply a three-layer (substrate / soldermask / air) correction to an un-coated (eps_eff,...
double SkinDepth() const
Calculate skin depth.
bool MinimiseZ0Error1D(TRANSLINE_PARAMETERS aOptimise, TRANSLINE_PARAMETERS aMeasure, bool aRecalculateLength=false)
minimizeZ0Error1D
void SetAnalysisResult(TRANSLINE_PARAMETERS aParam, const double aValue, const TRANSLINE_STATUS aStatus=TRANSLINE_STATUS::OK)
Sets an analysis result.
static double UnitPropagationDelay(double aEpsilonEff)
Calculates the unit propagation delay (ps/cm) for the given effective permittivity.
SYNTHESIZE_OPTS
Options for specifying synthesis inputs, targets, or strategies.
TRANSLINE_PARAMETERS
All possible parameters used (as inputs or outputs) by the transmission line calculations.