summaryrefslogtreecommitdiff
path: root/hyp2mat/matlab/ImportHyperLynx.m
diff options
context:
space:
mode:
Diffstat (limited to 'hyp2mat/matlab/ImportHyperLynx.m')
-rw-r--r--hyp2mat/matlab/ImportHyperLynx.m196
1 files changed, 196 insertions, 0 deletions
diff --git a/hyp2mat/matlab/ImportHyperLynx.m b/hyp2mat/matlab/ImportHyperLynx.m
new file mode 100644
index 0000000..305a199
--- /dev/null
+++ b/hyp2mat/matlab/ImportHyperLynx.m
@@ -0,0 +1,196 @@
+% CSX = ImportHyperLynx(CSX, filename, varargin)
+% load Hyperlynx file 'filename' into CSX .
+%
+% Other optional arguments:
+% epsilonr float. Set dielectric epsilon r. Overrides value in Hyperlynx file.
+% net string. Import net. Repeat to import several nets. Default is importing all nets.
+% layer string. Import layer. Repeat to import several layers. Default is importing all layers.
+% epsilonr float. Set dielectric epsilon r.
+% xmin float. Crop pcb. Set lower bound of x coordinate.
+% xmax float. Crop pcb. Set higher bound of x coordinate.
+% ymin float. Crop pcb. Set lower bound of y coordinate.
+% ymax float. Crop pcb. Set higher bound of y coordinate.
+% zmin float. Crop pcb. Set lower bound of z coordinate.
+% zmax float. Crop pcb. Set higher bound of z coordinate.
+% grid float. Set output grid size. (default = 10e-6 = 1 um)
+% arc-precision float. Set maximum difference between perfect arc and polygonal approximation.
+% clearance float. Set trace-to-plane clearance. (default = 0.0002)
+% flood string. Flood layer with copper. Repeat to flood several layers. The value "plane_layers" floods all plane layers.
+% pcb-outline none. Detailed board outline.
+% lossy-copper none. Model copper as lossy. Default is modeling copper as a perfect conductor.
+% metal-3d none. Model copper as a 3D object. Default is modeling copper as a 2D sheet.
+% version none. Print hyp2mat version number.
+%
+% ImportHyperLynx needs read and write access to the current directory.
+%
+% Examples:
+% CSX = ImportHyperLynx(CSX, 'board.hyp' )
+% will import the complete Hyperlynx file 'board.hyp' into the struct CSX.
+%
+% CSX = ImportHyperLynx(CSX, 'board.hyp', 'net', 'CLK_P' )
+% will import only the CLK_P net from the Hyperlynx file 'board.hyp' into the struct CSX.
+%
+% CSX = ImportHyperLynx(CSX, 'board.hyp', 'net', '?' )
+% lists all available nets.
+%
+% CSX = ImportHyperLynx(CSX, 'board.hyp', 'net', 'GND', 'net', 'CLK_P', 'net', 'CLK_N' )
+% will import only the GND, CLK_P and CLK_N nets.
+%
+% CSX = ImportHyperLynx(CSX, 'board.hyp', 'xmin', 0.02, 'xmax', 0.03, 'ymin', 0.04, 'ymax', 0.05 )
+% Imports all nets, and crops the board to the region 2 cm < x < 3 cm, 4 cm < y < 5 cm.
+%
+% See hyp2mat(1) - convert hyperlynx files to matlab scripts.
+
+% Copyright 2012 Koen De Vleeschauwer.
+%
+% This file is part of hyp2mat.
+%
+% This program 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, either version 3 of the License, or
+% (at your option) any later version.
+%
+% 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+function CSX = ImportHyperLynx(CSX, filename, varargin)
+
+ % determine nets to import
+ if (nargin < 2)
+ error('Wrong number of arguments');
+ end
+
+ if (~isstruct(CSX))
+ error ('expecting CSX struct as first argument');
+ end
+
+ if (~ischar(filename))
+ error ('expecting filename string as second argument');
+ end
+
+ % build command line
+ cmdargs = '';
+
+ % parse optional arguments
+ if (nargin < 3)
+ varargin = {};
+ end
+
+ vn = 1;
+ while (vn <= numel(varargin))
+ if (strcmpi(varargin{vn}, 'net'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --net ''' varargin{vn} '''' ];
+ end
+ if (strcmpi(varargin{vn}, 'layer'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --layer ''' varargin{vn} '''' ];
+ end
+ if (strcmpi(varargin{vn}, 'xmin'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --xmin ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'xmax'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --xmax ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'ymin'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --ymin ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'ymax'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --ymax ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'zmin'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --zmin ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'zmax'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --zmax ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'grid'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --grid ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'arc-precision'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --arc-precision ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'clearance'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --clearance ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'flood'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --flood ''' varargin{vn} '''' ];
+ end
+ if (strcmpi(varargin{vn}, 'epsilonr'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --epsilonr ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'bulk-resistivity'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --bulk-resistivity ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'loss-tangent'))
+ vn = vn + 1;
+ cmdargs = [ cmdargs ' --loss-tangent ' num2str(varargin{vn}) ];
+ end
+ if (strcmpi(varargin{vn}, 'pcb-outline'))
+ cmdargs = [ cmdargs ' --pcb-outline ' ];
+ end
+ if (strcmpi(varargin{vn}, 'lossy-copper'))
+ cmdargs = [ cmdargs ' --lossy-copper ' ];
+ end
+ if (strcmpi(varargin{vn}, 'metal-3d'))
+ cmdargs = [ cmdargs ' --metal-3d ' ];
+ end
+ if (strcmpi(varargin{vn}, 'version'))
+ cmdargs = [ cmdargs ' --version ' ];
+ end
+ vn = vn + 1;
+ end
+
+ % conversion
+ m_filename = mfilename('fullpath');
+ dir = fileparts( m_filename );
+ if isunix
+ hyp2mat_binary = searchBinary('hyp2mat', ...
+ {[dir filesep '..' filesep 'src' filesep], ... % try development path
+ [dir filesep '..' filesep '..' filesep '..' filesep 'bin' filesep]}); % try default install path
+ cmd = [ 'export LD_LIBRARY_PATH=; ' hyp2mat_binary ' --verbose --output-format csxcad --output pcb.m ' cmdargs ' ''' filename '''' ];
+ elseif ispc
+ hyp2mat_binary = searchBinary('hyp2mat.exe', {[dir filesep '..' filesep]});
+ cmd = [ '"' hyp2mat_binary '" --verbose --output-format csxcad --output pcb.m ' cmdargs ' "' filename '"' ];
+ else
+ error('hyp2mat:ImportHyperLynx','unknown/unsupported operating system...');
+ end
+
+ % convert .hyp to .m
+ disp (['command: ' cmd ]);
+ if isOctave()
+ fflush(stdout);
+ else
+ drawnow('update');
+ end
+
+ status = system(cmd); % security implications?
+ if (status == 0)
+ % run generated pcb.m
+ CSX = pcb(CSX);
+ delete 'pcb.m';
+ else
+ error([ 'error executing ' cmd ]);
+ end
+
+end
+
+% not truncated
+