tcl 与 opc

本文介绍 calibre 与 tcl 的结合使用。

calibre 内嵌了 tcl 解释器,可以直接调用 tcl 命令完成一些操作,同时 calibre 还开放了一些接口(API)给 tcl 语言调用,学会二者有机结合,可以拥有更多的工具实现特定的功能。

在 calibre 的 calibre designrev reference manual 中(calibr_drv_ref.pdf)中,给出了大量的 api 以供 tcl 使用。需要时自行查阅,这里不做介绍

calibre 软件调用 tcl 脚本的方式:

calibredrv xxx.tcl 或者 calibrewb xxx.tcl

1. 常见的一些用法

1.1 输入输出

1.1.1 gds 输入输出

#!/bin/tclsh

set gdsin ./test.oas
set LT [layout create  $gdsin -dt_expand -preserveProperties]
$LT scale 0.9
$LT oasisout out.oas
  • layout create 是 calibre 的 api for tcl,可以 用来读取 gds
    • -dt_expand 是为了保留 gds 里面的 datatype,避免相同的 layernum,不同的 datatype 合并
    • -preserveProperties 是用于保留所有的 property data
  • LT是读取文件后的 句柄
  • $LT scale 是 calibre 的 api for tcl,manual 中的 $L 开头的命令都可以这样使用
  • $L oasisout是用来输出 oas 文件

1.1.2 rdb 的输入输出

#!/bin/tclsh

set rdbin ./test.rdb
set RDB [layout create  $rdbin -dt_expand]
set rdblayer [$RDB layers]
set rdbtopcell [$RDB topcell]
$RDB scale 0.9
$RDB rdbout temp.rdb -cell $rdbtopcell -layers $rdblayer
  • layout create 也可以用来 读取 rdb 文件
    • -dt_expand 是为了保留 gds 里面的 datatype,避免相同的 layernum,不同的 datatype 合并
  • RDB是读取文件后的 句柄
  • $L rdbout是用来 输出 rdb 文件
#!/bin/tclsh

set rdbin ./test.rdb
set RDB [layout create  $rdbin -singlelayer]
$RDB oasisout out.oas

set LRS [layout create  out.oas -map 0 -1 10086]
$LRS oasisout rdbmarker.oas
  • rdb 还可以输出为 gds 文件,因为 rdb 里面的有 defect marker 坐标的,也就可以输出带 polygon 图形的 gds 文件
  • -singlelayer会把所有类型的 defect 读取到一层 layer 上,如果不写,会按照 0,1,2…的 number 来,每层是一类 defect type
  • -map 0 -1 10086是把读取到的 gds 里面的所有 layer 都 map 到 10086 这一层上

1.1.3 其他常见的方法

  • layout filemerge
#!/bin/tclsh

set gdsin ./test.oas
set rdbmarker rdbmarker.oas

layout filemerge -in $gdsin -in $rdbmarker -oasisout outall.oas
  • $L create clip
#!/bin/tclsh

set LT [layout create  $gdsin -dt_expand]
set TOPCELL [$L topcell]
$LT create clip $TOPCELL -rdb temp.rdb -halo 5

1.2 新建 layout

#!/bin/tclsh

set Lout [layout create] ;# 新建一个空白 layout

$Lout units microns 1000 ;# 指定 units

$Lout create cell pitch_xy ;# 创建 cell

$Lout create layer 1.0 ;# 创建 layer num
$Lout create layer 2.0

set poly_coord {0 0 100 100}

eval $Lout create polygon pitch_xy 1.0 $poly_coord ;# 生成图形

$Lout oasisout out_temp.oas ;# 输出为 oas
  • eval 目的是构造单一脚本,将后面的部分拼接成字符串,整体解析执行
    • eval 一般是非必要的,只要按照命令用法写参数,可以直接执行。
    • 但是如果存在变量替换,比如上述中 $poly_coord 是一个列表,那么 create polygon 会报错,因为这个命令要求坐标直接输入数字,而不是列表或者字符串,这时候就必须用上 eval
  • $L create polygon cellName layer x1 y1 x2 y2... xn yn,需要指定 cellname layernum 和坐标

1.3 加 Label

1.3.1 举例 1:将每个 gds 的名字当作 label 加到 gds 里面

set gdsfolder "temp/gdsout"  

set outlayer 99
set outdatatype 0
set cutlength 10

set gdsin [glob -nocomplain -directory $gdsfolder "*.gds" "*.oas"]

foreach gds $gdsin {

   set gdsName [file rootname [file tail $gds] ]
   set cutName [string range $gdsName 0 $cutlength]
   set LableName "+ $cutName"

   set Lin [layout create  $gds]
   set TOPCELL [$Lin topcell]
   set bbox [$Lin bbox $TOPCELL] 
   set x1 [lindex $bbox 0]
   set y1 [lindex $bbox 1]
   set x2 [lindex $bbox 2]
   set y2 [lindex $bbox 3]

   set prec [layout peek $gds -precision]

   set locx [expr $x2/$prec + 2]
   set locy [expr $y1/$prec]

   $Lin create layer ${outlayer}.${outdatatype}
   $Lin create cell addLabel  ;# 将新创建的对象放在这个 cell 里面

   set obj1 [StringFeature ab0 0 0 15 2 1 $LableName l]
   $obj1 addToLayout $Lin addLabel 1 ${outlayer}.${outdatatype}

   $Lin create ref $TOPCELL addLabel ${locx}u ${locy}u 0 90 1; # rotate 90

   $Lin oasisout  $gdsfolder/${gdsName}.oas
}

1.3.2 举例 2:按照阵列给每个 block 加 label

set gdsin "temp/temp_merged.oas"
set out_oas merge_out.oas
set layer 99
set datatype 0

set L0 [layout create $gdsin -dt_expand]

set TOPCELL [$L0 topcell]
$L0 create layer $layer.$datatype

set bbox [$L0 bbox $TOPCELL]
set x0 [lindex $bbox 0]
set y0 [lindex $bbox 1]
set shiftx 0
set shifty -2.5

set curCol 1
set curRow 1
set ti 0
set xPitch 20
set yPitch 20
set maxCol 3

set r 1
while {$r <= 6 } {
    if {$curCol > $maxCol} {
        incr curRow
        set curCol 1
    }

    set string "+ TK${r}"

    set xloc [expr {$curCol*$xPitch+$shiftx}]
    set yloc [expr {$curRow*$yPitch+$shifty}]

    set st [StringFeature a_${ti} $xloc $yloc 10 2 1 $string l]
    $st addToLayout $L0 $TOPCELL 1 $layer.$datatype

    incr curCol
    incr ti
    incr r
}

$L0 oasisout $out_oas

欢迎各位看官及技术大佬前来交流指导呀,可以邮件至 jqiange@yeah.net