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

相关推荐
zfj32110 小时前
从源码层面解析一下ThreadLocal的工作原理
java·开发语言·threadlocal
墨笔之风10 小时前
java后端根据双数据源进行不同的接口查询
java·开发语言·mysql·postgres
Mr -老鬼10 小时前
功能需求对前后端技术选型的横向建议
开发语言·前端·后端·前端框架
IT=>小脑虎10 小时前
Go语言零基础小白学习知识点【基础版详解】
开发语言·后端·学习·golang
qq_4061761410 小时前
关于JavaScript中的filter方法
开发语言·前端·javascript·ajax·原型模式
醇氧11 小时前
Ping 127.0.0.1 具有 32 字节的数据:一般故障。【二】
运维·服务器·开发语言
码农水水11 小时前
中国邮政Java面试:热点Key的探测和本地缓存方案
java·开发语言·windows·缓存·面试·职场和发展·kafka
CCPC不拿奖不改名11 小时前
python基础:python语言中的控制结构+面试习题
开发语言·python·学习
MM_MS11 小时前
Halcon基础知识点及其算子用法
开发语言·人工智能·python·算法·计算机视觉·视觉检测
a程序小傲11 小时前
小红书Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·后端·python·面试·职场和发展