Programming 언어/Skill

[SKILL 강좌] change_bracket : label의 '<>' 를 '[]' 로

호드맨 2017. 2. 1. 23:34

가끔 TOP 작업을 하다 보면 PnR block은 bus를 "[ ]"를 사용하고 schematic에서는 "< >"를 사용해서 verification 할 때 문제가 될 때가 있습니다. netlist에서 vi로 바꿔주는 경우도 있고 다들 각각의 방법으로 해결하실 텐데 앞서 배운 정규표현식을 통해 간단히 변경 가능합니다.


AAA <3:0>의 4개의 label을 그려놓았습니다.

bracket < >

operator를 설명하면서 같이 언급한 deGetCellView와 정규표현식 그리고 foreach 문을 이용해 AAA <3:0> -> AAA [3:0]으로 바꿔봅시다.

foreach(shape deGetCellView()->shapes
   label = shape->theLabel
   rexCompile("<")
   label = rexReplace(label "[" 0)
   rexCompile(">")
   label = rexReplace(label "]" 0)
   shape->theLabel = label
)
(db:0x11fe654b db:0x11fe654d db:0x11fe654e db:0x11fe654f)

설명을 하자면 foreach 문에서 deGetCellView를 통해 현재 cellView를 가져오고 그 cellView의 shapes에 들어있는 변수들을 각각 shape라고 하여 안쪽에 있는 명령들을 실행하는 것입니다. theLabel (label text 가 들어있는 값)을 label 이란 변수에 넣고 정규표현식을 통해 "<"는 "["로 ">"는 "]"로 변경하여 원래 있던 theLabel에 다시 입력하게 됩니다.

bracket [ ] 로 변경

반대로 "AAA [3:0]"을 "AAA <3:0>"으로 바꾸기 위한 코드를 바꿔보죠.

foreach(shape deGetCellView()->shapes
   label = shape->theLabel
   rexCompile("\\[")
   label = rexReplace(label "<" 0)
   rexCompile("\\]")
   label = rexReplace(label ">" 0)
   shape->theLabel = label
)

앞의 코드와 다를 게 없지만 "["와 "]" 경우에 정규표현식에서 사용되기 때문에 문자 "["를 받기 위해선 "\\["와 같이 사용해야 합니다. 지금에야 버스로 꼴랑 label 4개지만 TOP level에서 수백 개의 label을 q 눌러서 바꾸는 건.. 하지 말아 주세요~ 일찍 퇴근해야지요.

너무 예제만 하는 것 같아서 배웠던 걸로 함수 한 줄 짜 봤습니다. 이미 필요한 곳을 찾아서 코드 짜실 분들도 있지만 잘 이해가 안 되시면 앞서 올렸던 글들 천천히 보시면 이해할 수 있을 겁니다. 이렇게 짜 놓으면 매번 치기 귀찮으니 Bindkey에 등록하실 분도 있고 procedure 만드시는 분들도 있겠지요! 다음에는 procedure에 관해서 다뤄보겠습니다.