mcpField
M
matlab-read-pcb-layout

matlab-read-pcb-layout

github.com/matlabその他1.2k76 回インストール1 日前に更新
リポジトリ

matlab-read-pcb-layout について

Gerber、ODB++、Cadence Allegro形式のPCBやIC/SiPパッケージレイアウトを、MATLABに取り込んで調べるためのスキルです。形状や階層データを抽出し、インポートした設計を後続の解析に利用できます。

主な機能

  1. 01Gerber、ODB++、Allegroのインポート
  2. 02レイヤーとスタックアップの確認
  3. 03ネット、部品、ピンの照会
  4. 04ポリゴンの抽出と表示
  5. 05pcbComponentへの変換

活用シーン

  1. 01基板やパッケージのレイヤーとネットの確認
  2. 02Gerberの金属形状を抽出して独自設計に利用
  3. 03インポート形状をSパラメーター解析用に準備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-read-pcb-layout

インストール後、Claude Code で/matlab-read-pcb-layoutを入力して読み込まれたか確認します。

同梱ファイルmanifest.yaml

詳細

PCB およびパッケージレイアウトの読み込み

対象範囲: pcbFileRead は PCB 基板と IC/SiP パッケージの両方に対応します。ODB++ ファイルと Allegro ファイルには、パッケージレベルの設計(BGA 基板、インターポーザー、内蔵受動部品)が含まれる場合があります。ワークフローは同じです。形式によって内容は異なりますが、関数名は変わりません。

使用する場面

  • Gerber ファイル(.gtl、.gbl、.gbr など)を MATLAB にインポートして、可視化または EM 解析を行う
  • ODB++ アーカイブ(圧縮または非圧縮)を読み込み、基板またはパッケージのレイアウトを調べる
  • Cadence Allegro の .brd ファイルをインポートする
  • インポートしたレイアウトから、cadnet、コンポーネント、レイヤー、ピン、または形状を調べる
  • Gerber ファイルから金属レイヤーのポリゴンを抽出し、カスタム設計に使用する
  • 外部設計のレイアウトから pcbComponent を作成して、S パラメーター解析を行う

使用しない場面

  • 設計を Gerber ファイルにエクスポートする場合は、matlab-write-pcb-layout を使用します
  • 形状プリミティブから PCB 構造を一から作成する場合は、matlab-assemble-pcb-layout を使用します
  • インポート後に EM 解析を実行する場合は、matlab-analyze-em を使用します
  • 基板または積層構造の材料を定義する場合は、matlab-manage-pcb-material を使用します

一般的なワークフロー

  1. このスキル: Gerber、ODB++、または Allegro から PCB レイアウトをインポートします
  2. 次の手順: matlab-analyze-pcb-pdn — インポートした基板の PDN DC 解析、または matlab-analyze-em — インポートした形状からの S パラメーター抽出、または matlab-model-via — インポートした積層構造のビア解析

クイックリファレンス

タスクコード
Gerber ファイルをインポートP = gerberRead('file.gtl')
形状を抽出shp = shapes(P)
積層構造を定義S = stackUp
複数レイヤーをインポートp = PCBReader('StackUp', S)
pcbComponent に変換pcb = pcbComponent(p)
ODB++ をインポートpfile = pcbFileRead('design.zip')
Allegro .brd をインポートpfile = pcbFileRead('design.brd')
cadnet の一覧表示tbl = cadnetList(pfile)
cadnet を開くcnet = cadnet(pfile, "NET_NAME")
レイヤーの積層構造を照会su = stackUp(pfile)
コンポーネントの一覧表示tbl = componentList(pfile)
パッドスタックの一覧表示tbl = padStackList(pfile)

gerberRead — シンプルなインポート

gerberRead 関数は Gerber ファイルをインポートし、PCBReader オブジェクトを返します。shapes() を使用して、金属レイヤーをポリゴン形状として抽出します。

基本的な使い方
P = gerberRead('interdigital_Capacitor.gtl');
shp = shapes(P);      % Extract metal layer shapes
show(shp(1));          % Show top layer polygon
インポートした形状の中心合わせ

インポートした形状は、CAD 原点からオフセットされていることがよくあります。形状を抽出してから中心に合わせます。

P = gerberRead('myDesign.gtl');
shp = shapes(P);
layer1 = shp(1);

% Get bounding box to compute center offset
verts = layer1.Vertices;
cx = (max(verts(:,1)) + min(verts(:,1))) / 2;
cy = (max(verts(:,2)) + min(verts(:,2))) / 2;

% Center using translate
layer1 = translate(layer1, [-cx -cy 0]);
show(layer1);
対応する Gerber ファイル拡張子
拡張子レイヤーの種類
.gtl上面銅箔
.gbl下面銅箔
.gts上面ソルダーマスク
.gbs下面ソルダーマスク
.gto上面シルクスクリーン
.gbo下面シルクスクリーン
.drlドリルファイル
.gbr汎用 Gerber

stackUp — 複数レイヤーの定義

stackUp オブジェクトは、複数レイヤー基板をインポートするための PCB レイヤー構造全体を定義します。

デフォルトの stackUp
S = stackUp;

デフォルトの積層構造には番号付きのレイヤーがあります。奇数レイヤーは導体(金属または Gerber ファイル)、偶数レイヤーは誘電体です。

レイヤーへの Gerber ファイルの割り当て
S = stackUp;
S.Layer1.Thickness = 0.1e-3;           % Air layer above board
S.Layer2 = 'interdigital_Capacitor.gtl'; % Top copper from Gerber
複数レイヤーの積層構造
S = stackUp;
S.Layer1.Thickness = 0.1e-3;       % Air
S.Layer2 = 'top_copper.gtl';       % Top copper
S.Layer3.Thickness = 0.2e-3;       % Dielectric
S.Layer3.EpsilonR = 4.4;
S.Layer4 = 'inner_layer.g2';       % Inner copper
S.Layer5.Thickness = 1.0e-3;       % Core dielectric
S.Layer5.EpsilonR = 4.4;
S.Layer6 = 'bottom_copper.gbl';    % Bottom copper

PCBReader — 基板全体のインポート

PCBReader は、Gerber ファイルを含む積層構造をラップし、pcbComponent に変換できるリーダーオブジェクトを作成します。

基本的なワークフロー
S = stackUp;
S.Layer1.Thickness = 0.1e-3;
S.Layer2 = 'interdigital_Capacitor.gtl';

p = PCBReader('StackUp', S);
pcb = pcbComponent(p);
pcb.FeedDiameter = 0.001;
show(pcb);
インポート後のフィード追加

pcbComponent に変換した後、EM 解析用のフィード位置を追加します。

pcb = pcbComponent(p);
pcb.FeedDiameter = 1e-3;
pcb.FeedLocations = [-5e-3 0 1 3;    % Port 1
                      5e-3 0 1 3];    % Port 2
sp = sparameters(pcb, linspace(1e9, 10e9, 51), 'SweepOption', 'interp');
rfplot(sp);
インポートした形状からのフィード位置の特定

フィード位置は金属配線上にある必要があります。Gerber インポートを pcbComponent に変換した後、形状を調べて有効なフィード点を見つけます。

pcb = pcbComponent(p);
show(pcb);                      % Visual inspection — identify trace endpoints
layout(pcb);                    % Top-down layout view with dimensions

プログラムで配置するには、インポートしたレイヤーのメッシュ頂点を抽出し、エッジの中点を計算します。

m = mesh(pcb);                  % Get mesh structure for coordinate reference

フィード位置が不明な場合は、主伝送線路配線の視覚的な端点にフィードを配置し、配線のエッジから少なくとも FeedDiameter/2 内側にずらします。

FeedLocations の列の意味

FeedLocations = [x, y, col3, col4] — 3 列目は信号層(給電プローブ/球が表示される層)です。4 列目はグラウンド基準層です。プローブは col3 から col4 に接続されます。順序を入れ替えると、給電球が誤った層に表示されます。

エッジ給電(ストリップモデル)

基板の端で給電する構造(例:PCB 境界で終端するマイクロストリップ線路)には、ストリップ給電モデルを使用します。

pcb.FeedViaModel = 'strip';
pcb.FeedDiameter = traceWidth / 2;  % Must be half the trace width for edge feeds

'strip' モデルは、垂直なビアプローブではなく、基板端に平面給電を作成します。トレースが終端する BoardShape の正確な端に給電点を配置します。

PCBReader のレイヤー構造

pcbComponent(PCBReader) の後、Layers セル配列は標準的な交互パターン({metal, dielectric, metal, ...})に従います。金属層には、インポートされた Gerber の形状が含まれます。FeedLocations のレイヤーインデックスは、手動で構成した pcbComponent オブジェクトと同じ奇数番号の規則(1、3、5、...)に従います。

PCBReader から pcbComponent への変換

pcbComponent コンストラクターは、PCBReader オブジェクトを直接受け取ります。

Cadence Allegro .brd のインポート

インポートまたは解析のためにユーザーが .brd ファイルに言及した場合は、インポートを試みる前に、必ず Cadence extracta.exe のパスを確認してください。 extracta ユーティリティが必要であり、事前に設定しておく必要があります。すでに設定済みだと想定しないでください。

% Step 1: Check if extracta is already configured
extractaSetup()                % Displays current path, or [] if not set

% Step 2: If [], ask user for path and configure (persists across sessions)
extractaSetup('C:/Cadence/SPB_17.4/tools/bin/extracta.exe')

% Step 3: Import
pcb = pcbFileRead('design.brd');

extractaSetup(path) は、Cadence extracta.exe 実行可能ファイルへのフルパスを受け取ります。パスは MATLAB セッションをまたいで保持されるため、実行は一度だけで済みます。これを設定しないと、.brd のインポートは extracta エラーで失敗します。

引数なしで extractaSetup() を呼び出すと、現在設定されているパス(未設定の場合は [])が表示されます。設定が完了しているかどうかの確認に使用します。

ODB++ のインポート

pcb = pcbFileRead('design.zip');       % Zipped ODB++
pcb = pcbFileRead('odb_directory');    % Unzipped ODB++

基板とパッケージの検査

pcbFileRead は、ODB++、Allegro、またはネイティブ PCB ファイルを開き、レイヤー、cadnet、コンポーネント、部品、ピン、形状を階層的に検査します。PCB 基板と IC/SiP パッケージのどちらでも同じように動作します。

ファイルを開く
pfile = pcbFileRead('ExampleBoard.odb');

返されるオブジェクトは、NumLayers、NumCadnets、NumPadStacks、NumComponents、NumParts、LayerHeight を公開します。

レイヤースタックアップの照会

stackUp(pfile) は、インポートした基板のすべてのレイヤーについて、材料の詳細を示すテーブルを返します。

su = stackUp(pfile);                   % Full stackup table
su = stackUp(pfile, [2 3 4]);         % Specific layers only

テーブルの列は、LayerNumber、LayerName、LayerType、Material、Thickness(inch)、EpsilonR、LossTangent、Conductivity(S/m) です。

注: これは pcbFileRead のオブジェクト関数であり、テーブルを返します。Gerber のインポートで使用する stackUp コンストラクターとは無関係です(「注意点」セクションを参照)。

階層のナビゲーション
% List cadnets (electrical nets)
tbl = cadnetList(pfile);               % Returns table with net names

% Open a specific cadnet and get its shapes
cnet = cadnet(pfile, "VDD_CORE");
data = cadnetData(cnet);               % Struct with .Surfaces, .Pins, .Vias, .Traces
s = shapes(cnet);                      % Same struct as cadnetData (equivalent call)

% List and inspect components
tbl = componentList(pfile);
comp = component(pfile, "U1");
pins = componentPinData(comp);         % Returns pinsData array (see below)

% List and inspect parts (component types)
tbl = partList(pfile);
p = part(pfile, "IC6ANT");
cdata = componentData(p);             % Components that use this part type

% List padstacks
tbl = padStackList(pfile);

% Layer-level inspection (metal layers only — use pfile.MetalLayer for valid indices)
lyr = layer(pfile, pfile.MetalLayer(1));
ldata = layerData(lyr);

% Search for components in a cadnet
results = findComponents(cnet);
results = findComponents(cnet, 'ComponentType', 'IC');
形状データ構造

shapes(cnet) と cadnetData(cnet) は同等で、どちらも次のフィールドを持つ構造体を返します。

フィールド型内容
.Surfacesantenna.Polygon 配列銅箔のベタ塗り領域と塗りつぶし
.Pinsantenna.Polygon 配列パッド形状
.Viasantenna.Polygon 配列ビアのバレル形状
.Tracesantenna.Polygon 配列配線されたトレースセグメント
s = shapes(cnet);
s.Traces(1).Vertices   % Vertices of first trace segment
numel(s.Surfaces)      % Number of copper pours

layerData(lyr) は同じ構造体形式を返します。各 antenna.Polygon は .Vertices プロパティ(Nx3 の double 型)を持ちます。

componentPinData — ピンの位置とプロパティ

componentPinData(comp) は pinsData 配列を返します。各要素には次のプロパティがあります。

プロパティ型説明
Center1x2 doubleピン中心の XY 位置(基板の単位)
PinNumberchar/stringピン番号/名前
CadnetNamechar/stringピンが接続するネット
PinShapechar形状の種類(例:'Rect'、'Circle')
StartLayerdoubleピンがまたがる最初のレイヤー
StopLayerdoubleピンがまたがる最後のレイヤー
Lengthdoubleパッドの長さ
Widthdoubleパッドの幅
Diameterdoubleパッドの直径(円形パッドの場合)
VerticesNx3 doubleパッド外形の全頂点
comp = component(pfile, "U1");
pins = componentPinData(comp);
pins(1).Center       % [x, y] in board units (inches for ODB++)
pins(1).CadnetName   % Which net this pin connects to
pins(1).PinNumber    % Pin identifier

座標の単位: ODB++ のインポートでは、ピンの位置(.Center)と形状の頂点は基板のネイティブ単位(通常はインチ)で表されます。pcbComponent で使用するには、25.4e-3 を掛けてメートルに変換してください。

ネットをまたいで回路経路をたどる

findComponents と componentPinData を使用すると、コンポーネントを共有するネットをたどれます。

pwr_net = cadnet(pfile, "+PWR");
pwr_comps = findComponents(pwr_net);   % Table: ComponentIndex, Refdes, PinList, ComponentType, Part

% Open a component and discover its other nets
q4 = component(pfile, string(pwr_comps.Refdes(9)));
q4_pins = componentPinData(q4);
for i = 1:numel(q4_pins)
    fprintf('%s.%s -> %s at [%.3f, %.3f]\n', "Q4", ...
        string(q4_pins(i).PinNumber), string(q4_pins(i).CadnetName), ...
        q4_pins(i).Center(1), q4_pins(i).Center(2));
end

% Follow Q4's output net to find the next component
next_net = cadnet(pfile, string(q4_pins(1).CadnetName));
next_comps = findComponents(next_net);

インポートした形状をカスタム設計で使用する

Gerber の形状をインポートし、ブール演算を使用してほかの形状と組み合わせます。

% Import a CSRR pattern from Gerber
reader = gerberRead('csrr_pattern.gbr');
shp = shapes(reader);
csrr = shp(1);
verts = csrr.Vertices;
cx = (max(verts(:,1)) + min(verts(:,1))) / 2;
cy = (max(verts(:,2)) + min(verts(:,2))) / 2;
csrr = translate(csrr, [-cx -cy 0]);

% Use as DGS or combine with other geometry
ground = traceRectangular(Length=30e-3, Width=20e-3);
groundWithSlots = ground - csrr;

pcb = pcbComponent;
signal = traceRectangular(Length=25e-3, Width=3e-3);
sub = dielectric("FR4");
sub.Thickness = 1.6e-3;
pcb.Layers = {signal, sub, groundWithSlots};
pcb.BoardShape = ground;
pcb.BoardThickness = sub.Thickness;
show(pcb);

インポートから解析までのワークフロー

%% Import
S = stackUp;
S.Layer1.Thickness = 0.1e-3;
S.Layer2 = 'myFilter.gtl';

p = PCBReader('StackUp', S);
pcb = pcbComponent(p);

%% Configure for analysis
pcb.FeedDiameter = 0.5e-3;
pcb.FeedLocations = [-10e-3 0 1 3; 10e-3 0 1 3];
pcb.Conductor = metal("Copper");
show(pcb);

%% Analyze
freq = linspace(1e9, 10e9, 51);
sp = sparameters(pcb, freq, 'SweepOption', 'interp');
rfplot(sp);

よくあるエラーの診断

エラー原因修正方法
"File not found"パスが間違っているか、サポートされていない形式ですパスを確認してください。クロスプラットフォームのパスには fullfile() を使用してください
"Unrecognized file format"ファイル拡張子と内容が一致していません形式を明示的に指定してください:pcbFileRead(file, 'FileType', 'ODB++')
インポート後のスタックアップの不一致レイヤー数または材料が設計と異なりますpcbFileRead のインポートの場合:stackUp(pfile) を呼び出して、インポートされたレイヤーテーブルを確認してください。Gerber のインポートの場合:stackUp コンストラクターがソース設計と一致していることを確認してください
.brd のインポート時の extracta エラーCadence Allegro extracta が設定されていませんまず extractaSetup() を実行してから、再試行してください
cadnetList の結果が空基板に配線済みネットがないか、形式のバージョンが正しくありませんネイティブの EDA ツールで基板を開き、配線が存在することを確認してください

注意点

  1. 座標の位置合わせ:異なる CAD ツールからの Gerber ファイルでは、原点が異なる場合があります。レイヤーを結合したり、給電点を追加したりする前に、必ず確認して中心に移動してください。

  2. 単位の不一致:Gerber ファイルの単位は mil または mm の場合があります。RF PCB Toolbox は内部的にメートルを使用します。インポートしたジオメトリが大きすぎたり小さすぎたりする場合は、ソースファイルの単位設定を確認してください。

  3. gerberRead は形状ではなく PCBReader を返します:gerberRead は PCBReader オブジェクトを返します。shapes(P) を呼び出して、金属レイヤーのポリゴンを抽出してください。リーダーに対して P.Vertices や show(P) を直接使用しないでください。

  4. stackUp コンストラクターでのレイヤーの順序:stackUp コンストラクターでのレイヤー番号は上から始まります。Layer1 は通常、基板の上の空気層で、Layer2 は最上層の銅層です(Layer1 は空気層のため、物理的な奇数番号の金属レイヤーは偶数番号の stackUp レイヤーに対応します)。

  5. layer() が受け付けるのは金属レイヤーのインデックスのみです。 layer(pfile, idx) には金属レイヤー番号を指定する必要があります。有効なインデックスを取得するには pfile.MetalLayer を使用してください。誘電体レイヤーのインデックスを渡すと(たとえば、レイヤー 1 が誘電体の場合に layer(pfile, 1) を指定すると)、「Value must be a member of this set: ...」というエラーが発生します。

  6. componentData は component ではなく part にあります。 部品タイプを使用するコンポーネントの一覧を取得するには、p = part(pfile, partName) としてから componentData(p) を呼び出してください。component オブジェクトには componentPinData と shapes がありますが、componentData はありません。

  7. stackUp の名前の衝突。 S = stackUp(引数なし)は、Gerber インポートのレイヤー構造を定義するためのコンストラクターオブジェクトを作成します。su = stackUp(pfile) は pcbFileRead のオブジェクト関数で、材料の詳細を示すテーブルを返します。これらは目的の異なる、まったく別の型です。混同しないでください。

  8. インポートしたジオメトリが大きい場合:基板全体の Gerber をインポートすると、データが非常に大きくなる場合があります。EM 解析では、基板全体を解析するのではなく、対象領域のみを抽出してください。

  9. .brd をインポートする前に、必ず extracta のパスを確認してください。 ユーザーが .brd ファイルを指定した場合は、まず extractaSetup()(引数なし)を実行して、設定済みかどうかを確認してください。[] が返された場合は、Cadence の extracta.exe のパスをユーザーに尋ね、extractaSetup(path) を実行してください。一般的なパスは C:/Cadence/SPB_<version>/tools/bin/extracta.exe です。これを設定しないと、.brd のインポートは失敗します。

  10. パッケージと基板でワークフローは同じです。 ODB++ と Allegro のファイルには、PCB だけでなく IC パッケージが含まれる場合があります。pcbFileRead はどちらも同じように処理します。内容を決めるのは形式であり、関数名ではありません。

関連するスキル

  • matlab-write-pcb-layout — 設計を Gerber 製造ファイルにエクスポートします
  • matlab-assemble-pcb-layout — 形状からカスタム PCB 構造を構築します
  • matlab-analyze-em — インポートした基板で EM 解析を実行します
  • matlab-manage-pcb-material — インポートしたスタックアップの基板材料を設定します
  • matlab-analyze-pcb-pdn — インポートした基板で PDN 解析を実行します

Copyright 2026 The MathWorks, Inc.

コメント