⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stamp.m

📁 EDA程序: 将spice网表转化为用于计算电路各种参数所需要的相应稀疏矩阵。
💻 M
📖 第 1 页 / 共 2 页
字号:
            rem=upper(rem);
           [n,m]=size(rem);
           n=0;
                  for n=1:m
                       if rem(n)=='V'
                            data={rem(n+2:m-1)};
                            break;
                       elseif rem(n)=='I'
                            data={rem(n),rem(n+2:m-1)};
                           break;
                       end
                  end
             data=cell2mat(data);
             renum=findpt(data,matpt);
             LT(pronum,sizeall)=0;
                  if renum~=0
                      LT(pronum,renum)=1;
                     Y(pronum).name=rem; 
                  end      
           line=line+1;
    elseif strcmp(words,'.END')                                                  %文件结束
            line=line+1;
    else
      stra=words(1);                                                             %元件分类讨论 : R L C K V I 
           
      if stra=='R'
      %%        'R':
      %%              G (1/r -1/r ;  i      X=(vi
      %%                 -1/r 1/r ) j         vj)
             ori_size=sizeall;                                                   %储存原始矩阵大小
      
             [num1,num2,datac,sizeall,matpt,rem] = duandian(rem,matpt,sizeall,1)  %寻找元件节点,如果不存在,则添加节点到矩阵X
             datac=str2num(datac); 
                    if sizeall>ori_size                                           % 判定新的大小,重新定义矩阵
                        matall.G(sizeall,sizeall)=0;
                         matall.B(sizeall,1)=0;
                         matall.C(sizeall,sizeall)=0;
                           select(sizeall)=0;
                    end
             [matall] = SEL(1,matall,num1,num2,datac)                         %根据元件类型,更改矩阵数值
             
                line=line+1;
      elseif stra=='L'
            ori_size=sizeall;
             [num1,num2,datac,sizeall,matpt,rem] = duandian(rem,matpt,sizeall,1)   
              datac=str2num(datac);                                              %L元件特殊, 需要判断新增节点 电感电流:Il  
               words={'I',words};
               words=cell2mat(words);
               renum=findpt(words,matpt);                                         
                     if renum==0
                        sizeall=sizeall+1;
                         num3=sizeall;
                          matpt(sizeall).X=words;
                     else
                         num3=0;
                         
                      end
                          if sizeall>ori_size
                               matall.C(sizeall,sizeall)=0;
                              matall.G(sizeall,sizeall)=0;
                              matall.B(sizeall,1)=0;
                               select(sizeall)=0;

                          end
             [matall] = VL(2,matall,num1,num2,num3,datac);
              %%        'L':  c(0 0 0  I   G=(0 0 1    X=(vi
              %%                0 0 0  J      0 0 -1      vj
              %%                0 0 L)  K     -1 1 0)     Il)
            
                 line=line+1;
      elseif stra=='K'                                                              %元件K 判断所属两个电感L的电流是否已经在矩阵中存在
                  %%        'M':  C(0 -m  i    X(Il1
                %                   -m 0)  j     Il2)
           ori_size=sizeall;
           [num1,num2,datac,sizeall,matpt,rem] = duandian(rem,matpt,sizeall,0)
               datac=str2num(datac);
                     if sizeall>ori_size
                         matall.G(sizeall,sizeall)=0;
                          matall.B(sizeall,1)=0;
                          matall.C(sizeall,sizeall)=0;
                           select(sizeall)=0;

                     end 
             [matall] = SEL(2,matall,num1,num2,datac)       
             line=line+1;
      elseif stra=='V'
                %%       'V':   G(0 0 -1       B=(0       X(vi
      %%                          0 0 1           0         vj
      %%                          1 -1 0)         Evs)      Ivs)
                   [num1,num2,datac,sizeall,matpt,rem] = duandian(rem,matpt,sizeall,1)  % 电源V元件,需要添加Iv 节点
                  datatest=str2num(datac);
                            if isempty(datatest)
                            datac=strtok(rem);
                              datac=str2num(datac);
                            else
                                datac=str2num(datac);  
                            end
                        sizeall=sizeall+1;
                       num3=sizeall;
                       select(sizeall)=1;
                       matpt(sizeall).X={'I',words};
                       matpt(sizeall).X=cell2mat(matpt(sizeall).X);
                       
                      matall.C(sizeall,sizeall)=0;
                       matall.G(sizeall,sizeall)=0;
                       matall.B(sizeall,1)=0;
                             
                [matall] = VL(1,matall,num1,num2,num3,datac);
                    
                 line=line+1;
      elseif stra=='I'
                   %%        'I'    B=(-Ics      X=(Vi
                   %%                   Ics)        Vj)
                ori_size=sizeall;
               [num1,num2,datac,sizeall,matpt,rem] = duandian(rem,matpt,sizeall,1);     % I元件只需判断节点电压是否已存在,Vi Vj
               datac=str2num(datac);
                     if sizeall>ori_size
                             matall.G(sizeall,sizeall)=0;
                              matall.B(sizeall,1)=0;
                              matall.C(sizeall,sizeall)=0;
                               select(sizeall)=0;

                     end
             
               [matall] = SEL(4,matall,num1,num2,datac)       
               line=line+1;
      elseif stra=='C'                                                               
                  %%        'C':  C(C -c   i     X(vi
                  %%                -c c)  j       vj);
                  %%                                                                      % C元件只需判断节点电压是否已存在,Vi Vj
             ori_size=sizeall;
             [num1,num2,datac,sizeall,matpt,rem] = duandian(rem,matpt,sizeall,1);
             [n,m]=size(datac);
                  if datac(m)=='P'
                     datac=str2num(datac(1:m-1))*1e-12;
                  else
                      datac=str2num(datac);
                  end
          
                       if sizeall>ori_size
                          matall.G(sizeall,sizeall)=0;
                           matall.B(sizeall,1)=0;
                           matall.C(sizeall,sizeall)=0;
                       end
             [matall] = SEL(3,matall,num1,num2,datac)       
             line=line+1;
      elseif stra=='X'                                                               %X元件-子电路,因此先储存到part.pt 以及part.name
              ptnum=0;
              ori_size=sizeall;
              remtest='test';
              sizepart=sizepart+1;                                                    %子电路的总数目
              part(sizepart).ptname=words;
              while (isempty(remtest)==0)                                               %读入一个子电路的所有节点
                    ptnum=ptnum+1;
                    [data,rem]=strtok(rem);
                    data=upper(data);
                    renum=findpt(data,matpt);
                    
                         if (renum==0) &(data~='0') 
                              sizeall=sizeall+1;
                              part(sizepart).pt(ptnum)= sizeall; 
                                matpt(sizeall).X=data;  
                         else
                              part(sizepart).pt(ptnum)= renum; 
                        end
               remtest=rem;
               [data,remtest]=strtok(remtest);
                   
              end                                                                    %ptnum 子电路节点数
             datac=upper(strtok(rem));                                               
             part(sizepart).name=datac;
             part(sizepart).num=ptnum;         
                     if sizeall>ori_size
                         matall.G(sizeall,sizeall)=0;
                      matall.B(sizeall,1)=0;
                      matall.C(sizeall,sizeall)=0;
                     end                                                              %将子电路节点先加入总矩阵
            
             line=line+1;
      else
           disp('no data')
            line=line+1;
      
       

     end
    
   end
end


for i=1:sizeall
   if (select(i)>0) 
       if(isempty(U)==0)
        U={U,matpt(i).X};
      else
       U=matpt(i).X;
       end
   end
end
save BCG.mat -struct matall;
save LT.mat  LT;
save U.mat   U;
save X.mat matpt;
save Y.mat  Y;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -