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

📄 stamp.m

📁 EDA程序: 将spice网表转化为用于计算电路各种参数所需要的相应稀疏矩阵。
💻 M
📖 第 1 页 / 共 2 页
字号:
clear all;
close all;
file =textread('Tree_l7.sp','%s','delimiter','\n','whitespace','')  
     [N,M]=size(file);                             %文件长度
     sizeall=0;                                    % 总矩阵大小
     line=1;                                       % 读入的文件行数
     matpt(1).X=' ';                               %总矩阵的X
     select(1)=0;                                 %总矩阵节点是否属于电压源
     matall.G=sparse(1,1);                         % 总矩阵的G C B 
     matall.C=sparse(1,1);
     matall.B=sparse(1,1);
     U='';
     LT(1,1)=0;                                   %矩阵LT
     Y(1).name='';                                %矩阵Y
     partpt(1).X=' ';                        %子电路的X
     partse(1)=0;
     sizepart=0;                                   %子电路数目
     part(1).name=0;                              %子电路 名称,
     part(1).num=0;                               %子电路节点数  
     part(1).pt(1)=0;                             %子电路节点在总电路矩阵中的位置
     partmat.G=sparse(1,1);                       %子电路的G C B 矩阵
     partmat.C=sparse(1,1);
     partmat.B=sparse(1,1);
     partnum=0;                                   
     pronum=0;                                    %probe的变量数目
     renum=0;                                     
while (line<=N)  

   [words,rem]=strtok(file{line});
   words=upper(words);
                                                 % 各种输入情况   分类   empty   *  .subckt  R L K C V I X .probe  .end
          if ((isempty(words))==1)
               line=line+1;
               disp('empty');
          elseif strcmp(words,'*')
               line=line+1;
          elseif strcmp(words,'.SUBCKT')                   % 处理子电路   deal with subckt
               ptnum=0;
               [partname,rem]=strtok(rem);
               partname=upper(partname);
               [n,m]=size(partpt);                         %节点数及节点名称
                  for i=1:m
                     partpt(i).X=' ';
                     partse(i)=0;
                  end
             
                   while (isempty(rem)==0)
                          [data,rem]=strtok(rem);
                          data=upper(data);
                          ptnum=ptnum+1;
                          partpt(ptnum).X=data;
                   
                    end
               partnum=ptnum;          
      
              
        while 1                                                          %分情况讨论R L C K V I
                 line=line+1;
                 [words,rem]=strtok(file{line});
                 words=upper(words);
                 ori_partnum=partnum;
          if strcmp(words,'.ENDS')==1
              
             break;
          elseif isempty(words)
            disp('empty');         
          elseif strcmp(words(1),'R')
              [num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
                  if partnum>ori_partnum;      
                       partmat.C(partnum,partnum)=0;
                       partmat.G(partnum,partnum)=0;
                       partmat.B(partnum,1)=0;
                        partse(partnum)=0;
                   end  
              datac=str2num(datac);   
              [partmat] = SEL(1,partmat,num1,num2,datac)
         
         elseif strcmp(words(1),'V')
            [num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
                if isnumeric(datac)
                    datac=str2num(datac);
                else
                   datac=strtok(rem);
                   datac=str2num(datac);
          
                end
                partnum=partnum+1;
                num3=partnum;
                partse(partnum)=1;
                      partpt(partnum).X={'I',words};
                      partpt(partnum).X=cell2mat(partpt(partnum).X);
                      
                         partmat.C(partnum,partnum)=0;
                         partmat.G(partnum,partnum)=0;
                         partmat.B(partnum,1)=0;
       
               [partmat] = VL(1,partmat,num1,num2,num3,datac);
          elseif strcmp(words(1),'L')
          
               [num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
                 datac=str2num(datac);
                 words={'I',words};
                 words=cell2mat(words);
                 renum=findpt(words,partpt);
                     if renum==0
                        partnum=partnum+1;
                        num3=partnum;
                        partpt(partnum).X=words;
                     else
                        num3=0;
                     end
                if partnum>ori_partnum   
                   partmat.C(partnum,partnum)=0;
                    partmat.G(partnum,partnum)=0;
                    partmat.B(partnum,1)=0;
                     partse(partnum)=0;
               end 
               [partmat] = VL(2,partmat,num1,num2,num3,datac);
          elseif strcmp(words(1),'C')
               [num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
              datac=str2num(datac);
                    if partnum>ori_partnum;      
                             partmat.C(partnum,partnum)=0;
                             partmat.G(partnum,partnum)=0;
                             partmat.B(partnum,1)=0;
                              partse(partnum)=0;
                    end
               [partmat] = SEL(3,partmat,num1,num2,datac);       
          elseif strcmp(words(1),'K')
                [num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,0);
                   if partnum>ori_partnum;      
                         partmat.C(partnum,partnum)=0;
                         partmat.G(partnum,partnum)=0;
                         partmat.B(partnum,1)=0;
                          partse(partnum)=0;
                   end
                datac=str2num(datac);
                [partmat] = SEL(2,partmat,num1,num2,datac);    
          elseif strcmp(words(1),'I')
                   [num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
                        if partnum>ori_partnum;      
                                 partmat.C(partnum,partnum)=0;
                                 partmat.G(partnum,partnum)=0;
                                 partmat.B(partnum,1)=0;
                                  partse(partnum)=0;
                        end
                  datac=str2num(datac);
                 [partmat] = SEL(4,partmat,num1,num2,datac); 
          end
        end
            
                                                         %读完所有元件,将前面出现过的子电路X1 X2 等,依次将子电路矩阵加入到总矩阵里
           
           ll=ptnum+1;
                    
           for i=1:sizepart
              if strcmp(partname,part(i).name)
                  ori_sizeall=sizeall;
                    sizeall=sizeall+(partnum-ptnum);
                      if sizeall>ori_sizeall
                        matall.G(sizeall,sizeall)=0;
                        matall.C(sizeall,sizeall)=0;
                        matall.B(sizeall,1)=0;
                       select(sizeall)=0;
                      end
                   
                        for kk=1:ptnum
                            for jj=1:ptnum;
                              matall.G(part(i).pt(kk),part(i).pt(jj))=matall.G(part(i).pt(kk),part(i).pt(jj))+partmat.G(kk,jj);
                              matall.C(part(i).pt(kk),part(i).pt(jj))=matall.C(part(i).pt(kk),part(i).pt(jj))+partmat.C(kk,jj);
                            end
                        end
                        for kk=1:ptnum
                             matall.B(part(i).pt(kk),1)=matall.B(part(i).pt(kk),1)+partmat.B(kk,1);
                         end
                        
                      for tt=1:ptnum
                        for num=ll:partnum
                                  matall.G(part(i).pt(tt),ori_sizeall+num-ptnum)=matall.G(part(i).pt(tt),ori_sizeall+num-ptnum)+partmat.G(tt,num);
                                 matall.G(ori_sizeall+num-ptnum,part(i).pt(tt))=matall.G(ori_sizeall+num-ptnum,part(i).pt(tt))+partmat.G(num,tt);
                                  matall.C(part(i).pt(tt),ori_sizeall+num-ptnum)=matall.C(part(i).pt(tt),ori_sizeall+num-ptnum)+partmat.C(tt,num);
                                 matall.C(ori_sizeall+num-ptnum,part(i).pt(tt))=matall.C(ori_sizeall+num-ptnum,part(i).pt(tt))+partmat.C(num,tt);
                        end   
                      end
                             for num=ll:partnum
                                    matpt(ori_sizeall+num-ptnum).X={partpt(num).X,'_',part(i).ptname};
                                    matpt(ori_sizeall+num-ptnum).X=cell2mat(matpt(ori_sizeall+num-ptnum).X);
                                    select(ori_sizeall+num-ptnum)=select(ori_sizeall+num-ptnum)+partse(num);
                                    matall.B(ori_sizeall+num-ptnum,1)=matall.B(ori_sizeall+num-ptnum,1)+partmat.B(num,1);
                             end 
                      
                       for n_num=ll:partnum
                         for nz_num=ll:partnum
                                  matall.G(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)=matall.G(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)+partmat.G(n_num,nz_num);
                                  matall.C(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)=matall.C(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)+partmat.C(n_num,nz_num);
         
                          end
                       end  
        
                 end
           end
                                                                               %  子电路矩阵加入总矩阵  结束
            
      line=line+1;
    elseif strcmp(words,'.PROBE')                                               %probe  寻找V,I,并确定LT矩阵   
           pronum=pronum+1;                                                     %需要probe的变量数目     每一个probe对应一个变量 

⌨️ 快捷键说明

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