找回密码
 注册
关于网站域名变更的通知
查看: 917|回复: 1
打印 上一主题 下一主题

怎么破解PSPICE里面器件模型,例如传输线模型,有高手支招吗?

[复制链接]
  • TA的每日心情
    开心
    2021-7-15 15:16
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    跳转到指定楼层
    1#
    发表于 2021-7-8 09:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    这个是理想传输线的Pspice等效电路,但是我看NGSPICE里面的理想传输线模型不是节点矩阵法实现的,下面是传输线源程序
    4 B3 p0 b' Y, o- Z7 t#include "cktdefs.h"# q) G5 d/ [5 \$ B
    #include "tradefs.h"
      S& N/ ~5 e3 L#include "sperror.h"
    6 Z* y- @4 _: p  p7 \1 k& N: Q* V#include "suffix.h"
    ( h- `; I5 c8 U* {: J6 ]5 n, b2 I9 ?- \

      z& J; d; m) W" h& h- x$ Lint* j$ c: I% w' \# D' L
    TRAaccept(ckt,inModel)4 p( I+ ]' ^. F! w+ i: y
        register CKTcircuit *ckt;5 f( E+ F3 l6 Z' S) N5 ^
        GENmodel *inModel;
    # H. j9 c4 a. R5 v8 B$ z{4 t  F: d, x4 l. y
        register TRAmodel *model = (TRAmodel *)inModel;5 O( g- w5 J* C- X2 e; c
        register TRAinstance *here;% D3 c4 S2 u+ B4 C; Y
        register int i=0,j;
    5 ]$ Q& M6 B, {8 ?4 Z    double v1,v2,v3,v4;
    / S6 A5 d* G2 S; k3 X3 S    double v5,v6,d1,d2,d3,d4;
      Q  _" N- |9 U1 Z2 ~    double *from,*to;
    8 b( u5 |9 k4 p/ o  w+ X    int error;
    % d7 E( e2 {) ]8 ^, h6 I7 s( U* `: i; L7 q! \
    9 f/ K7 w! s: g8 @7 O# |
        /*  loop through all the transmission line models */
    / ]& r9 K1 G- T8 Q/ ]    for( ; model != NULL; model = model->TRAnextModel ) {" H( w1 k( _, j& Y: P

    / l( g# ^" [" G        /* loop through all the instances of the model */% j& {# P2 q: w+ t6 M: M# j/ R5 j, g
            for (here = model->TRAinstances; here != NULL ;
    " y7 g6 }) S$ V4 h& w3 e( O                here=here->TRAnextInstance) {
    3 M, \8 j: K- f. }            if( (ckt->CKTtime - here->TRAtd) > *(here->TRAdelays+6)) {
    8 [$ F7 g# e3 m' N$ z' e                /* shift! */
    ! ]8 U" O5 c* a, u( p                for(i=2;i<here->TRAsizeDelay && ! j% o% q$ M! g# e+ y& Q" c4 Z* z. J
                        (ckt->CKTtime - here->TRAtd > *(here->TRAdelays+3*i));i++)' h) Z! Q8 A2 K+ ?2 A3 W0 T# l& R5 S
                            { /* loop does it all */ ; }2 v& E! F. {! ~; C3 B9 E
                    i -= 2;
    6 E, `$ U5 }) i; U5 g                for(j=i;j<=here->TRAsizeDelay;j++) {
    4 T2 N4 {+ o7 V* u! i/ }                    from = here->TRAdelays + 3*j;8 K4 ?* R& {6 O; q4 f# a$ r
                        to = here->TRAdelays + 3*(j-i);
    ) h. G8 j0 C5 w  x                    *(to) = *(from);
    % R, ?: Y: ~$ b) S4 G4 W/ ~7 ], \                    *(to+1) = *(from+1);
    # }. p0 r1 ?$ C# h- o: y                    *(to+2) = *(from+2);
    1 x) M; J" C' W( b! Y                }
    & {9 t$ S+ ?3 y$ k                here->TRAsizeDelay -= i;
    7 p; D5 {5 e, u+ T5 \, v6 k            }. B9 u# j% J- k& Q/ n, E
                if(ckt->CKTtime - *(here->TRAdelays+3*here->TRAsizeDelay) >
    2 K& H. p7 a& V* f: b                    ckt->CKTminBreak) {
    + k3 q* A3 Q8 ?3 c! t  S                if(here->TRAallocDelay <= here->TRAsizeDelay) {1 L0 L6 A' ]1 k2 N) Q* o
                        /* need to grab some more space */% r$ _* l; Z6 Z% l2 C
                        here->TRAallocDelay += 5;& B2 f# I' V; Z3 y( _1 {7 ?
                        here->TRAdelays = (double *)REALLOC((char *)here->TRAdelays,
    5 w7 O& h8 c% R8 ~/ ~3 [+ S- I                        (here->TRAallocDelay+1)*3*sizeof(double));
    ; Y" M" D: y# ^) D, a1 [) g                }+ w  e: I  P7 y1 u% b
                    here->TRAsizeDelay ++;
    1 D# P- N7 Z) ~+ R9 ?. c8 y& E! z8 r                to = (here->TRAdelays  +3*here->TRAsizeDelay);( w# ~( U% G" j/ q  V( N
                    *to = ckt->CKTtime;
    * m* k& n4 d0 ]' G( v                to = (here->TRAdelays+1+3*here->TRAsizeDelay);0 O  q* p" P/ J/ y* X6 D7 p" _
                    *to = ( *(ckt->CKTrhsOld + here->TRAposNode2)' P% e* r0 T; w$ g& s
                         -*(ckt->CKTrhsOld + here->TRAnegNode2))
    ) L, a8 o' {2 ?+ H/ h                    + *(ckt->CKTrhsOld + here->TRAbrEq2)*2 _+ f& V. `& n; T8 _, ~, q
                            here->TRAimped;' {( O3 t9 J" ~9 ~
                    *(here->TRAdelays+2+3*here->TRAsizeDelay) =
    8 b9 F) ^$ E  J) \! ?$ v: z2 b5 j* L                    ( *(ckt->CKTrhsOld + here->TRAposNode1)2 ]- S4 Z. j  u% g- ^3 s. H; F6 z
                         -*(ckt->CKTrhsOld + here->TRAnegNode1))
    3 Z7 R* C5 \, V                    + *(ckt->CKTrhsOld + here->TRAbrEq1)** `9 V2 F' s; D- Q. Z+ z  L
                            here->TRAimped;
    ( L6 v  i. `" P, q$ H$ f#ifdef NOTDEF4 n4 I7 Y6 D! ?' \) W: M
                    v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);
    ) c/ {) T, e/ P2 {, b                v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));
    ; g4 l5 M8 W% U' S) u; z                v3 = *(here->TRAdelays+2+3*here->TRAsizeDelay);
    : S; \! Q# ?/ P/ I% N0 l                v4 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));+ Y5 I0 k1 ^. K) p, ?
                    if( (FABS(v1-v2) >= 50*ckt->CKTreltol*. Q7 Y0 x& L! G2 l. J# H
                            MAX(FABS(v1),FABS(v2))+50*ckt->CKTvoltTol) ||4 F  [# S! ?3 z, d2 D
                        (FABS(v3-v4) >= 50*ckt->CKTreltol*8 y* p. _; Q+ i' _! c
                            MAX(FABS(v3),FABS(v4))+50*ckt->CKTvoltTol)  ) {$ y: V7 D: t0 E0 y8 A% }
                        /* changing - need to schedule after delay */. H8 ^. H/ z$ z! G2 `2 B- N+ P
                        /*printf("%s:  at %g set for %g and %g\n",here->TRAname,
    : U- B2 Z  C6 z; `) _* p* V1 y                        ckt->CKTtime,$ N' x) i3 R6 |" }; y
                            ckt->CKTtime+here->TRAtd,1 G7 }! {. Y) _, a3 F3 @6 K6 \& w
                            *(here->TRAdelays+3*here->TRAsizeDelay-3)+
    : L, K+ t4 f# D- V% H                                here->TRAtd);*// f: x& ]9 q: Y% S
                        error = CKTsetBreak(ckt,ckt->CKTtime+here->TRAtd);7 {5 Q& C8 t% c/ A4 h+ j
                        if(error) return(error);/ x# V. n: f# x
                        /* also set for break after PREVIOUS point */9 {0 c2 O$ h4 C4 s  t8 c
                        error = CKTsetBreak(ckt,( A9 L) J, q: x; ]" a2 W  H
                                *(here->TRAdelays+3*here->TRAsizeDelay -3) +, \) L0 @1 ^! h! G2 v% Q( {* L
                                here->TRAtd);. ?- o. C1 Z% M" u
                        CKTbreakDump(ckt);
    - N9 |) \* B) _9 E/ K                    if(error) return(error);
    8 v9 m$ X) b' |0 R                }
    9 m4 Q0 S. O$ n" @2 w#else
    - q9 g0 `" g( n- z6 g5 ^, c                v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);0 v' G" q$ X: {+ X2 A
                    v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));* p0 a  G$ d5 Y* x
                    v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-2));
    3 V* K5 g& ]# l5 P$ A0 h7 h* ^4 B2 }                v4 = *(here->TRAdelays+2+3*here->TRAsizeDelay);0 n* _, Q1 Y( Z: r/ w( |
                    v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));: o/ k; j; \4 ?
                    v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-2));( i8 O0 _% @! b& L  W7 M' |" B/ o
                    d1 = (v1-v2)/ckt->CKTdeltaOld[0];3 {# g. g% i( M2 v& I% v
                    d2 = (v2-v3)/ckt->CKTdeltaOld[1];# m% M3 y9 F7 q& t& ?
                    d3 = (v4-v5)/ckt->CKTdeltaOld[0];: a- A$ w6 }7 w. H
                    d4 = (v5-v6)/ckt->CKTdeltaOld[1];4 U5 c& I2 F. d8 k. X8 f
                    /*printf("%s: at %g derivs are %g, %g and %g, %g\n",
    : W0 Z! k, G2 ]                        here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/, {# C; ^" z3 Q/ V
                    if( (FABS(d1-d2) >= here->TRAreltol*MAX(FABS(d1),FABS(d2))+4 d+ ]9 |4 r; _# i
                            here->TRAabstol) ||
      }6 E+ ^$ E  R9 N% B                        (FABS(d3-d4) >= here->TRAreltol*MAX(FABS(d3),FABS(d4))+/ s! ]  p: F7 d1 e( T; ^
                            here->TRAabstol) ) {
    , {; `6 h/ T& j/ h! D                    /* derivitive changing - need to schedule after delay */
    7 S1 Z; s) M/ ?! Y8 J                    /*printf("%s:  at %g set for %g\n",here->TRAname,. t: M' @% }$ B5 r# }9 T
                            ckt->CKTtime,- u* }) h: `+ y! y
                            *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd& |4 Y/ A. D# r# k
                            );*/
    % w; G9 T* t4 Z0 m                    /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/! b5 s: w3 ?  P5 \% M
                        /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/
    ! W: z* W" G* a" T7 x) v                    /* also set for break after PREVIOUS point */- F  d, i- W4 C  k
                        /*printf("setting break\n");*/# u! x. ~# n# q3 A) H. m( j4 G
                        error = CKTsetBreak(ckt,/ Q+ a, a$ b+ W9 {. t* _' P& ^
                                *(here->TRAdelays+3*here->TRAsizeDelay -3) +
    9 U+ ?) o; `8 \9 M" M+ c" h                            here->TRAtd);
    & {! s) b4 y# b, G2 x                    if(error) return(error);
    * ^. ]  @! p0 d9 C% a6 k                }
    # k: o3 G; K% P0 I  ^4 b) I+ c#endif /*NOTDEF*/7 }4 n$ Z1 T+ E9 t
                }5 u/ R3 U9 K$ W
            }
    . f& R9 ^& r' f. Q    }0 X) U# f/ v. X& F$ \) ~% c
        return(OK);: U# D1 j$ L& h& o# L8 U( B3 B
    }% Q% M4 r  S- l( F: o
    . f' y- Z% J5 l; w2 ]+ @$ }& `* ?
    4 P, D1 v, @" R) p7 E: x

    20210707150337.png (131.8 KB, 下载次数: 1)

    20210707150337.png

    该用户从未签到

    2#
    发表于 2021-7-8 14:10 | 只看该作者
    我也想知道,看看别人怎么说' r) P# W9 @4 T' |" |2 T
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-21 13:38 , Processed in 0.078125 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表