CodeX---KLayout---Macro 自动生成光刻GDS版图
·
利用KLayout中的macro功能自动生成GDS 文件
Example.1: 一个 5 mm × 5 mm 的芯片版图,上面有周期性十字 marker、文字编号、四角大对准标记和外框。
1.参数定义
chip_size = 5000.0:芯片尺寸 5000 um,也就是 5 mm。
spacing = 200.0:marker 间距 200 um。
cross_size = 30.0、line_width = 2.0:普通十字标记尺寸 30 um,线宽 2 um。
big_cross_size = 80.0、big_line_width = 5.0:四角大十字尺寸 80 um,线宽 5 um。
text_size = 20.0:文字高度约 20 um。
dbu = 0.001:版图数据库单位是 0.001 um,也就是 1 nm。
scale = 1.0 / dbu:把 um 转换成整数数据库单位。
2.将参数定义要求输入CodeX得到相应的ruby code
module MyMacro
include RBA
# ==========================
# Parameters
# ==========================
chip_size = 5000.0 # um
spacing = 200.0 # um
cross_size = 50.0 # um
line_width = 5.0 # um
big_cross_size = 80.0 # um
big_line_width = 5.0 # um
text_size = 20.0 # um
dbu = 0.001
scale = 1.0 / dbu
# ==========================
# Layout
# ==========================
layout = Layout::new
layout.dbu = dbu
top = layout.create_cell("TOP")
layer_marker = layout.layer(1, 0)
layer_text = layout.layer(2, 0)
layer_frame = layout.layer(10, 0)
# ==========================
# Helper functions
# ==========================
def self.um(x, scale)
(x * scale).round
end
def self.add_box(cell, layer, x1, y1, x2, y2, scale)
cell.shapes(layer).insert(
Box::new(
um(x1, scale),
um(y1, scale),
um(x2, scale),
um(y2, scale)
)
)
end
def self.add_cross(cell, layer, x, y, size, width, scale)
# horizontal
add_box(
cell, layer,
x - size/2.0,
y - width/2.0,
x + size/2.0,
y + width/2.0,
scale
)
# vertical
add_box(
cell, layer,
x - width/2.0,
y - size/2.0,
x + width/2.0,
y + size/2.0,
scale
)
end
# ==========================
# Marker Array
# ==========================
n = (chip_size / spacing / 2.0).floor
coords = (-n..n).map { |i| i * spacing }
gen = TextGenerator::default_generator
coords.each_with_index do |y, row|
letter = (65 + row).chr rescue "X"
coords.each_with_index do |x, col|
number = col + 1
add_cross(
top,
layer_marker,
x,
y,
cross_size,
line_width,
scale
)
label = "#{letter}#{number}"
mag = text_size / gen.dheight
text_region = gen.text(
label,
dbu,
mag
)
text_region.transform(
Trans::new(
um(x + 25.0, scale),
um(y + 25.0, scale)
)
)
top.shapes(layer_text).insert(
text_region
)
end
end
# ==========================
# Corner Alignment Marks
# ==========================
corner_offset = chip_size/2.0 - 150.0
[-corner_offset, corner_offset].each do |x|
[-corner_offset, corner_offset].each do |y|
add_cross(
top,
layer_marker,
x,
y,
big_cross_size,
big_line_width,
scale
)
end
end
# ==========================
# Frame
# ==========================
half = chip_size/2.0
frame_width = 5.0
add_box(
top, layer_frame,
-half, -half,
half, -half + frame_width,
scale
)
add_box(
top, layer_frame,
-half, half - frame_width,
half, half,
scale
)
add_box(
top, layer_frame,
-half, -half,
-half + frame_width, half,
scale
)
add_box(
top, layer_frame,
half - frame_width, -half,
half, half,
scale
)
# ==========================
# Write GDS
# ==========================
output_path = File.join(
ENV["USERPROFILE"],
"Desktop",
"STO_marker_5mm_200um_cross50um_line5um.gds"
)
layout.write(output_path)
puts ""
puts "===================================="
puts "GDS generated successfully"
puts output_path
puts "===================================="
puts ""
end
3.将得到的Ruby code输入KLayout中的Macro Development(快捷键F5)中
Run current script 直接得到GDS文件
4.结果展示


5.非常方便!
将得到的Macro文件重命名并保存,之后可直接修改Ruby代码中的参数来得到变参数的版图
更多推荐




所有评论(0)