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.结果展示

Substrate Marker
Zoom in

5.非常方便!

将得到的Macro文件重命名并保存,之后可直接修改Ruby代码中的参数来得到变参数的版图

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐