Matlab: 绘制GDS图纸

文章目录


前言

GDS图纸的生成

在半导体微纳加工中,一张精确的GDS图纸是器件制备的起点。一般有下面几种生成方式,

1.代码生成:Matlab和python都可安装编译器,通过编码结构的坐标参数来绘制图纸。适用于阵列规模较大且已知结构排布规律的情况;

2.lumerical FDTD等系列的导出:lumerical 软件可对在其中仿真的超构光栅阵列与光波导进行结构的导出。适用于规模较小且支持在有限时间内完成仿真的结构;

3.直接由图纸编辑软件生成:CWin4和klayout软件可以直接绘制基本结构和阵列,也可以对生成的图纸进行微调。适用于结构排布相对简单的情况;


提示:以下是本篇文章正文内容,下面案例可供参考

一、Matlab绘制GDS图纸的流程

先在Matlab中安装mex编译器

1.运行主文件夹下的makemex

2.提示运行成功后,在Project-New project目录下找到Cell-A-StraightWG,并运行

  1. 选择自行撰写的代码,生成GDS图纸

(文件:nicolasayotte/MatlabGDSPhotonicsToolbox)

二、Matlab生成GDS图纸的程序

1.整体示例

代码如下(以绘制超构纳米柱阵列为例):

matlab 复制代码
%% *********************************
% Matlab绘制GDS图纸

clc,clear,close all;

gs = gds_structure('Circle');
load('radii_PC.txt');
radius = radii_PC;
radius = radius*10^9;    % 量纲对齐,此前的默认单位为m,这里为nm

[Nx,Ny] = size(radius);
p = 650;   % 单位为nm, 为周期数值

Mod_x = mod(Nx,2);   % 判断是奇数阵列还是偶数阵列

if Mod_x == 1
    x = -(p*(Nx-1)/2); 
    y = p*((Nx-1)/2);
else
    x = -Nx/2*p;          % 确定结构的初始中心坐标
    y = Nx/2*p;
end

y_start = y;   % y的起点坐标
m = 361;

C = zeros(m,2);   % 数组:存储局部的圆周坐标
C2 = cell(Nx,Ny); % 元胞:存储每个阵列上的全部坐标

% 按列扫描 *********************
for j = 1:Ny

    y = y_start;

    for i = 1:Nx
        R = radius(i,j);
         
        % 确定了R之后开始确定四周的坐标
        
        for k = 1:m
            C(k,1) = R*cos(2*pi*(k-1)/(m-1))+x;
            C(k,2) = R*sin(2*pi*(k-1)/(m-1))+y;
        end

        C1 = bsxfun(@plus,C,[x,y]);
        C2{i,j} = C;           % 将第一个圆柱的坐标存为C2元胞中的第一个元素
        
        y = y - p;    % 垂直平移到下一个结构的中心坐标
    end

    x = x + p;   % 水平平移到下一个结构的中心坐标
end

gs(end+1)=gds_element('boundary','xy',C2,'layer',1);       % layer是图层
glib=gds_library('Circle_BLOCKS','uunit',1e-9,'dbunit',1e-12,gs);    % 这里的默认单位为1e-9,也就是nm, 1e-12为精度
write_gds_library(glib,'!PC_phase.gds');      % gds文件命名为PC_phase

2.代码分析

使用Matlab生成GDS图纸的核心逻辑是确定并存储每个单元结构的坐标。

这里所用的案例是1000*1000的圆形阵列,之所以用代码产生,是因为这个阵列圆的半径是不同的,并且规律很复杂。首先导入这个阵列的半径参数,并给待生成的GDS层命名。

以图纸的正中心为二维坐标系的零点,确定图纸的起点在左上角。坐标为(-x_length/2,y_length/2)。具体数值=均匀排布的间距(p)*采样阵列数(Nx or Ny)/2,不过在这之前需要判断阵列为奇数or偶数。

从循环中坐标的变换可以看出,这里的扫描是按列扫行,再变列。

在确定了结构的中心位置之后,需要进一步确定边角的顶点坐标。从而让版图软件直接根据我们提供的坐标来连线绘图。对于矩形结构,除了中心坐标外还需要四个顶点坐标;而对于我们这里的圆结构,则需要对圆弧进行分段,为了尽可能逼近圆,这里以1°为一个间隔,将圆周量化为360个顶点。

从单个圆的局部坐标系来看,圆周上的顶点坐标可以简单由在一维轴上的投影得到。不过注意这里是相对坐标,顶点的绝对坐标还需加上圆心坐标,即(x + Δx, y+ Δy).

循环中的每个圆,先取得半径数值,再计算圆周上361个顶点坐标,最后与圆心坐标一起储存在元胞的对应位置中。

(PS:这里的单位为nm)


总结

以上就是利用matlab绘制GDS图纸的流程和基本逻辑,其他类型的图纸也可以通过增加或减少循环,或更改坐标标定规则来实现。

相关推荐
.select.6 分钟前
c++ auto
开发语言·c++·算法
2401_884563249 分钟前
C++中的访问者模式高级应用
开发语言·c++·算法
消失的旧时光-194321 分钟前
C++ 多态核心三件套:虚函数、纯虚函数、虚析构函数(面试 + 工程完全指南)
开发语言·c++·面试·虚函数·纯虚函数·虚析构函数
青春易逝丶38 分钟前
策略模式
java·开发语言·策略模式
freexyn40 分钟前
Matlab入门自学七十四:坐标系转换,直角坐标、极坐标和球坐标的转换
开发语言·算法·matlab
Dxy12393102161 小时前
js如何把字符串转数字
开发语言·前端·javascript
_饭团1 小时前
字符串函数全解析:12 种核心函数的使用与底层模拟实现
c语言·开发语言·学习·考研·面试·蓝桥杯
Larry_Yanan1 小时前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
2401_831824961 小时前
嵌入式C++驱动开发
开发语言·c++·算法
qingcyb2 小时前
重复 id 对应的多个对象
开发语言·python