Programming 언어/Skill

[SKILL 강좌] calculate_area : 1. gui 설정과 reload 함수

호드맨 2017. 1. 11. 12:40

예전에 작성해서 잘 써먹은 코드이지만, virtuoso LAYOUT EAD (혹은 EXL)의 기능으로 비슷한 기능이 있는 것 같다. 하지만 라이선스의 제약도 있고, 좀 더 간편하게 이용할 수 있어서 아래 코드는 남겨 둔다. 다만 사용하기 위해 수정이 많이 필요할 것 같다.

공정이 점점 작아지고, 설계 주파수 대역도 점점 올라가면서 high speed routing 구간의 matching issue 가 있었다. Full custom layout 을 진행하면서 이러한 경우 mismatch 가 없어야 하겠지만, 공정상의 issue 도 있고, human error의 여부도 있을 수 있다. 물론 golden simulation 은 parasitic extraction 하여 post simulation을 확인하는 것이지만, skill을 이용해서 좀 더 빠르게 확인할 수 있는 flow를 만들었다. 아직 이 곧 블로그로 옮기진 않았지만 예전 강좌들이랑 다른 방식으로 긴 코드를 차근차근 만들어가면서 완성된 program을 만드는 방식으로 강좌를 진행해보겠다. 공부하는 방식이 다 다른 것처럼 강좌도 이리저리 해봐야 늘겠죠? 처음 글인 만큼 전체적인 program의 concept을 잡고, 필요한 변수 등을 생각해서 gui로 만드는 것을 해보겠습니다. 많이 접해보지 않으신 분들은 하나하나 따라 해도 되고, 전체적인 흐름을 보고 따라 해 보셔도 될 것 같습니다. 전체적인 구상 및 코딩 후에 다시 1단계를 시작하는 것이지만 실제 코딩 시에는 어느 정도 작성 후에 여러 옵션이 추가되는 경우가 많습니다. 시작이 반인건 맞지만 첫 단추를 잘 끼워야 하는 것도 맞습니다. 좀 두서없는 서론이네요. 나중에 고치더라도 일단 시작합니다. 회사에서 이미지 업로드는 되지 않기에 이번 강좌에서 (부터는) Text 로만 진행합니다. (좌절) 상당히 장기 레이스가 될 수도 있겠네요.

 

Step 1-1) 무엇이 필요할까?

RC extraction 하는 것이 아니므로 CDL netlist 는 필요없이 layout DB 만 존재하면 됨
원하는 특정 net, 구간만 필요하며, 해당 net 에 대한 information 이 필요함
verification 을 진행하기 위한 layer map 정보가 필요함.
(다는 아니어도 필요한 metal / Via 의 layerNum, datatypeNum)
Step 1-2) 어떠한 변수들?

cv = deGetCellView()   ; 어디서나 쓰이는 current View 에 대한 변수
m1list = list( list( 4 0 ) list( 4 2 ) list( 4 250 ) list( 4 251 ))
     ; m1 에 대한 layerNum, datatypeNum list (Top metal 까지 변수로 가져야 함)
v1list = list( list( 13 0 ))
     ; v1 에 대한 layerNum, datatypeNum list  (Top Via 까지 변수로 가져야 함)
net_file   ; 원하는 특정 net name 을 포함한 file path

그리고 코딩 중에도 귀찮은 load 나 gui 창 open 하는 것에 대한 procedure를 준비 해 둡시다. 막일을 줄이기 위해 짜는 건데 짜면서도 막일을 하면 안 되겠죠?

 

cal_cellName_SF = hiCreateStringField(
              ?name 'cal_cellName_SF
              ?prompt "Cell Name"
              ?defValue ""
              ?callback ""
) ;end of cal_cellName_SF -- (1)

cal_Label = hiCreateLabel(
              ?name 'cal_Label
              ?labelText "skill programming!\nhttp://hodman.tistory.com"
) ;end of cal_Label -- (2)

calculatorID = hiCreateAppForm(
              ?name 'calculator
              ?buttonLayout 'Empty
              ?formTitle "Layer Area Calculator"
              ?fields list( list(cal_cellName_SF  040:020 280:030 70)
                            list(cal_Label        040:070 280:030 14));end of list
              ?initialSize list(400 120)
              ?minSize list(400 120)
) ;end of calculatorID -- (3)
 
procedure(calculator()
   prog(()
      hiDisplayForm(calculator '(100 100))
   );end of prog
);end of procedure calculator() -- (4) 

procedure(reload()
   prog(()
      if(hiIsFormDisplayed(calculatorID) then
         hiFormCancel(calculator)
      ); end of if -- (5)
      
      hiRegTimer("load(\"/user/hodman/calculator.il\")" 1) ; -- (6)

      hiRegTimer("calculator()" 10) ; -- (7)

   );end of prog
);end of procedure reload()

주석
(1) : hiCreateStringField 함수로 현재 cell Name을 저장 및 Display 할 Field 에 관한 설정입니다.
(2) : hiCreateLabel 함수로 Label (그냥 텍스트) 입니다. 깨알같은 블로그 홍보
(3) : 1,2 에서 만든 항목들을 배치할 AppForm 설정 부분입니다. field 항목에서 각각의 좌표를 설정해 주었습니다.
(4) : calculator 함수로 설정한 AppForm 을 Display 하는 부분입니다.
(5) : calculatorID 창이 떠 있을 경우 창을 닫는다. 창이 떠 있을 경우 해당 창에 대한 코드변경이 반영되지 않는다.
(6) : hiRegTimer 함수는 두번째 인자 * 0.1 초 뒤에 첫번째 인자를 실행하게 됩니다. 5번에 의해 창이 닫혔을 경우 load가 바로 실행되어 제대로 반영 안되는걸 방지하고자 0.1초 delay 를 주어 실행했습니다.
(7) : hiRegTimer 함수에 의해 calculator() 라는 함수가 1초 뒤에 실행된다.

처음 글부터 포기하시는 분들이 생기려나.. 처음 코드인데 어쩌다 보니 길어졌네요. hiCreateAppForm, hiCreateStringField 등 Field 관련 함수들은 다음에 다시 다뤄보도록 합시다. 이해 안 되면 따라서 짜 놓고 User manual 확인하시면서 천천히 따라와 보시면 됩니다. 복붙 하기 쉽게 주석은 아래로 몰아 놨습니다. 

아무튼 동작은 CIW 창에 해당 skill file을 load 하고 나서, calculator라고 입력하거나 reload를 입력하거나 하시면 됩니다. 결과창을 캡처하진 못하지만 조그마한 창이 Display 되는 것을 보실 수 있을 겁니다. 첫 강좌 글부터 아웃풋이 눈에 보여서 뿌듯하긴 하네요. 다음 강좌 글에서 실제 calculator의 함수를 짜기 전에 AppForm의 배치 및 각 Field 들을 추가하도록 하겠습니다.