SKILL programming

Pcell 만들기 쉬워요! - pcDefinePCell 함수 사용해 보기

쥴리정 2025. 5. 18. 22:40

레이아웃 엔지니어들이 SKILL을 배우고 싶어 하는 주요 이유 중의 하나는 PCell을 만들고 싶어서일 것이다.

레이아웃 채용 공고를 살펴보더라도 SKILL, PCell 작성 가능하다면 plus 조건이라는 항목이 많이 보인다.

하지만 이전 글에서 언급했다시피 SKILL을 혼자 배우는 것은 좀 힘이 드는 일이다.

기본적으로 PCell을 잘 만들기 위해서는 Layout에 대한 이해, 어느 정도의 coding 실력, SKILL 관련 document를 보고 이해할 수 있는 영어 실력,  SKILL code를 짜 보고 테스트 해 볼 수 있을 만한 적당한 여유시간도 함께 필요하다.

 

하지만 누군가가 잘 짜 놓은 Pcell 용 SKILL file이 있다면, 간단한 PCell 정도는 스스로 만들어 보는 것이 전혀 어렵지 않다.

PCell 이라는 것을 짜 보고 싶어 하는 이들을 위해 이번 포스팅에서는 간단히 pcDefinePCell 함수를 이용하여 PCell을 만드는 방법을 설명해 보기로 한다.

 

pcDefinePCell 은 PCell을 만들어 주는 함수이다.

구조는 아래와 같다.


pcDefinePCell(                               ; pcDefinePCell 시작

    list(ddGetObj("TEST_library") "pcell_test1" "layout")          ; 만들고자 하는 pcell - library, cell, view 지정

list(                                                  ;  여기에 parameter list를 기술해 줍니다.

    )

 

let((    )                                            ;괄호 안해 pcDefinePCell 함수 내부에서만 사용될 local 변수 이름들을 나열

                                                        ; 여기에 pcell 생성에 필요한 code 작성하면 됨

)                                                       ; let 마침

)                                                       ; pcDefinePCell 마침


자, 쓰고 보니 정말 간단하다!

좀 더 자세한 설명을 하자면,

1)  ddGetObj  함수 : 라이브러리·셀·같은 기존 디자인 데이터(DD) 객체의 핸들을 가져와 SKILL에서 조회·조작할 있게 하는 함수. 위의 예제에서는 TEST_library의 pcell_test1 cell에 layout 의 viewname으로 pcell이 생성된다. (DB가 있으면 overwright 되고, 없으면 새롭게 생성됨) 위의 예제에서 사용한  그대로 복사해서 library, cell, view name만 바꾸어 사용하자.

2) parameter list 

각각의 parameter는 parameter_name, type, default value 의 list 형식으로 사용된다.

parameter의 type으로는 integer, float, string, boolean, list 다섯가지 type을 대부분 사용한다. 

사용 예를 보면,

 

list(

("multi_number" "int" 4)

("p_tr_width" "float" 0.3)

("implant_layer" "string" "PPLUS")

("drawing_inplant" "boolean" t)

)

 

이런 식으로 사용한다.

 

3) local 변수 : pcDefinePCell 함수도 함수이기 때문에  이 함수 안에서 사용하는 모든 변수 이름들은 괄호 안에 넣어줌으로써 local 함수임을 알려 주어야 한다. 물론 괄호 안에 적어 주지 않아도 pcell이 만들어지기는 하겠지만, virtuoso 내부 SKILL code나 PDK를 위한 SKILL code, 다른 사람이 짜 놓은 SKILL code등에서 사용된 global 변수와 같은 이름의 변수가 사용되었다면 그 변수 이름은 충돌이 나면서 virtuoso의 일부 함수들이 오류가 날 수 있으니 이런 사태을 방지하기 위해 괄호 안에 입력해 주는 것이 안전하겠다.

 

4) Body (code 입력 란) :

let(  ) 의 괄호 안에 pcell 생성에 필요한 code를 입력해 준다. 

물론 coding을 위해 기본적인 변수 지정, 변수 type, 반복문, 제어문, 숫자 연산 등의 기본 SKILL 구문은 알고 있어야겠다.

PCell 생성 시 자주 사용되는 함수는 다음에 소개할 예정


그럼 이번에는 사각형을 그릴 수 있는 dbCreateRect 함수를 이용하여 PCell 만드는 예를 보자.

이전 회사에서부터 필자가 후배들에게 항상 해 주는 말이 있는데, rectangle만 그릴 수 있으면 어지간한 PCell을 다 만들 수 있다는 것. 알다시피 대부분의 레이아웃은 네모 네모로만 구성되어 있다.

실제로 얼마 전 우리 회사의 다른 업무 하시는 분이 레이아웃 창을 보고 "네모의 세상"이라며 "온통 네모밖에 없어!" 라며 놀란 적이 있다.

 

네모의 기본인 width, length를 parameter로 하여 하나의 rectangle을 만드는 pcell 예를 보자.

 

pcDefinePCell(                            

    list(ddGetObj("TEST_library") "pcell_rectangle" "layout")       

list( 

      (width "float" 0.2)

      (length "float"  0.5)                                      

    )

 

let((    )                                        

rect = dbCreateRect(pcCellView "M1" list( 0:0  width:length ))                                                      

)                                                  

)       

 

이렇게 하면 leftbottom (0:0), righttop (0.2:0.5) 좌표의 rectangle이 M1 drawing layer로 생성된다.

drawing 대신 다른 purpose 로 생성되게 하고 싶으면 (예를 들어 pin purpose)  layer-purpose list로 사용하면 됨.

 

rect = abCreateRect(pcCellView  list("M1" "pin") list(0:0 width:length))

 

 

위의 예에서 pcCellView 는 pcDefinePCell 함수 내에서 자동으로 전달되는 pcell view를 뜻하는 cellview handle로서, 위의 예에서는 TEST_library의 pcell_ rectangle layout view가 되겠다.

보통의 SKILL coding시에 cv(current_view)를 지정하기 위해 ddGetObj 함수 등을 별도로 사용 할 필요없이 pcDefinePCell 내부에서 패턴을 생성할 모든 함수에서는  간단히 pcCellView 라고 입력하면 되니 아주 편리하다.

이번에는 drawing layer를 변수로 지정해서 그려보자.

 

pcDefinePCell(                            

    list(ddGetObj("TEST_library") "pcell_rectangle" "layout")       

list( 

      (width "float" 0.2)

      (length "float"  0.5)                                      

    )

 

let((  rect_layer  )      

rect_layer = "M1"                                  

rect = dbCreateRect(pcCellView  rect_layer  list( 0:0  width:length ))                                                      

)                                                  

)    

 

이렇게 layer 이름을 변수로define 해 놓으면 나중에 code를 수정할 때나 layer 이름이 달라지는 다른 공정에 대해 code를 재활용 할 때 아주 편리해진다.

 

그렇다면 내친 김에 이번에는 많은 이들이 만들고 싶어하는 transistor pcell을 만들어보자.

간단히 설명하기 위해 아래의 그림과 같이 Imp_overlap, Poly_ext, Poly_space, Act_overlap 이라는 네 개의 design rule을 변수로 지정하고 poly, active, inplant layer 이름 역시 변수로 지정하도록 한다.

transistor width, length, finger 및 implant layer drawing 여부는 parameter로 받기로 하자.

pcDefinePCell(                            

    list(ddGetObj("TEST_library") "pcell_transistor" "layout")       

list( 

      (tr_width "float" 1.0)

      (tr_length "float"  0.3) 

      (finger "int" 1)

      (drawing_implant "boolean" nil)                                    

    )

 

let(( poly_layer active_layer imp_layer Poly_ext Imp_overlap Act_overlap Poly_space active_X_RT active_Y_RT poly_BOT poly_TOP imp_X_LB imp_X_RT imp_Y_LB imp_Y_RT  )      

 

poly_layer = "PO"

active_layer = "ACT"

imp_layer = "PPLUS"

Poly_ext = 0.1

Imp_overlap = 0.2

Act_overlap = 0.7

Poly_space = 0.7

 

; dbCreateRect 함수에서 계산식을 모두 넣으면 불편하니 layer들의 좌표를 미리 계산하여 변수로 define

active_X_RT = 2*Act_overlap + finger*tr_length

active_Y_RT = tr_width

poly_BOT = 0 - Poly_ext

poly_TOP =  tr_width + Poly_ext

imp_X_LB = 0 - Imp_overlap

imp_X_RT =  active_X_RT + Imp_overlap

imp_Y_LB = 0 - Imp_overlap

imp_Y_RT = tr_width + Imp_overlap

 

; active drawing                                  

  dbCreateRect(pcCellView  active_layer  list( 0:0  active_X_RT:active_Y_RT )) 

 

; poly drawing

  for(i 0 finger

  dbCreateRect(pcCellView  poly_layer 

          list( (Act_overlap + i*(tr_length+Poly_space)):poly_BOT 

                  (Act_overlap + i*(tr_length+Poly_space) + tr_length) :poly_TOP ))

   )

 

; implant drawing

  when(drawing_implant

  dbCreateRect(pcCellView  imp_layer  list( imp_X_LB:imp_Y_LB  imp_X_RT:imp_Y_RT )) 

  )  

              

)             ;let                                     

)             ;pcDefinePCell

 

 위와 같은 식으로 code를 짜면 된다. 

이렇게 짠 pcell code를 file로 저장한 후 virtuoso command input 창에서 file을 load 하면  log 창에 에러가 있으면 표시가 되니 code를 수정하여 다시 load 하는 식으로 debugging 하면 되는 것은 따로 말하지 않아도 되는 걸로....

 

음.... 회사에서는 블로그 로그인을 하지 않기 때문에 위에서 짜 놓은 code가 정확한 지는 잘 모르겠다.

전체 flow 위주로 이해하기를....

 

다음 포스팅은 PCell 만들기에 수반되는 CDF file에 대해 설명하기로 한다.

'SKILL programming' 카테고리의 다른 글

SKILL programming 시작해보기  (2) 2025.04.27