KiCad PCB EDA Suite
Loading...
Searching...
No Matches
coupled_microstrip.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2001 Gopal Narayanan <[email protected]>
3 * Copyright (C) 2002 Claudio Girardi <[email protected]>
4 * Copyright (C) 2005, 2006 Stefan Jahn <[email protected]>
5 * Modified for Kicad: 2018 Jean-Pierre Charras <jp.charras at wanadoo.fr>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this package; see the file COPYING. If not, write to
20 * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22 */
23
26
27
28namespace TC = TRANSLINE_CALCULATIONS;
30
31
33{
34 // Compute thickness corrections
36
37 // Get effective dielectric constants
39
40 // Impedances for even- and odd-mode
42
43 // Calculate freq dependence of er_eff_e, er_eff_o
45
46 // Calculate frequency dependence of Z0e, Z0o */
48
49 // Calculate losses
51
52 // Calculate electrical lengths
53 line_angle();
54
55 // Calculate diff impedance
57}
58
59
61{
62 if( aOpts == SYNTHESIZE_OPTS::FIX_WIDTH )
63 return MinimiseZ0Error1D( TCP::PHYS_S, TCP::Z0_O );
64
65 if( aOpts == SYNTHESIZE_OPTS::FIX_SPACING )
66 return MinimiseZ0Error1D( TCP::PHYS_WIDTH, TCP::Z0_O );
67
68 double Z0_e, Z0_o, ang_l_dest;
69 double f1, f2, ft1, ft2, j11, j12, j21, j22, d_s_h, d_w_h, err;
70 double eps = 1e-04;
71 double w_h, s_h, le, lo;
72
73 /* required value of Z0_e and Z0_o */
74 Z0_e = GetParameter( TCP::Z0_E );
75 Z0_o = GetParameter( TCP::Z0_O );
76
77 ang_l_e = GetParameter( TCP::ANG_L );
78 ang_l_o = GetParameter( TCP::ANG_L );
79 ang_l_dest = GetParameter( TCP::ANG_L );
80
81 /* calculate width and use for initial value in Newton's method */
83 w_h = GetParameter( TCP::PHYS_WIDTH ) / GetParameter( TCP::H );
84 s_h = GetParameter( TCP::PHYS_S ) / GetParameter( TCP::H );
85 f1 = f2 = 0;
86
87 int iters = 0;
88
89 /* rather crude Newton-Rhapson */
90 do
91 {
92 ++iters;
93
94 /* compute Jacobian */
95 syn_fun( &ft1, &ft2, s_h + eps, w_h, Z0_e, Z0_o );
96 j11 = ( ft1 - f1 ) / eps;
97 j21 = ( ft2 - f2 ) / eps;
98 syn_fun( &ft1, &ft2, s_h, w_h + eps, Z0_e, Z0_o );
99 j12 = ( ft1 - f1 ) / eps;
100 j22 = ( ft2 - f2 ) / eps;
101
102 /* compute next step; increments of s_h and w_h */
103 d_s_h = ( -f1 * j22 + f2 * j12 ) / ( j11 * j22 - j21 * j12 );
104 d_w_h = ( -f2 * j11 + f1 * j21 ) / ( j11 * j22 - j21 * j12 );
105
106 s_h += d_s_h;
107 w_h += d_w_h;
108
109 /* compute the error with the new values of s_h and w_h */
110 syn_fun( &f1, &f2, s_h, w_h, Z0_e, Z0_o );
111 err = sqrt( f1 * f1 + f2 * f2 );
112
113 /* converged ? */
114 } while( err > 1e-04 && iters < 250 );
115
116 if( err > 1e-04 )
117 return false;
118
119 /* denormalize computed width and spacing */
120 SetParameter( TCP::PHYS_S, s_h * GetParameter( TCP::H ) );
121 SetParameter( TCP::PHYS_WIDTH, w_h * GetParameter( TCP::H ) );
122
123 /* calculate physical length */
124 le = TC::C0 / GetParameter( TCP::FREQUENCY ) / sqrt( er_eff_e ) * ang_l_dest / 2.0 / M_PI;
125 lo = TC::C0 / GetParameter( TCP::FREQUENCY ) / sqrt( er_eff_o ) * ang_l_dest / 2.0 / M_PI;
126 SetParameter( TCP::PHYS_LEN, sqrt( le * lo ) );
127
128 Analyse();
129
130 SetParameter( TCP::ANG_L, ang_l_dest );
131 SetParameter( TCP::Z0_E, Z0_e );
132 SetParameter( TCP::Z0_O, Z0_o );
133
134 return true;
135}
136
137
139{
140 SetAnalysisResult( TCP::EPSILON_EFF_EVEN, er_eff_e );
141 SetAnalysisResult( TCP::EPSILON_EFF_ODD, er_eff_o );
142 SetAnalysisResult( TCP::UNIT_PROP_DELAY_EVEN, prop_delay_e );
143 SetAnalysisResult( TCP::UNIT_PROP_DELAY_ODD, prop_delay_o );
144 SetAnalysisResult( TCP::ATTEN_COND_EVEN, atten_cond_e );
145 SetAnalysisResult( TCP::ATTEN_COND_ODD, atten_cond_o );
146 SetAnalysisResult( TCP::ATTEN_DILECTRIC_EVEN, atten_dielectric_e );
147 SetAnalysisResult( TCP::ATTEN_DILECTRIC_ODD, atten_dielectric_o );
148 SetAnalysisResult( TCP::SKIN_DEPTH, GetParameter( TCP::SKIN_DEPTH ) );
149 SetAnalysisResult( TCP::Z_DIFF, Zdiff );
150
151 const double Z0_E = GetParameter( TCP::Z0_E );
152 const double Z0_O = GetParameter( TCP::Z0_O );
153 const double ANG_L = sqrt( ang_l_e * ang_l_o );
154 const double W = GetParameter( TCP::PHYS_WIDTH );
155 const double L = GetParameter( TCP::PHYS_LEN );
156 const double S = GetParameter( TCP::PHYS_S );
157
158 const bool Z0_E_invalid = !std::isfinite( Z0_E ) || Z0_E <= 0;
159 const bool Z0_O_invalid = !std::isfinite( Z0_O ) || Z0_O <= 0;
160 const bool ANG_L_invalid = !std::isfinite( ANG_L ) || ANG_L < 0;
161 const bool W_invalid = !std::isfinite( W ) || W <= 0;
162 const bool L_invalid = !std::isfinite( L ) || L < 0;
163 const bool S_invalid = !std::isfinite( S ) || S <= 0;
164
165 SetAnalysisResult( TCP::Z0_E, Z0_E, Z0_E_invalid ? TRANSLINE_STATUS::TS_ERROR : TRANSLINE_STATUS::OK );
166 SetAnalysisResult( TCP::Z0_O, Z0_O, Z0_O_invalid ? TRANSLINE_STATUS::TS_ERROR : TRANSLINE_STATUS::OK );
167 SetAnalysisResult( TCP::ANG_L, ANG_L, ANG_L_invalid ? TRANSLINE_STATUS::TS_ERROR : TRANSLINE_STATUS::OK );
168 SetAnalysisResult( TCP::PHYS_WIDTH, W, W_invalid ? TRANSLINE_STATUS::WARNING : TRANSLINE_STATUS::OK );
169 SetAnalysisResult( TCP::PHYS_LEN, L, L_invalid ? TRANSLINE_STATUS::WARNING : TRANSLINE_STATUS::OK );
170 SetAnalysisResult( TCP::PHYS_S, S, S_invalid ? TRANSLINE_STATUS::WARNING : TRANSLINE_STATUS::OK );
171}
172
173
175{
176 SetAnalysisResult( TCP::EPSILON_EFF_EVEN, er_eff_e );
177 SetAnalysisResult( TCP::EPSILON_EFF_ODD, er_eff_o );
178 SetAnalysisResult( TCP::UNIT_PROP_DELAY_EVEN, prop_delay_e );
179 SetAnalysisResult( TCP::UNIT_PROP_DELAY_ODD, prop_delay_o );
180 SetAnalysisResult( TCP::ATTEN_COND_EVEN, atten_cond_e );
181 SetAnalysisResult( TCP::ATTEN_COND_ODD, atten_cond_o );
182 SetAnalysisResult( TCP::ATTEN_DILECTRIC_EVEN, atten_dielectric_e );
183 SetAnalysisResult( TCP::ATTEN_DILECTRIC_ODD, atten_dielectric_o );
184 SetAnalysisResult( TCP::SKIN_DEPTH, GetParameter( TCP::SKIN_DEPTH ) );
185 SetAnalysisResult( TCP::Z_DIFF, Zdiff );
186
187 const double Z0_E = GetParameter( TCP::Z0_E );
188 const double Z0_O = GetParameter( TCP::Z0_O );
189 const double ANG_L = sqrt( ang_l_e * ang_l_o );
190 const double W = GetParameter( TCP::PHYS_WIDTH );
191 const double L = GetParameter( TCP::PHYS_LEN );
192 const double S = GetParameter( TCP::PHYS_S );
193
194 const bool Z0_E_invalid = !std::isfinite( Z0_E ) || Z0_E <= 0;
195 const bool Z0_O_invalid = !std::isfinite( Z0_O ) || Z0_O <= 0;
196 const bool ANG_L_invalid = !std::isfinite( ANG_L ) || ANG_L < 0;
197 const bool W_invalid = !std::isfinite( W ) || W <= 0;
198 const bool L_invalid = !std::isfinite( L ) || L < 0;
199 const bool S_invalid = !std::isfinite( S ) || S <= 0;
200
201 SetAnalysisResult( TCP::Z0_E, Z0_E, Z0_E_invalid ? TRANSLINE_STATUS::WARNING : TRANSLINE_STATUS::OK );
202 SetAnalysisResult( TCP::Z0_O, Z0_O, Z0_O_invalid ? TRANSLINE_STATUS::WARNING : TRANSLINE_STATUS::OK );
203 SetAnalysisResult( TCP::ANG_L, ANG_L, ANG_L_invalid ? TRANSLINE_STATUS::WARNING : TRANSLINE_STATUS::OK );
204 SetAnalysisResult( TCP::PHYS_WIDTH, W, W_invalid ? TRANSLINE_STATUS::TS_ERROR : TRANSLINE_STATUS::OK );
205 SetAnalysisResult( TCP::PHYS_LEN, L, L_invalid ? TRANSLINE_STATUS::TS_ERROR : TRANSLINE_STATUS::OK );
206 SetAnalysisResult( TCP::PHYS_S, S, S_invalid ? TRANSLINE_STATUS::TS_ERROR : TRANSLINE_STATUS::OK );
207}
208
209
211{
212 double delta_u;
213
214 if( t_h > 0.0 )
215 {
216 delta_u = ( 1.25 * t_h / M_PI )
217 * ( 1.0
218 + log( ( 2.0 + ( 4.0 * M_PI * u - 2.0 ) / ( 1.0 + exp( -100.0 * ( u - 1.0 / ( 2.0 * M_PI ) ) ) ) )
219 / t_h ) );
220 }
221 else
222 {
223 delta_u = 0.0;
224 }
225 return delta_u;
226}
227
228
229/*
230 * delta_u_thickness() - compute the thickness effect on normalized
231 * width for coupled microstrips
232 *
233 * References: Rolf Jansen, "High-Speed Computation of Single and
234 * Coupled Microstrip Parameters Including Dispersion, High-Order
235 * Modes, Loss and Finite Strip Thickness", IEEE Trans. MTT, vol. 26,
236 * no. 2, pp. 75-82, Feb. 1978
237 */
239{
240 double e_r, u, g, t_h;
241 double delta_u, delta_t, delta_u_e, delta_u_o;
242
243 e_r = GetParameter( TCP::EPSILONR );
244 u = GetParameter( TCP::PHYS_WIDTH ) / GetParameter( TCP::H ); /* normalized line width */
245 g = GetParameter( TCP::PHYS_S ) / GetParameter( TCP::H ); /* normalized line spacing */
246 t_h = GetParameter( TCP::T ) / GetParameter( TCP::H ); /* normalized strip thickness */
247
248 if( t_h > 0.0 )
249 {
250 /* single microstrip correction for finite strip thickness */
251 delta_u = delta_u_thickness_single( u, t_h );
252 delta_t = t_h / ( g * e_r );
253 /* thickness correction for the even- and odd-mode */
254 delta_u_e = delta_u * ( 1.0 - 0.5 * exp( -0.69 * delta_u / delta_t ) );
255 delta_u_o = delta_u_e + delta_t;
256 }
257 else
258 {
259 delta_u_e = delta_u_o = 0.0;
260 }
261
262 w_t_e = GetParameter( TCP::PHYS_WIDTH ) + delta_u_e * GetParameter( TCP::H );
263 w_t_o = GetParameter( TCP::PHYS_WIDTH ) + delta_u_o * GetParameter( TCP::H );
264}
265
266
268{
269 /* prepare parameters for single microstrip computations */
270 m_aux_microstrip.SetParameter( TCP::EPSILONR, GetParameter( TCP::EPSILONR ) );
271 m_aux_microstrip.SetParameter( TCP::PHYS_WIDTH, GetParameter( TCP::PHYS_WIDTH ) );
272 m_aux_microstrip.SetParameter( TCP::H, GetParameter( TCP::H ) );
273 m_aux_microstrip.SetParameter( TCP::T, 0.0 );
274
275 //m_aux_microstrip.m_parameters[H_T ) = m_parameters[H_T );
276 m_aux_microstrip.SetParameter( TCP::H_T, 1e12 ); /* arbitrarily high */
277 m_aux_microstrip.SetParameter( TCP::FREQUENCY, GetParameter( TCP::FREQUENCY ) );
278 m_aux_microstrip.SetParameter( TCP::MURC, GetParameter( TCP::MURC ) );
281}
282
283
284double COUPLED_MICROSTRIP::filling_factor_even( double u, double g, double e_r )
285{
286 double v, v3, v4, a_e, b_e, q_inf;
287
288 v = u * ( 20.0 + g * g ) / ( 10.0 + g * g ) + g * exp( -g );
289 v3 = v * v * v;
290 v4 = v3 * v;
291 a_e = 1.0 + log( ( v4 + v * v / 2704.0 ) / ( v4 + 0.432 ) ) / 49.0 + log( 1.0 + v3 / 5929.741 ) / 18.7;
292 b_e = 0.564 * pow( ( ( e_r - 0.9 ) / ( e_r + 3.0 ) ), 0.053 );
293
294 /* filling factor, with width corrected for thickness */
295 q_inf = pow( ( 1.0 + 10.0 / v ), -a_e * b_e );
296
297 return q_inf;
298}
299
300
301double COUPLED_MICROSTRIP::filling_factor_odd( double u, double g, double e_r )
302{
303 double b_odd = 0.747 * e_r / ( 0.15 + e_r );
304 double c_odd = b_odd - ( b_odd - 0.207 ) * exp( -0.414 * u );
305 double d_odd = 0.593 + 0.694 * exp( -0.562 * u );
306
307 /* filling factor, with width corrected for thickness */
308 double q_inf = exp( -c_odd * pow( g, d_odd ) );
309
310 return q_inf;
311}
312
313
315{
316 double q_c;
317
318 if( h2h <= 39 )
319 q_c = tanh( 1.626 + 0.107 * h2h - 1.733 / sqrt( h2h ) );
320 else
321 q_c = 1.0;
322
323 return q_c;
324}
325
326
328{
329 double q_c;
330
331 if( h2h <= 7 )
332 q_c = tanh( 9.575 / ( 7.0 - h2h ) - 2.965 + 1.68 * h2h - 0.311 * h2h * h2h );
333 else
334 q_c = 1.0;
335
336 return q_c;
337}
338
339
341{
342 double u_t_e, u_t_o, g, h2, h2h;
343 double a_o, t_h, q, q_c, q_t, q_inf;
344 double er_eff_single;
345 double er;
346
347 er = GetParameter( TCP::EPSILONR );
348
349 /* compute zero-thickness single line parameters */
351 er_eff_single = m_aux_microstrip.er_eff_0;
352
353 h2 = GetParameter( TCP::H_T );
354 u_t_e = w_t_e / GetParameter( TCP::H ); /* normalized even_mode line width */
355 u_t_o = w_t_o / GetParameter( TCP::H ); /* normalized odd_mode line width */
356 g = GetParameter( TCP::PHYS_S ) / GetParameter( TCP::H ); /* normalized line spacing */
357 h2h = h2 / GetParameter( TCP::H ); /* normalized cover height */
358 t_h = GetParameter( TCP::T ) / GetParameter( TCP::H ); /* normalized strip thickness */
359
360 /* filling factor, computed with thickness corrected width */
361 q_inf = filling_factor_even( u_t_e, g, er );
362 /* cover effect */
363 q_c = delta_q_cover_even( h2h );
364 /* thickness effect */
365 q_t = m_aux_microstrip.delta_q_thickness( u_t_e, t_h );
366 /* resultant filling factor */
367 q = ( q_inf - q_t ) * q_c;
368 /* static even-mode effective dielectric constant */
369 er_eff_e_0 = 0.5 * ( er + 1.0 ) + 0.5 * ( er - 1.0 ) * q;
370
371 /* filling factor, with width corrected for thickness */
372 q_inf = filling_factor_odd( u_t_o, g, er );
373 /* cover effect */
374 q_c = delta_q_cover_odd( h2h );
375 /* thickness effect */
376 q_t = m_aux_microstrip.delta_q_thickness( u_t_o, t_h );
377 /* resultant filling factor */
378 q = ( q_inf - q_t ) * q_c;
379
380 a_o = 0.7287 * ( er_eff_single - 0.5 * ( er + 1.0 ) ) * ( 1.0 - exp( -0.179 * u_t_o ) );
381
382 /* static odd-mode effective dielectric constant */
383 er_eff_o_0 = ( 0.5 * ( er + 1.0 ) + a_o - er_eff_single ) * q + er_eff_single;
384}
385
386
387double COUPLED_MICROSTRIP::delta_Z0_even_cover( double g, double u, double h2h )
388{
389 double f_e, g_e, delta_Z0_even;
390 double x, y, A, B, C, D, E, F;
391
392 A = -4.351 / pow( 1.0 + h2h, 1.842 );
393 B = 6.639 / pow( 1.0 + h2h, 1.861 );
394 C = -2.291 / pow( 1.0 + h2h, 1.90 );
395 f_e = 1.0 - atanh( A + ( B + C * u ) * u );
396
397 x = pow( 10.0, 0.103 * g - 0.159 );
398 y = pow( 10.0, 0.0492 * g - 0.073 );
399 D = 0.747 / sin( 0.5 * M_PI * x );
400 E = 0.725 * sin( 0.5 * M_PI * y );
401 F = pow( 10.0, 0.11 - 0.0947 * g );
402 g_e = 270.0 * ( 1.0 - tanh( D + E * sqrt( 1.0 + h2h ) - F / ( 1.0 + h2h ) ) );
403
404 delta_Z0_even = f_e * g_e;
405
406 return delta_Z0_even;
407}
408
409
410double COUPLED_MICROSTRIP::delta_Z0_odd_cover( double g, double u, double h2h )
411{
412 double f_o, g_o, delta_Z0_odd;
413 double G, J, K, L;
414
415 J = tanh( pow( 1.0 + h2h, 1.585 ) / 6.0 );
416 f_o = pow( u, J );
417
418 G = 2.178 - 0.796 * g;
419
420 if( g > 0.858 )
421 K = log10( 20.492 * pow( g, 0.174 ) );
422 else
423 K = 1.30;
424
425 if( g > 0.873 )
426 L = 2.51 * pow( g, -0.462 );
427 else
428 L = 2.674;
429
430 g_o = 270.0 * ( 1.0 - tanh( G + K * sqrt( 1.0 + h2h ) - L / ( 1.0 + h2h ) ) );
431
432 delta_Z0_odd = f_o * g_o;
433
434 return delta_Z0_odd;
435}
436
437
439{
440 double er_eff, h2, u_t_e, u_t_o, g, h2h;
441 double Q_1, Q_2, Q_3, Q_4, Q_5, Q_6, Q_7, Q_8, Q_9, Q_10;
442 double delta_Z0_e_0, delta_Z0_o_0, Z0_single, er_eff_single;
443
444 h2 = GetParameter( TCP::H_T );
445 u_t_e = w_t_e / GetParameter( TCP::H ); /* normalized even-mode line width */
446 u_t_o = w_t_o / GetParameter( TCP::H ); /* normalized odd-mode line width */
447 g = GetParameter( TCP::PHYS_S ) / GetParameter( TCP::H ); /* normalized line spacing */
448 h2h = h2 / GetParameter( TCP::H ); /* normalized cover height */
449
450 Z0_single = m_aux_microstrip.Z0_0;
451 er_eff_single = m_aux_microstrip.er_eff_0;
452
453 /* even-mode */
454 er_eff = er_eff_e_0;
455 Q_1 = 0.8695 * pow( u_t_e, 0.194 );
456 Q_2 = 1.0 + 0.7519 * g + 0.189 * pow( g, 2.31 );
457 Q_3 = 0.1975 + pow( ( 16.6 + pow( ( 8.4 / g ), 6.0 ) ), -0.387 )
458 + log( pow( g, 10.0 ) / ( 1.0 + pow( g / 3.4, 10.0 ) ) ) / 241.0;
459 Q_4 = 2.0 * Q_1 / ( Q_2 * ( exp( -g ) * pow( u_t_e, Q_3 ) + ( 2.0 - exp( -g ) ) * pow( u_t_e, -Q_3 ) ) );
460 /* static even-mode impedance */
461 Z0_e_0 = Z0_single * sqrt( er_eff_single / er_eff ) / ( 1.0 - sqrt( er_eff_single ) * Q_4 * Z0_single / TC::ZF0 );
462 /* correction for cover */
463 delta_Z0_e_0 = delta_Z0_even_cover( g, u_t_e, h2h ) / sqrt( er_eff );
464
465 Z0_e_0 = Z0_e_0 - delta_Z0_e_0;
466
467 /* odd-mode */
468 er_eff = er_eff_o_0;
469 Q_5 = 1.794 + 1.14 * log( 1.0 + 0.638 / ( g + 0.517 * pow( g, 2.43 ) ) );
470 Q_6 = 0.2305 + log( pow( g, 10.0 ) / ( 1.0 + pow( g / 5.8, 10.0 ) ) ) / 281.3
471 + log( 1.0 + 0.598 * pow( g, 1.154 ) ) / 5.1;
472 Q_7 = ( 10.0 + 190.0 * g * g ) / ( 1.0 + 82.3 * g * g * g );
473 Q_8 = exp( -6.5 - 0.95 * log( g ) - pow( g / 0.15, 5.0 ) );
474 Q_9 = log( Q_7 ) * ( Q_8 + 1.0 / 16.5 );
475 Q_10 = ( Q_2 * Q_4 - Q_5 * exp( log( u_t_o ) * Q_6 * pow( u_t_o, -Q_9 ) ) ) / Q_2;
476
477 /* static odd-mode impedance */
478 Z0_o_0 = Z0_single * sqrt( er_eff_single / er_eff ) / ( 1.0 - sqrt( er_eff_single ) * Q_10 * Z0_single / TC::ZF0 );
479 /* correction for cover */
480 delta_Z0_o_0 = delta_Z0_odd_cover( g, u_t_o, h2h ) / sqrt( er_eff );
481
482 Z0_o_0 = Z0_o_0 - delta_Z0_o_0;
483}
484
485
487{
488 double P_1, P_2, P_3, P_4, P_5, P_6, P_7;
489 double P_8, P_9, P_10, P_11, P_12, P_13, P_14, P_15;
490 double F_e, F_o;
491 double er_eff, u, g, f_n;
492
493 u = GetParameter( TCP::PHYS_WIDTH ) / GetParameter( TCP::H ); /* normalize line width */
494 g = GetParameter( TCP::PHYS_S ) / GetParameter( TCP::H ); /* normalize line spacing */
495
496 /* normalized frequency [GHz * mm] */
497 f_n = GetParameter( TCP::FREQUENCY ) * GetParameter( TCP::H ) / 1e06;
498
499 er_eff = er_eff_e_0;
500 P_1 = 0.27488 + ( 0.6315 + 0.525 / pow( 1.0 + 0.0157 * f_n, 20.0 ) ) * u - 0.065683 * exp( -8.7513 * u );
501 P_2 = 0.33622 * ( 1.0 - exp( -0.03442 * GetParameter( TCP::EPSILONR ) ) );
502 P_3 = 0.0363 * exp( -4.6 * u ) * ( 1.0 - exp( -pow( f_n / 38.7, 4.97 ) ) );
503 P_4 = 1.0 + 2.751 * ( 1.0 - exp( -pow( GetParameter( TCP::EPSILONR ) / 15.916, 8.0 ) ) );
504 P_5 = 0.334 * exp( -3.3 * pow( GetParameter( TCP::EPSILONR ) / 15.0, 3.0 ) ) + 0.746;
505 P_6 = P_5 * exp( -pow( f_n / 18.0, 0.368 ) );
506 P_7 = 1.0 + 4.069 * P_6 * pow( g, 0.479 ) * exp( -1.347 * pow( g, 0.595 ) - 0.17 * pow( g, 2.5 ) );
507
508 F_e = P_1 * P_2 * pow( ( P_3 * P_4 + 0.1844 * P_7 ) * f_n, 1.5763 );
509 /* even-mode effective dielectric constant */
510 er_eff_e = GetParameter( TCP::EPSILONR ) - ( GetParameter( TCP::EPSILONR ) - er_eff ) / ( 1.0 + F_e );
512
513 er_eff = er_eff_o_0;
514 P_8 = 0.7168 * ( 1.0 + 1.076 / ( 1.0 + 0.0576 * ( GetParameter( TCP::EPSILONR ) - 1.0 ) ) );
515 P_9 = P_8
516 - 0.7913 * ( 1.0 - exp( -pow( f_n / 20.0, 1.424 ) ) )
517 * atan( 2.481 * pow( GetParameter( TCP::EPSILONR ) / 8.0, 0.946 ) );
518 P_10 = 0.242 * pow( GetParameter( TCP::EPSILONR ) - 1.0, 0.55 );
519 P_11 = 0.6366 * ( exp( -0.3401 * f_n ) - 1.0 ) * atan( 1.263 * pow( u / 3.0, 1.629 ) );
520 P_12 = P_9 + ( 1.0 - P_9 ) / ( 1.0 + 1.183 * pow( u, 1.376 ) );
521 P_13 = 1.695 * P_10 / ( 0.414 + 1.605 * P_10 );
522 P_14 = 0.8928 + 0.1072 * ( 1.0 - exp( -0.42 * pow( f_n / 20.0, 3.215 ) ) );
523 P_15 = fabs( 1.0 - 0.8928 * ( 1.0 + P_11 ) * P_12 * exp( -P_13 * pow( g, 1.092 ) ) / P_14 );
524
525 F_o = P_1 * P_2 * pow( ( P_3 * P_4 + 0.1844 ) * f_n * P_15, 1.5763 );
526 /* odd-mode effective dielectric constant */
527 er_eff_o = GetParameter( TCP::EPSILONR ) - ( GetParameter( TCP::EPSILONR ) - er_eff ) / ( 1.0 + F_o );
529}
530
531
533{
534 double e_r_eff_e_0, e_r_eff_o_0, Z0_h_e, Z0_h_o, delta;
535 double K, R_s, Q_c_e, Q_c_o, alpha_c_e, alpha_c_o;
536
537 e_r_eff_e_0 = er_eff_e_0;
538 e_r_eff_o_0 = er_eff_o_0;
539 Z0_h_e = Z0_e_0 * sqrt( e_r_eff_e_0 ); /* homogeneous stripline impedance */
540 Z0_h_o = Z0_o_0 * sqrt( e_r_eff_o_0 ); /* homogeneous stripline impedance */
541 delta = GetParameter( TCP::SKIN_DEPTH );
542
543 if( GetParameter( TCP::FREQUENCY ) > 0.0 )
544 {
545 /* current distribution factor (same for the two modes) */
546 K = exp( -1.2 * pow( ( Z0_h_e + Z0_h_o ) / ( 2.0 * TC::ZF0 ), 0.7 ) );
547 /* skin resistance */
548 R_s = 1.0 / ( GetParameter( TCP::SIGMA ) * delta );
549 /* correction for surface roughness */
550 R_s *= 1.0 + ( ( 2.0 / M_PI ) * atan( 1.40 * pow( ( GetParameter( TCP::ROUGH ) / delta ), 2.0 ) ) );
551
552 /* even-mode strip inductive quality factor */
553 Q_c_e = ( M_PI * Z0_h_e * GetParameter( TCP::PHYS_WIDTH ) * GetParameter( TCP::FREQUENCY ) )
554 / ( R_s * TC::C0 * K );
555 /* even-mode losses per unit length */
556 alpha_c_e = ( 20.0 * M_PI / log( 10.0 ) ) * GetParameter( TCP::FREQUENCY ) * sqrt( e_r_eff_e_0 )
557 / ( TC::C0 * Q_c_e );
558
559 /* odd-mode strip inductive quality factor */
560 Q_c_o = ( M_PI * Z0_h_o * GetParameter( TCP::PHYS_WIDTH ) * GetParameter( TCP::FREQUENCY ) )
561 / ( R_s * TC::C0 * K );
562 /* odd-mode losses per unit length */
563 alpha_c_o = ( 20.0 * M_PI / log( 10.0 ) ) * GetParameter( TCP::FREQUENCY ) * sqrt( e_r_eff_o_0 )
564 / ( TC::C0 * Q_c_o );
565 }
566 else
567 {
568 alpha_c_e = alpha_c_o = 0.0;
569 }
570
571 atten_cond_e = alpha_c_e * GetParameter( TCP::PHYS_LEN );
572 atten_cond_o = alpha_c_o * GetParameter( TCP::PHYS_LEN );
573}
574
575
577{
578 double e_r, e_r_eff_e_0, e_r_eff_o_0;
579 double alpha_d_e, alpha_d_o;
580
581 e_r = GetParameter( TCP::EPSILONR );
582 e_r_eff_e_0 = er_eff_e_0;
583 e_r_eff_o_0 = er_eff_o_0;
584
585 alpha_d_e = ( 20.0 * M_PI / log( 10.0 ) ) * ( GetParameter( TCP::FREQUENCY ) / TC::C0 )
586 * ( e_r / sqrt( e_r_eff_e_0 ) ) * ( ( e_r_eff_e_0 - 1.0 ) / ( e_r - 1.0 ) ) * GetParameter( TCP::TAND );
587 alpha_d_o = ( 20.0 * M_PI / log( 10.0 ) ) * ( GetParameter( TCP::FREQUENCY ) / TC::C0 )
588 * ( e_r / sqrt( e_r_eff_o_0 ) ) * ( ( e_r_eff_o_0 - 1.0 ) / ( e_r - 1.0 ) ) * GetParameter( TCP::TAND );
589
590 atten_dielectric_e = alpha_d_e * GetParameter( TCP::PHYS_LEN );
591 atten_dielectric_o = alpha_d_o * GetParameter( TCP::PHYS_LEN );
592}
593
594
596{
597 SetParameter( TCP::SKIN_DEPTH, SkinDepth() );
600}
601
602
604{
605 double e_r_eff_e, e_r_eff_o;
606 double v_e, v_o, lambda_g_e, lambda_g_o;
607
608 e_r_eff_e = er_eff_e;
609 e_r_eff_o = er_eff_o;
610
611 /* even-mode velocity */
612 v_e = TC::C0 / sqrt( e_r_eff_e );
613 /* odd-mode velocity */
614 v_o = TC::C0 / sqrt( e_r_eff_o );
615 /* even-mode wavelength */
616 lambda_g_e = v_e / GetParameter( TCP::FREQUENCY );
617 /* odd-mode wavelength */
618 lambda_g_o = v_o / GetParameter( TCP::FREQUENCY );
619 /* electrical angles */
620 ang_l_e = 2.0 * M_PI * GetParameter( TCP::PHYS_LEN ) / lambda_g_e; /* in radians */
621 ang_l_o = 2.0 * M_PI * GetParameter( TCP::PHYS_LEN ) / lambda_g_o; /* in radians */
622}
623
624
626{
627 // Note that differential impedance is exactly twice the odd mode impedance.
628 // Odd mode is not the same as single-ended impedance, so avoid approximations found
629 // on websites that use static single ended impedance as the starting point
630
631 Zdiff = 2 * Z0_o_0;
632}
633
634
635/*
636 * Z0_dispersion() - calculate frequency dependency of characteristic
637 * impedances
638 */
640{
641 double Q_0;
642 double Q_11, Q_12, Q_13, Q_14, Q_15, Q_16, Q_17, Q_18, Q_19, Q_20, Q_21;
643 double Q_22, Q_23, Q_24, Q_25, Q_26, Q_27, Q_28, Q_29;
644 double r_e, q_e, p_e, d_e, C_e;
645 double e_r_eff_o_f, e_r_eff_o_0;
646 double e_r_eff_single_f, e_r_eff_single_0, Z0_single_f;
647 double f_n, g, u, e_r;
648 double R_1, R_2, R_7, R_10, R_11, R_12, R_15, R_16, tmpf;
649
650 e_r = GetParameter( TCP::EPSILONR );
651
652 u = GetParameter( TCP::PHYS_WIDTH ) / GetParameter( TCP::H ); /* normalize line width */
653 g = GetParameter( TCP::PHYS_S ) / GetParameter( TCP::H ); /* normalize line spacing */
654
655 /* normalized frequency [GHz * mm] */
656 f_n = GetParameter( TCP::FREQUENCY ) * GetParameter( TCP::H ) / 1e06;
657
658 e_r_eff_single_f = m_aux_microstrip.GetParameter( TCP::EPSILON_EFF );
659 e_r_eff_single_0 = m_aux_microstrip.er_eff_0;
660 Z0_single_f = m_aux_microstrip.GetParameter( TCP::Z0 );
661
662 e_r_eff_o_f = er_eff_o;
663 e_r_eff_o_0 = er_eff_o_0;
664
665 Q_11 = 0.893 * ( 1.0 - 0.3 / ( 1.0 + 0.7 * ( e_r - 1.0 ) ) );
666 Q_12 = 2.121 * ( pow( f_n / 20.0, 4.91 ) / ( 1.0 + Q_11 * pow( f_n / 20.0, 4.91 ) ) ) * exp( -2.87 * g )
667 * pow( g, 0.902 );
668 Q_13 = 1.0 + 0.038 * pow( e_r / 8.0, 5.1 );
669 Q_14 = 1.0 + 1.203 * pow( e_r / 15.0, 4.0 ) / ( 1.0 + pow( e_r / 15.0, 4.0 ) );
670 Q_15 = 1.887 * exp( -1.5 * pow( g, 0.84 ) ) * pow( g, Q_14 )
671 / ( 1.0 + 0.41 * pow( f_n / 15.0, 3.0 ) * pow( u, 2.0 / Q_13 ) / ( 0.125 + pow( u, 1.626 / Q_13 ) ) );
672 Q_16 = ( 1.0 + 9.0 / ( 1.0 + 0.403 * pow( e_r - 1.0, 2 ) ) ) * Q_15;
673 Q_17 = 0.394 * ( 1.0 - exp( -1.47 * pow( u / 7.0, 0.672 ) ) ) * ( 1.0 - exp( -4.25 * pow( f_n / 20.0, 1.87 ) ) );
674 Q_18 = 0.61 * ( 1.0 - exp( -2.13 * pow( u / 8.0, 1.593 ) ) ) / ( 1.0 + 6.544 * pow( g, 4.17 ) );
675 Q_19 = 0.21 * g * g * g * g
676 / ( ( 1.0 + 0.18 * pow( g, 4.9 ) ) * ( 1.0 + 0.1 * u * u ) * ( 1.0 + pow( f_n / 24.0, 3.0 ) ) );
677 Q_20 = ( 0.09 + 1.0 / ( 1.0 + 0.1 * pow( e_r - 1, 2.7 ) ) ) * Q_19;
678 Q_21 = fabs( 1.0 - 42.54 * pow( g, 0.133 ) * exp( -0.812 * g ) * pow( u, 2.5 ) / ( 1.0 + 0.033 * pow( u, 2.5 ) ) );
679
680 r_e = pow( f_n / 28.843, 12 );
681 q_e = 0.016 + pow( 0.0514 * e_r * Q_21, 4.524 );
682 p_e = 4.766 * exp( -3.228 * pow( u, 0.641 ) );
683 d_e = 5.086 * q_e * ( r_e / ( 0.3838 + 0.386 * q_e ) ) * ( exp( -22.2 * pow( u, 1.92 ) ) / ( 1.0 + 1.2992 * r_e ) )
684 * ( pow( e_r - 1.0, 6.0 ) / ( 1.0 + 10 * pow( e_r - 1.0, 6.0 ) ) );
685 C_e = 1.0 + 1.275 * ( 1.0 - exp( -0.004625 * p_e * pow( e_r, 1.674 ) * pow( f_n / 18.365, 2.745 ) ) ) - Q_12 + Q_16
686 - Q_17 + Q_18 + Q_20;
687
688
689 R_1 = 0.03891 * pow( e_r, 1.4 );
690 R_2 = 0.267 * pow( u, 7.0 );
691 R_7 = 1.206 - 0.3144 * exp( -R_1 ) * ( 1.0 - exp( -R_2 ) );
692 R_10 = 0.00044 * pow( e_r, 2.136 ) + 0.0184;
693 tmpf = pow( f_n / 19.47, 6.0 );
694 R_11 = tmpf / ( 1.0 + 0.0962 * tmpf );
695 R_12 = 1.0 / ( 1.0 + 0.00245 * u * u );
696 R_15 = 0.707 * R_10 * pow( f_n / 12.3, 1.097 );
697 R_16 = 1.0 + 0.0503 * e_r * e_r * R_11 * ( 1.0 - exp( -pow( u / 15.0, 6.0 ) ) );
698 Q_0 = R_7 * ( 1.0 - 1.1241 * ( R_12 / R_16 ) * exp( -0.026 * pow( f_n, 1.15656 ) - R_15 ) );
699
700 /* even-mode frequency-dependent characteristic impedances */
701 SetParameter( TCP::Z0_E, Z0_e_0 * pow( 0.9408 * pow( e_r_eff_single_f, C_e ) - 0.9603, Q_0 )
702 / pow( ( 0.9408 - d_e ) * pow( e_r_eff_single_0, C_e ) - 0.9603, Q_0 ) );
703
704 Q_29 = 15.16 / ( 1.0 + 0.196 * pow( e_r - 1.0, 2.0 ) );
705 tmpf = pow( e_r - 1.0, 3.0 );
706 Q_28 = 0.149 * tmpf / ( 94.5 + 0.038 * tmpf );
707 tmpf = pow( e_r - 1.0, 1.5 );
708 Q_27 = 0.4 * pow( g, 0.84 ) * ( 1.0 + 2.5 * tmpf / ( 5.0 + tmpf ) );
709 tmpf = pow( ( e_r - 1.0 ) / 13.0, 12.0 );
710 Q_26 = 30.0 - 22.2 * ( tmpf / ( 1.0 + 3.0 * tmpf ) ) - Q_29;
711 tmpf = ( e_r - 1.0 ) * ( e_r - 1.0 );
712 Q_25 = ( 0.3 * f_n * f_n / ( 10.0 + f_n * f_n ) ) * ( 1.0 + 2.333 * tmpf / ( 5.0 + tmpf ) );
713 Q_24 = 2.506 * Q_28 * pow( u, 0.894 ) * pow( ( 1.0 + 1.3 * u ) * f_n / 99.25, 4.29 ) / ( 3.575 + pow( u, 0.894 ) );
714 Q_23 = 1.0 + 0.005 * f_n * Q_27 / ( ( 1.0 + 0.812 * pow( f_n / 15.0, 1.9 ) ) * ( 1.0 + 0.025 * u * u ) );
715 Q_22 = 0.925 * pow( f_n / Q_26, 1.536 ) / ( 1.0 + 0.3 * pow( f_n / 30.0, 1.536 ) );
716
717 /* odd-mode frequency-dependent characteristic impedances */
718 SetParameter( TCP::Z0_O, Z0_single_f
719 + ( Z0_o_0 * pow( e_r_eff_o_f / e_r_eff_o_0, Q_22 ) - Z0_single_f * Q_23 )
720 / ( 1.0 + Q_24 + pow( 0.46 * g, 2.2 ) * Q_25 ) );
721}
722
723
724void COUPLED_MICROSTRIP::syn_err_fun( double* f1, double* f2, double s_h, double w_h, double e_r, double w_h_se,
725 double w_h_so )
726{
727 double g, he;
728
729 g = cosh( 0.5 * M_PI * s_h );
730 he = cosh( M_PI * w_h + 0.5 * M_PI * s_h );
731
732 *f1 = ( 2.0 / M_PI ) * acosh( ( 2.0 * he - g + 1.0 ) / ( g + 1.0 ) );
733 *f2 = ( 2.0 / M_PI ) * acosh( ( 2.0 * he - g - 1.0 ) / ( g - 1.0 ) );
734
735 if( e_r <= 6.0 )
736 *f2 += ( 4.0 / ( M_PI * ( 1.0 + e_r / 2.0 ) ) ) * acosh( 1.0 + 2.0 * w_h / s_h );
737 else
738 *f2 += ( 1.0 / M_PI ) * acosh( 1.0 + 2.0 * w_h / s_h );
739
740 *f1 -= w_h_se;
741 *f2 -= w_h_so;
742}
743
744
746{
747 double Z0, e_r;
748 double w_h_se, w_h_so, w_h, a, ce, co, s_h;
749 double f1, f2, ft1, ft2, j11, j12, j21, j22, d_s_h, d_w_h, err;
750 double eps = 1e-04;
751
752 f1 = f2 = 0;
753 e_r = GetParameter( TCP::EPSILONR );
754
755 Z0 = GetParameter( TCP::Z0_E ) / 2.0;
756 /* Wheeler formula for single microstrip synthesis */
757 a = exp( Z0 * sqrt( e_r + 1.0 ) / 42.4 ) - 1.0;
758 w_h_se = 8.0 * sqrt( a * ( ( 7.0 + 4.0 / e_r ) / 11.0 ) + ( ( 1.0 + 1.0 / e_r ) / 0.81 ) ) / a;
759
760 Z0 = GetParameter( TCP::Z0_O ) / 2.0;
761 /* Wheeler formula for single microstrip synthesis */
762 a = exp( Z0 * sqrt( e_r + 1.0 ) / 42.4 ) - 1.0;
763 w_h_so = 8.0 * sqrt( a * ( ( 7.0 + 4.0 / e_r ) / 11.0 ) + ( ( 1.0 + 1.0 / e_r ) / 0.81 ) ) / a;
764
765 ce = cosh( 0.5 * M_PI * w_h_se );
766 co = cosh( 0.5 * M_PI * w_h_so );
767 /* first guess at m_parameters[PHYS_S )/h */
768 s_h = ( 2.0 / M_PI ) * acosh( ( ce + co - 2.0 ) / ( co - ce ) );
769 /* first guess at w/h */
770 w_h = acosh( ( ce * co - 1.0 ) / ( co - ce ) ) / M_PI - s_h / 2.0;
771
772 SetParameter( TCP::PHYS_S, s_h * GetParameter( TCP::H ) );
773 SetParameter( TCP::PHYS_WIDTH, w_h * GetParameter( TCP::H ) );
774
775 syn_err_fun( &f1, &f2, s_h, w_h, e_r, w_h_se, w_h_so );
776
777 /* rather crude Newton-Rhapson; we need this because the estimate of */
778 /* w_h is often quite far from the true value (see Akhtarzad S. et al.) */
779 do
780 {
781 /* compute Jacobian */
782 syn_err_fun( &ft1, &ft2, s_h + eps, w_h, e_r, w_h_se, w_h_so );
783 j11 = ( ft1 - f1 ) / eps;
784 j21 = ( ft2 - f2 ) / eps;
785 syn_err_fun( &ft1, &ft2, s_h, w_h + eps, e_r, w_h_se, w_h_so );
786 j12 = ( ft1 - f1 ) / eps;
787 j22 = ( ft2 - f2 ) / eps;
788
789 /* compute next step */
790 d_s_h = ( -f1 * j22 + f2 * j12 ) / ( j11 * j22 - j21 * j12 );
791 d_w_h = ( -f2 * j11 + f1 * j21 ) / ( j11 * j22 - j21 * j12 );
792
793 //g_print("j11 = %e\tj12 = %e\tj21 = %e\tj22 = %e\n", j11, j12, j21, j22);
794 //g_print("det = %e\n", j11*j22 - j21*j22);
795 //g_print("d_s_h = %e\td_w_h = %e\n", d_s_h, d_w_h);
796
797 s_h += d_s_h;
798 w_h += d_w_h;
799
800 /* check the error */
801 syn_err_fun( &f1, &f2, s_h, w_h, e_r, w_h_se, w_h_so );
802
803 err = sqrt( f1 * f1 + f2 * f2 );
804 /* converged ? */
805 } while( err > 1e-04 );
806
807
808 SetParameter( TCP::PHYS_S, s_h * GetParameter( TCP::H ) );
809 SetParameter( TCP::PHYS_WIDTH, w_h * GetParameter( TCP::H ) );
810}
811
812
813void COUPLED_MICROSTRIP::syn_fun( double* f1, double* f2, double s_h, double w_h, double Z0_e, double Z0_o )
814{
815 SetParameter( TCP::PHYS_S, s_h * GetParameter( TCP::H ) );
816 SetParameter( TCP::PHYS_WIDTH, w_h * GetParameter( TCP::H ) );
817
818 /* compute coupled microstrip parameters */
819 Analyse();
820
821 *f1 = GetParameter( TCP::Z0_E ) - Z0_e;
822 *f2 = GetParameter( TCP::Z0_O ) - Z0_o;
823}
void Z0_dispersion()
Calculate frequency dependency of characteristic impedances.
void delta_u_thickness()
Compute the thickness effect on normalized width for coupled microstrips.
void er_eff_static()
Compute the static effective dielectric constants.
void diff_impedance()
Calculate the differential impedance of the coupled microstrips.
double delta_u_thickness_single(double, double)
Computes the thickness effect on normalized width for a single microstrip line.
MICROSTRIP m_aux_microstrip
Runs intermediate single-track calculations.
void line_angle()
Compute electrical length in radians.
void synth_width()
Calculate widths given Z0 and e_r.
void syn_err_fun(double *, double *, double, double, double, double, double)
Error function to minimise when synthesising trace geometry.
void attenuation()
Compute attenuation.
double filling_factor_even(double, double, double)
Compute the filling factor for the coupled microstrip even mode without cover and zero conductor thic...
double delta_Z0_odd_cover(double, double, double)
Compute the odd mode impedance correction for a homogeneous microstrip due to the cover.
void compute_single_line()
Computes initial parameters for a single microstrip.
void SetAnalysisResults() override
Sets the output values and status following analysis.
void er_eff_freq()
Compute er_eff as a function of frequency.
void conductor_losses()
Compute conductor losses per unit length.
void Analyse() override
Analyse track geometry parameters to output Z0 and Ang_L.
void SetSynthesisResults() override
Sets the output values and status following synthesis.
void syn_fun(double *, double *, double, double, double, double)
double delta_q_cover_even(double)
Compute the cover effect on filling factor for the even mode.
double delta_q_cover_odd(double)
Compute the cover effect on filling factor for the odd mode.
bool Synthesize(SYNTHESIZE_OPTS aOpts) override
Synthesis track geometry parameters to match given Z0.
double filling_factor_odd(double, double, double)
Compute the filling factor for the coupled microstrip odd mode without cover and zero conductor thick...
void Z0_even_odd()
Compute the static even- and odd-mode static impedances.
void dielectric_losses()
Compute dielectric losses per unit length.
double delta_Z0_even_cover(double, double, double)
Compute the even mode impedance correction for a homogeneous microstrip due to the cover.
void microstrip_Z0()
Calculates the microstrip static impedance.
double Z0_0
static characteristic impedance
void dispersion()
Calculates frequency dependent parameters of the microstrip.
static double delta_q_thickness(double, double)
Calculates the thickness effect on filling factor.
double er_eff_0
Static effective dielectric constant.
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.
bool MinimiseZ0Error1D(TRANSLINE_PARAMETERS aOptimise, TRANSLINE_PARAMETERS aMeasure)
minimizeZ0Error1D
double SkinDepth() const
Calculate skin depth.
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.
double atanh(double x)
double acosh(double x)
#define F(x, y, z)
Definition: md5_hash.cpp:15
#define G(x, y, z)
Definition: md5_hash.cpp:16
#define D(x)
Definition: ptree.cpp:41
VECTOR2I v4(1, 1)
VECTOR2I v3(-2, 1)
int delta
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.