prog_linenum

顯示具有 IC Layout-Verify-LVL 標籤的文章。 顯示所有文章
顯示具有 IC Layout-Verify-LVL 標籤的文章。 顯示所有文章

2021年6月22日 星期二

LVL Shell Script 分享

寫shell script必須要先了解LVL的語法內容才有辦法,知道應該要如何來達到我們要的效果,所以必須先看上一篇LVL command file 範例。

廢話不多說,以下先分享shell script範例,再做解說。

LVL Shell Script Example.

#! /bin/bash
##script name: genLVL.sh
##description:
##    This script is used to make LVL rule file.
##Author: ron.huang
##History:
##    2021/06/22 ron.huang release

##usage:
##    1.Please modify the layer map to the following format first.
##    2.Modify customized region
##    3.Run script ex.    ./genLVL.sh

##customized region
LAYERMAP=layermap
LVLFILE=lvl.cal

## Do not modify below
getLayerNames=$(cat $LAYERMAP | awk '{print $1}');
getPurpuseNames=$(cat $LAYERMAP | awk '{print $2}');
getLayerNumbers=$(cat $LAYERMAP | awk '{print $3}');
getDatatypeNumbers=$(cat $LAYERMAP | awk '{print $4}');

seq=1
for layerName in $getLayerNames;
do
    layerNames[$seq]=$layerName
    ((seq++))
done

seq=1
for purpuseName in $getPurpuseNames;
do
    purpuseNames[$seq]=$purpuseName
    ((seq++))
done

seq=1
for layerNumber in $getLayerNumbers;
do
    layerNumbers[$seq]=$layerNumber
    ((seq++))
done

seq=1
for datatypeNumber in $getDatatypeNumbers;
do
    datatypeNumbers[$seq]=$datatypeNumber
    ((seq++))
done

echo "//$LVLFILE" > $LVLFILE
echo '//description: Compare the differences between the two gds.' >> $LVLFILE
echo "//use genLVL.sh to generate at $(date '+%Y/%m/%d %H:%M')" >> $LVLFILE
echo "//History:" >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//SPECIFY FIRST DATABASE' >> $LVLFILE
echo 'LAYOUT PRIMARY "TOP_CELL_NAME"' >> $LVLFILE
echo 'LAYOUT PATH "top.gds"' >> $LVLFILE
echo 'LAYOUT SYSTEM GDSII' >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//SPECIFY SECOND DATABASE' >> $LVLFILE
echo 'LAYOUT PRIMARY2 "TOP_CELL_NAME2"' >> $LVLFILE
echo 'LAYOUT PATH2 "top2.gds"' >> $LVLFILE
echo 'LAYOUT SYSTEM2 GDSII' >> $LVLFILE
echo 'LAYOUT BUMP2 1000    // add 1000 to layer number for the second database' >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//OUTPUT REPORT' >> $LVLFILE
echo 'DRC RESULTS DATABASE "top.lvl.db" ASCII' >> $LVLFILE
echo 'DRC SUMMARY REPORT "top.lvl.rep"' >> $LVLFILE
echo ' ' >> $LVLFILE
echo 'DRC MAXIMUM RESULTS ALL' >> $LVLFILE
echo 'PRECISION        1000' >> $LVLFILE
echo 'RESOLUTION    1' >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//LAYER COMPARE' >> $LVLFILE

for ((i=1;i<=${#layerNames[@]};i++));
do
    LD=$((i+2000))
    echo "LAYER ${layerNames[$i]}_${purpuseNames[$i]}     $LD LAYER MAP ${layerNumbers[$i]} DATATYPE ${datatypeNumbers[$i]} $LD" >> $LVLFILE
    LD2=$((LD+1000))
    LN2=$((${layerNumbers[$i]}+1000))
    echo "LAYER ${layerNames[$i]}_${purpuseNames[$i]}_Sec $LD2 LAYER MAP $LN2 DATATYPE ${datatypeNumbers[$i]} $LD2" >> $LVLFILE
    echo "DIFF.${layerNames[$i]}.${purpuseNames[$i]} {@ ${layerNames[$i]}:${purpuseNames[$i]}[${layerNumbers[$i]}:${datatypeNumbers[$i]}] is different from the ${layerNames[$i]}:${purpuseNames[$i]}[${layerNumbers[$i]}:${datatypeNumbers[$i]}] of another GDS" >> $LVLFILE
    echo "${layerNames[$i]}_${purpuseNames[$i]} XOR ${layerNames[$i]}_${purpuseNames[$i]}_Sec" >> $LVLFILE
    echo "}" >> $LVLFILE
done

以下為範例詳解













LVL command file 範例

LVL(layout versus layout)
顧名思義就是在做兩個layout之間的比對,為什麼會需要做這個比對的原因,舉個例來說,如果今天光罩已經好一版,但這後續為了解決某些問題,而導致需要修改光罩,那就會需要來做LVL,為了確保我們沒有修改的部分都與原本的layout一致。

LVL Example.

<code>
//lvl.cal

//SPECIFY FIRST DATABASE
LAYOUT PRIMARY "TOP_CELL_NAME"
LAYOUT PATH "top.gds"
LAYOUT SYSTEM GDSII

//SPECIFY SECOND DATABASE
LAYOUT PRIMARY2 "TOP_CELL_NAME2"
LAYOUT PATH2 "top2.gds"
LAYOUT SYSTEM2 GDSII
LAYOUT BUMP2 1000    // add 1000 to layer number for the second database

//OUTPUT REPORT
DRC RESULTS DATABASE "top.lvl.db" ASCII
DRC SUMMARY REPORT "top.lvl.rep"

DRC MAXIMUM RESULTS ALL
PRECISION        1000
RESOLUTION    1

//LAYER COMPARE
LAYER OD                1001    LAYER MAP           2    DATATYPE    0    1001
LAYER OD_Sec        2001    LAYER MAP    1002    DATATYPE    0    2001
DIFF.OD {@ OD is different from the OD of another GDS
OD XOR OD_Sec
}
</code>

以下為範例詳解


//lvl.cal
//部分為註解,開頭先打上rule file名稱,取.cal為副檔名是因為使用的EDA tool 為Calibre

//SPECIFY FIRST DATABASE
LAYOUT PRIMARY "TOP_CELL_NAME"
LAYOUT PATH "top.gds"
LAYOUT SYSTEM GDSII
指定第一個layout要驗證的
Top Cell Name
GDS的位置
設定讀取檔案格式為GDSII

//SPECIFY FIRST DATABASE
LAYOUT PRIMARY2 "TOP_CELL_NAME2"
LAYOUT PATH2 "top2.gds"
LAYOUT SYSTEM2 GDSII
LAYOUT BUMP2 1000    // add 1000 to layer number for the second database
指定第二個layout要驗證的
Top Cell Name
GDS的位置
設定讀取檔案格式為GDSII
並且將第二個gds的layer number數值都加上1000
也就是說假設本來OD 這層layer對應到的layer number為2,那這邊就會變成1002

//OUTPUT REPORT
DRC RESULTS DATABASE "top.lvl.db" ASCII
DRC SUMMARY REPORT "top.lvl.rep"
這段就是設定我們report輸出的檔名及位置
database 是可以用RVE 開啟的檔案
summary 是文字內容的報告

DRC MAXIMUM RESULTS ALL
PRECISION        1000
RESOLUTION    1
設定DRC能回報出的結果為最大值
精準度為1000
Defines the layout grid step-size

//LAYER COMPARE
LAYER OD                1001    LAYER MAP           2    DATATYPE    0    1001
LAYER OD_Sec        2001    LAYER MAP    1002    DATATYPE    0    2001
DIFF.OD {@ OD is different from the OD of another GDS
OD XOR OD_Sec
}
rule file內需要定義每層layer對應的layer number及datatype
OD_Sec這行定義的是第二個gds的layer,這邊要注意layer定義的數值不能重複,否則會出錯
DIFF.OD這邊就是我們的rule 名字,下面做OD 與OD_Sec的XOR運算, 如果有不同就會抓錯


按照上面內容做更改就可以寫出LVL的command file了,但如果一行一行慢慢改,可能會改到天荒地老,而且還可能改錯,這時候就需要有寫Shell Script的能力,讓電腦自己完成這些事,下一篇會分享我自己寫的shell script,以及介紹內容。