59 const double erEffUncoated =
er_eff_0;
64 const auto [ erEffCoated, tanDCoated ] =
67 if( erEffCoated != erEffUncoated )
70 Z0_0 *= std::sqrt( erEffUncoated / erEffCoated );
135 const bool Z0_invalid = !std::isfinite(
Z0 ) ||
Z0 < 0;
136 const bool ANG_L_invalid = !std::isfinite(
ANG_L ) ||
ANG_L < 0;
137 const bool L_invalid = !std::isfinite(
L ) ||
L < 0;
138 const bool W_invalid = !std::isfinite( W ) || W <= 0;
160 const bool Z0_invalid = !std::isfinite(
Z0 ) ||
Z0 < 0;
161 const bool ANG_L_invalid = !std::isfinite(
ANG_L ) ||
ANG_L < 0;
162 const bool L_invalid = !std::isfinite(
L ) ||
L < 0;
163 const bool W_invalid = !std::isfinite( W ) || W <= 0;
176 + ( ( e_r - 1 ) / ( e_r + 1 ) * ( 0.23 + ( 0.11 / e_r ) ) );
183 w_h = 8 * exp( a ) / ( exp( 2. * a ) - 2 );
188 * ( b - 1. - log( ( 2 * b ) - 1. )
189 + ( ( e_r - 1 ) / ( 2 * e_r ) ) * ( log( b - 1. ) + 0.39 - 0.61 / e_r ) );
205 const double R_1 = 0.03891 * pow( e_r, 1.4 );
206 const double R_2 = 0.267 * pow( u, 7.0 );
207 const double R_3 = 4.766 * exp( -3.228 * pow( u, 0.641 ) );
208 const double R_4 = 0.016 + pow( 0.0514 * e_r, 4.524 );
209 const double R_5 = pow( f_n / 28.843, 12.0 );
210 const double R_6 = 22.2 * pow( u, 1.92 );
211 const double R_7 = 1.206 - 0.3144 * exp( -R_1 ) * ( 1.0 - exp( -R_2 ) );
212 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 ) ) );
213 double tmpf = pow( e_r - 1.0, 6.0 );
214 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 ) )
215 * ( tmpf / ( 1.0 + 10.0 * tmpf ) );
216 const double R_10 = 0.00044 * pow( e_r, 2.136 ) + 0.0184;
217 tmpf = pow( f_n / 19.47, 6.0 );
218 const double R_11 = tmpf / ( 1.0 + 0.0962 * tmpf );
219 const double R_12 = 1.0 / ( 1.0 + 0.00245 * u * u );
220 const double R_13 = 0.9408 * pow( e_r_eff_f, R_8 ) - 0.9603;
221 const double R_14 = ( 0.9408 - R_9 ) * pow( e_r_eff_0, R_8 ) - 0.9603;
222 const double R_15 = 0.707 * R_10 * pow( f_n / 12.3, 1.097 );
223 const double R_16 = 1.0 + 0.0503 * e_r * e_r * R_11 * ( 1.0 - exp( -pow( u / 15.0, 6.0 ) ) );
224 const double R_17 = R_7 * ( 1.0 - 1.1241 * ( R_12 / R_16 ) * exp( -0.026 * pow( f_n, 1.15656 ) - R_15 ) );
226 return pow( R_13 / R_14, R_17 );
232 const double freq = 6.0 + ( 2.0 *
M_PI - 6.0 ) * exp( -pow( 30.666 / u, 0.7528 ) );
233 return (
TC::ZF0 / ( 2.0 *
M_PI ) ) * log( freq / u + sqrt( 1.0 + 4.0 / ( u * u ) ) );
252 const double h2hp1 = 1.0 + h2h;
253 const double P = 270.0 * ( 1.0 - tanh( 0.28 + 1.2 * sqrt( h2h ) ) );
257 const double qArg = ( 0.48 * sqrt( std::max( 0.0, u - 1.0 ) ) ) / ( h2hp1 * h2hp1 );
262 const double Q = 1.0 -
atanh( qArg );
269 const double u2 = u * u;
270 const double u3 = u2 * u;
271 const double u4 = u3 * u;
272 const double a = 1.0 + log( ( u4 + u2 / 2704 ) / ( u4 + 0.432 ) ) / 49.0 + log( 1.0 + u3 / 5929.741 ) / 18.7;
273 const double b = 0.564 * pow( ( e_r - 0.9 ) / ( e_r + 3.0 ), 0.053 );
274 return pow( 1.0 + 10.0 / u, -a * b );
292 return tanh( 1.043 + 0.121 * h2h - 1.164 / h2h );
298 return ( 2.0 * log( 2.0 ) /
M_PI ) * ( t_h / sqrt( u ) );
304 return 0.5 * ( e_r + 1.0 ) + 0.5 * q * ( e_r - 1.0 );
315 delta_u = ( t_h /
M_PI ) * log( 1.0 + ( 4.0 * M_E ) * pow( tanh( sqrt( 6.517 * u ) ), 2.0 ) / t_h );
317 delta_u = 0.5 * delta_u * ( 1.0 + 1.0 / cosh( sqrt( e_r - 1.0 ) ) );
330 0.27488 + u * ( 0.6315 + 0.525 / pow( 1.0 + 0.0157 * f_n, 20.0 ) ) - 0.065683 * exp( -8.7513 * u );
331 const double P_2 = 0.33622 * ( 1.0 - exp( -0.03442 * e_r ) );
332 const double P_3 = 0.0363 * exp( -4.6 * u ) * ( 1.0 - exp( -pow( f_n / 38.7, 4.97 ) ) );
333 const double P_4 = 1.0 + 2.751 * ( 1.0 - exp( -pow( e_r / 15.916, 8.0 ) ) );
335 return P_1 * P_2 * pow( ( P_3 * P_4 + 0.1844 ) * f_n, 1.5763 );
403 const double q = ( q_inf - q_t ) * q_c;
409 const double e_r_eff = e_r_eff_t * pow(
Z0_h_1 / Z0_h_r, 2.0 );
432 const double e_r_eff_f = e_r - ( e_r - e_r_eff_0 ) / ( 1.0 + P );
434 const double D =
Z0_dispersion( u, e_r, e_r_eff_0, e_r_eff_f, f_n );
435 const double Z0_f =
Z0_0 *
D;
456 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.