반응형

 

아래 코드를 실행

함수 받는 인자

mos_info(x값, y값, width, length, finger) 에 따라 원하는 MOS생성

procedure(mos_info(x y width length finger)   ; 인자 5개를 받음
let(()

cv=geGetEditCellView()

;dbCreateRect(cv "pd" list(0.00+x:1.00+y 6.12+x+width:7.80+y+length)) 
dbCreateRect(cv "m0" list(3.66+x+width:1.10+y 6.02+x+width:7.70+y+length))
dbCreateRect(cv "m0" list(0.10+x:1.10+y 2.46+x:7.70+y+length))
dbCreateRect(cv "cd" list(4.34+x+width:3.90+y 5.34+x+width:4.90+y))
dbCreateRect(cv "cd" list(4.34+x+width:2.00+y 5.34+x+width:3.00+y))
dbCreateRect(cv "cd" list(4.34+x+width:3.90+y 5.34+x+width:4.90+y))
dbCreateRect(cv "cd" list(4.34+x+width:5.80+y 5.34+x+width:6.80+y))
dbCreateRect(cv "cd" list(0.78+x:3.90+y 1.78+x:4.90+y))
dbCreateRect(cv "cd" list(0.78+x:2.00+y 1.78+x:3.00+y))
dbCreateRect(cv "cd" list(0.78+x:3.90+y 1.78+x:4.90+y))
dbCreateRect(cv "cd" list(0.78+x:5.80+y 1.78+x:6.80+y))
dbCreateRect(cv "gc" list(2.56+x:0.00+y 3.56+x+width:8.80+y+length))

gc_width=(3.56+x+width)-(2.56+x)
gc_dist=(6.12+x+width)-(2.56+x)
m0_width = (2.46+x)-(0.10+x)
m0_dist = (3.66+x+width)-(0.10+x)
cd_dist = (5.34+x+width)-(4.34+x+width)

; finger가 2개 이상일 때 실행
cnt = 0
if(finger > 1  then
  for(i 1 finger-1
    println(i)
    dbCreateRect(cv "gc" list((2.56+x)+(gc_dist*i):0.00+y (2.56+x)+(gc_dist*i)+gc_width:8.80+y+length))
    dbCreateRect(cv "m0" list((3.66+x+width)+(m0_dist*i):1.10+y (3.66+x+width)+(m0_dist*i)+m0_width:7.70+y+length))
    cnt = i
  ;dbCreateRect(cv "cd" list(5.34+x+width:
  );for
  dbCreateRect(cv "pd" list(0.00+x:1.00+y (3.66+x+width)+(m0_dist*cnt)+m0_width+0.1:7.70+y+length))

);if

)
반응형

결과

반응형
반응형

 

 

 

아래 프로그램을 form.il 으로 저장하고 돌리면,

x_loc=hiCreateFloatField(
	?name 'x_loc			
	?prompt "x_loc:"
	?value 0.0              ; 초기값
)

y_loc=hiCreateFloatField(
	?name 'y_loc
	?prompt "y_loc:"
	?value 0.0
)

width=hiCreateFloatField(
	?name 'width
	?prompt "width:"
	?value 0.0
)

length=hiCreateFloatField(
	?name 'length
	?prompt "length:"
	?value 0.0
)

hiCreateAppForm(
	?name 'form_menu                               ;hiDisplayForm(함수명)에 사용될 이름
	?formTitle "make mos menu"                     ;창 이름
	?callback "mos_create()"                       ;불러오는 함수이름
	?fields list(
                list(x_loc 10:0 150:50 100)        ; 이름, 위치, 너비
                list(y_loc 10:30 160:50 100)
                list(width 10:60 170:50 100)
                list(length 10:90 180:50 100)
                )
)

 

결과로 아래와 같은 창이 만들어진다.

1. 위 함수를 로드한다.

    1-1. 위코드를 복사해서 인터프리터에 붙여넣기

실행하면 아래와 같이 뜬다

 

2. hiDisplayForm('form_menu)를 인터프리터 창에 입력하면 직접만든 window가 실행됨.

 

 

반응형
반응형

아래와 같은 Layer정보를 가진 MOS가 있는데, 이 모든 Shape정보를 빼서 다른 재사용이 가능한 다른 SKILL파일을 만든다.

Virtusoso는 해당 화면을 하이라이트 시키면 아래와 인터프리터도 해당 창에 대해서 반응한다.

고로 위 MOS창을 하이라이트 시키고 아래 db id를 뽑으면 위 MOS에 관한 db id가 나온다.

위 MOS가 갖고 있는 shape을 모두 추출하여 새로운 .il 파일로 저장하는 코드

 

procedure(mos_info()
    let(()
        out_file = outfile("myReport.il" "w")            ; result.il 파일 쓰기모드 열기
        cv=geGetEditCellView()                         ; db id생성
        fprintf(out_file "procedure(mos_info()\n")	
        fprintf(out_file "let(()\n")
        fprintf(out_file "cv=geGetEditCellView()\n")

        tot_shape=cv~>shapes                            ; shapes의 db를 tot_shape에 넣기
        foreach(one_shape tot_shape                     ; foreach로 하나씩 접근
            layer_box=one_shape~>bBox                   ; 좌표데이터 뽑기
            layer_name=one_shape~>layerName             ; layer이름 데이터 뽑기
            x1_pos=xCoord(xCoord(layer_box))            ; (x1, y1), (x2, y2) 각 값 추출
            x2_pos=yCoord(xCoord(layer_box))
            y1_pos=xCoord(yCoord(layer_box))
            y2_pos=yCoord(yCoord(layer_box))
            fprintf(out_file "dbCreateRect(cv \"%s\" list(%.2f:%.2f %.2f:%.2f)) \n" layer_name x1_pos x2_pos y1_pos y2_pos)
            ;printf("dbCreateRect(cv %s list(%.2f:%.2f %.2f:%.2f)) \n" layer_name x1_pos x2_pos y1_pos y2_pos) ;디버깅용
        );foreach
    );let
fprintf(out_file ")\n")
fprintf(out_file ")\n")
close(out_file)                    ; 반드시 open한 파일은 close하기
);procedure

결과로 아래와 같은 .il 파일이 만들어진다.

이 myReport.il SKILL파일을 빈 layout에 생성해본다.

1. Library Manager

2.

3. 새 라이브러리를 만들고 새 layout 열기

4.

5. load("myReport.il")을 하여 스킬파일을 로드함.

6. 함수명 mos_info를 쳐서 실행

반응형
반응형

아래 MOS의 DB정보 빼내기.

 

    _itemsperline=1  ; 한줄에 표시할 데이터 갯수정의

    cv~>?              ; name 정보

    cv~>??             ; name 및 하위 DB정보 (구분이 힘들어서 파랑색으로 표시)

ex) shape에 관한 정보만 추출.

 

procedure(mos_info()

    let( ()

    cv=geGetEditCellView()

procedure(mos_info()
    let( ()
    cv=geGetEditCellView()
    
    work_lib=cv~>libName		; 라이브러리 이름 불러오기
    cell_name=cv~>cellName		; Cell의 이름 불러오기
    printf("Library name is %s cellname is %s" work_lib cell_name)
    
    tot_shape=cv~>shapes			; foreach에 쓰기 위해 shapes의 dbid를 tot_shape에 대입
    foreach(one_shape tot_shape		; tot_shape의 db를 풀어서 one_shape으로 하나씩 db를 대입
        layer_box=one_shape~>bBox	; one_shape db자료 중 좌표(bBox)값 추출
        layer_name=one_shape~>layerName		; one_shape db자료 중 layer이름을 추출
        printf("%s : %L\n" layer_name layer_box)

    );foreach   

    );let
);procedure

 

 

결과

반응형
반응형

기본적인 Cadence IC SKILL code 포맷. 이 형식으로 코딩을 진행한다.

확장명은 .il 을 사용한다.    예) name.il 

 

func_name : 함수이름 사용자 정의

cv=geGetEditCellView  : Cell DB 아이디를 받음

procedure( func_name( )
	let( ( )
		cv=geGetEditCellView()	; Cell의 DB를 대입.
        
         (DB를 이용해 함수 작성)
        
	);let
);procedure

아래와 같이 DB값을 받음

반응형
1

+ Recent posts