# HG changeset patch # User cdf # Date 1436259859 0 # Node ID 15cea85c6afda3a472adc086ef66ba7dbb39b6b9 # Parent 8c85ee67be167db7e0050852e5de3a78b8d1cbfa remove incomplete file diff -r 8c85ee67be16 -r 15cea85c6afd extra/ocs/inst/prs/prs_iff_dot.m --- a/extra/ocs/inst/prs/prs_iff_dot.m Tue Jul 07 05:03:42 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,312 +0,0 @@ -## Copyright (C) 2006,2007,2008 Carlo de Falco -## -## This file is part of: -## OCS - A Circuit Simulator for Octave -## -## OCS is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with OCS; If not, see . -## -## author: Carlo de Falco -## author: Massimiliano Culpo - -## -*- texinfo -*- -## @deftypefn{Function File} @var{outstruct} = prs_iff(@var{name}) -## Parse a netlist in IFF format and produce a graph representing -## the circuit in dot language. -## -## @var{name} is the basename of the CIR and NMS files to -## be parsed. -## -## See the @cite{IFF file format specifications} (distributed together -## with the OCS package) for more details on the file format. -## -## @var{outstruct} has the following fields: -## -## @example -## outstruct = -## @{ -## LCR: struct % the fields of LCR are shown below -## NLC: struct % NLC has the same fields as LCR -## namesn: matrix % numbers of vars named in .nms file -## namess: cell % the names corresponding to the vars above -## totextvar: scalar % the total number of external variables -## totintvar: scalar % the total number of internal variables -## @} -## -## outstruct.LCR = -## outstruct.NLC = -## @{ -## struct array containing the fields: % array has one element per block -## -## func % name of the sbn file corresponding to each block -## section % string parameter to be passed to the sbn files -## nextvar % number of external variables for each element of the block -## vnmatrix % numbers of the external variables of each element -## nintvar % number of internal variables for each element of the block -## osintvar % number of the first internal variable -## npar % number of parameters -## nparnames% number of parameter names -## nrows % number of rows in the block -## parnames % list of parameter names -## pvmatrix % list of parameter values for each element -## -## @} -## @end example -## -## See the @cite{IFF file format specifications} for details about -## the output structures. -## @seealso{prs_spice} -## @end deftypefn - -function outstruct = prs_iff_dot(name) - - ## Check input - if (nargin != 1 || !ischar(name)) - error("prs_iff: wrong input.") - endif - - ## Initialization - version ="0.1b1"; - outstruct = struct("NLC",[],... - "LCR",[],... - "totextvar",0); - - ## Open cir file - filename = [name ".cir"]; - if isempty(file_in_path(".",filename)) - error(["prs_iff: .cir file not found:" filename]); - endif - fid = fopen(filename,"r"); - - ## Check version - ## FIXME: this part can be improved a lot!! - line = fgetl(fid); - - if line(1)!="%" - error(["prs_iff: missing version number in file " filename]); - endif - - if ~strcmp(version,sscanf(line(2:end),"%s")); - error(["prs_iff: conflicting version number in file " filename]); - endif - - ndsvec = []; # Vector of circuit nodes - intvar = 0; # Number of internal variables - - ## NLC section - NLCcount = 0; - while !strcmp(line,"END") - - ## Skip comments - while line(1)=="%" - line = fgetl(fid); - endwhile - - if strcmp(line,"END") - break - else - NLCcount++; - endif - - ## parse NLC block - [outstruct,intvar] = parseNLCblock(fid,line,outstruct,NLCcount,intvar); - - ndsvec = [ndsvec ; ... - outstruct.NLC(NLCcount).vnmatrix(:)]; - - ## skip the newline char after the matrix - line = fgetl(fid); - - ## proceed to next line - line = fgetl(fid); - - endwhile - - ## LCR section - LCRcount = 0; - line = fgetl(fid); - - while (!strcmp(line,"END")) - - ## Skip comments - while line(1)=="%" - line = fgetl(fid); - endwhile - - if strcmp(line,"END") - break - else - LCRcount++; - endif - - ## parse block header - [outstruct,intvar] = parseLCRblock(fid,line,outstruct,LCRcount,intvar); - - ndsvec = [ndsvec ; ... - outstruct.LCR(LCRcount).vnmatrix(:)]; - - ## skip the newline char after the matrix - line = fgetl(fid); - - ## proceed to next line - line = fgetl(fid); - - endwhile - - ## Set the number of internal and external variables - outstruct.totintvar = intvar; - nnodes = length(unique(ndsvec)); - maxidx = max(ndsvec); - - if nnodes <= (maxidx+1) - ## If the valid file is a subcircuit it may happen - ## that nnodes == maxidx, otherwise nnodes == (maxidx+1) - outstruct.totextvar = max(ndsvec); - else - error("prs_iff: hanging nodes in circuit %s",name); - endif - ## fclose cir file - fclose(fid); - - ## Open nms file - filename = [name ".nms"]; - if isempty(file_in_path(".",filename)) - error(["prs_iff: .nms file not found:" filename]); - endif - fid = fopen(filename,"r"); - - ## Check version - line = fgetl(fid); - - if line(1)~="%" - error(["prs_iff: missing version number in file " filename]); - endif - - if ~strcmp(version,sscanf(line(2:end),"%s")); - error(["prs_iff: conflicting version number in file " filename]); - endif - - ## Initialization - cnt = 1; - outstruct.namesn = []; - outstruct.namess = {}; - nnames = 0; - - while cnt - [nn,cnt] = fscanf(fid,"%d","C"); - [ns,cnt] = fscanf(fid,"%s","C"); - - if cnt - outstruct.namesn(++nnames)=nn; - outstruct.namess{nnames}=ns; - endif - endwhile - - ## fclose nms file - fclose(fid); - -endfunction - - -############################################## -function [outstruct,intvar] = parseNLCblock(fid,line,outstruct,NLCcount,intvar); - - ## Parse first line of the header and retrieve: - ## 1 - SBN function name - ## 2 - Section - ## 3 - Number of external variables - ## 4 - Number of parameters - [func,section,nextvar,npar] = sscanf(line,"%s %s %g %g","C"); - outstruct.NLC(NLCcount).func = func; - outstruct.NLC(NLCcount).section = section; - outstruct.NLC(NLCcount).nextvar = nextvar; - outstruct.NLC(NLCcount).npar = npar; - ## Parse second line of the header and retrieve: - ## 1 - Number of elements of this type - ## 2 - Number of parameter names to be parsed - [nrows,nparnames] = fscanf(fid,"%g %g","C"); - outstruct.NLC(NLCcount).nrows = nrows; - outstruct.NLC(NLCcount).nparnames = nparnames; - outstruct.NLC(NLCcount).parnames = {}; - for ii=1:nparnames - outstruct.NLC(NLCcount).parnames{ii} = fscanf(fid,"%s","C"); - endfor - - ## Parse the matrix containing the values of parameters - [outstruct.NLC(NLCcount).pvmatrix] = fscanf(fid,"%g",[npar,nrows])'; - - ## Parse the connectivity matrix - [outstruct.NLC(NLCcount).vnmatrix] = fscanf(fid,"%g",[nextvar,nrows])'; - - ## Compute internal variables cycling over each - ## element in the section - for iel = 1:nrows - [a,b,c] = feval(func,section,outstruct.NLC(NLCcount).pvmatrix(iel,:),... - outstruct.NLC(NLCcount).parnames,zeros(nextvar,1),[],0); - - ## FIXME: if all the element in the same section share the - ## same number of internal variables, the for cycle can be - ## substituted by only one call - outstruct.NLC(NLCcount).nintvar(iel) = columns(a) - outstruct.NLC(NLCcount).nextvar; - outstruct.NLC(NLCcount).osintvar(iel) = intvar; - - intvar += outstruct.NLC(NLCcount).nintvar(iel); - endfor - -endfunction - -############################################## -function [outstruct,intvar] = parseLCRblock(fid,line,outstruct,LCRcount,intvar); - - ## Parse first line of the header and retrieve: - ## 1 - SBN function name - ## 2 - Section - ## 3 - Number of external variables - ## 4 - Number of parameters - [func,section,nextvar,npar] = sscanf(line,"%s %s %g %g","C"); - outstruct.LCR(LCRcount).func = func; - outstruct.LCR(LCRcount).section = section; - outstruct.LCR(LCRcount).nextvar = nextvar; - outstruct.LCR(LCRcount).npar = npar; - ## Parse second line of the header and retrieve: - ## 1 - Number of elements of this type - ## 2 - Number of parameter names to be parsed - [nrows,nparnames] = fscanf(fid,"%g %g","C"); - outstruct.LCR(LCRcount).nrows = nrows; - outstruct.LCR(LCRcount).nparnames = nparnames; - outstruct.LCR(LCRcount).parnames = {}; - for ii=1:nparnames - outstruct.LCR(LCRcount).parnames{ii} = fscanf(fid,"%s","C"); - endfor - - ## Parse the matrix containing the values of parameters - [outstruct.LCR(LCRcount).pvmatrix] = fscanf(fid,"%g",[npar,nrows])'; - - ## Parse the connectivity matrix - [outstruct.LCR(LCRcount).vnmatrix] = fscanf(fid,"%g",[nextvar,nrows])'; - - ## Compute internal variables cycling over each - ## element in the section - for iel = 1:nrows - [a,b,c] = feval(func,section,outstruct.LCR(LCRcount).pvmatrix(iel,:),... - outstruct.LCR(LCRcount).parnames,zeros(nextvar,1),[],0); - - ## FIXME: if all the element in the same section share the - ## same number of internal variables, the for cycle can be - ## substituted by only one call - outstruct.LCR(LCRcount).nintvar(iel) = columns(a) - outstruct.LCR(LCRcount).nextvar; - outstruct.LCR(LCRcount).osintvar(iel) = intvar; - - intvar += outstruct.LCR(LCRcount).nintvar(iel); - endfor - -endfunction