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图纸的流程和基本逻辑,其他类型的图纸也可以通过增加或减少循环,或更改坐标标定规则来实现。

相关推荐
喵了meme15 小时前
C语言实战4
c语言·开发语言
码界奇点15 小时前
Python从0到100一站式学习路线图与实战指南
开发语言·python·学习·青少年编程·贴图
9ilk15 小时前
【C++】--- 特殊类设计
开发语言·c++·后端
sali-tec16 小时前
C# 基于halcon的视觉工作流-章68 深度学习-对象检测
开发语言·算法·计算机视觉·重构·c#
生骨大头菜17 小时前
使用python实现相似图片搜索功能,并接入springcloud
开发语言·python·spring cloud·微服务
绝不收费—免费看不了了联系我17 小时前
Fastapi的单进程响应问题 和 解决方法
开发语言·后端·python·fastapi
消失的旧时光-194317 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
咖啡续命又一天18 小时前
Trae CN IDE 中 Python 开发的具体流程和配置总结
开发语言·ide·python·ai编程
4311媒体网18 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php