Some of my Published Papers

주로 하는 일이 개발, 그 중에서도 ASIC 개발이다보니 논문이 모두 구현(implemetation)에 관한 것입니다.
Due to the nature of my works, they are all papers on implementations

Some of my patents

  • 11 Korean patents(mostly in ATM communication)
  • "STM-based ATM cell physical layer processing circuit", US patent 5978377, Nov.1999
  • "Direct memory read and cell transmission apparatus for ATM cell segmentation system", US patent 6275504, Aug. 14. 2001

  • 자유롭게 쓴 글 몇 개

    저희 연구소 정지성씨가 제의한 것도 있지만, 시간이 되는 대로, 생각나는 대로 혹시 다른 사람들에게 도움이 될 만한 글들을 써서 올려 두려고 합니다. 제가 쓴 conference 논문들도 모두 올려 놓고 싶지만 불행히도 외국에 파견나가 있는 사이 제 컴퓨터에 virus가 침입해서 논문 파일들이 모두 지워져 버렸더군요. 흑흑!.. 그래도 가끔씩 찾아와 주세요. 일단 최근에 연구소 게시판에 올렸던 글을 여기 올립니다.

    잘 쓰면 편리한 UNIX 명령어 3개


    누가 간단하게 소개해서 게시판에 올려 주면 좋겠다고 해서..
    UNIX에서 알아두면 편리한 명령어들로는
    1. sed (stream editor)
    만약 어떤 file에서 모든 "lion"이라는 말을 "cat"으로 바꾸어 tmp라는 file로 만들고 싶으면
    > sed -e '1,$s/lion/cat/g' filename > tmp
    하면 됩니다. 직접 열지 않아도 되죠.
    그럼 "lion"이라는 말이 들어간 줄은 모두 지워서 tmp라는 file로 만들고 싶으면
    > sed -e '/lion/D' filename > tmp
    하면 됩니다.
    file들을 지정할 때
    */*.list (모든 directory 바로 밑에 있는 *.list)
    와 같은 것도 됩니다. 예를 들어
    > rm */*.obj
    같이 말입니다.

    2. foreach
    예를 모든 *.vhd file을 열어서 lion을 tiger로 바꾸고 싶으면
    foreach i (*.vhd)
    sed -e '1,$s/lion/tiger/g' $i
    end
    이렇게 하면 되지요.
    또는 모든 *.vhd file을 열어서 lion을 tiger로 바꾼 뒤에 파일 확장자를 .v로 바꾸고 싶으면
    foreach i (*.vhd)
    sed -e '1,$s/lion/tiger/g' $i > tmp
    mv tmp `cat $i | sed -e '1,$s/vhd/v/g'`
    end
    이렇게 하면 됩니다. 위에서 ` `는 어떤 명령의 출력을 뜻하기 때문에 file이름을 cat한 후에 vhd를 v로 바꾼 새로운 이름을 만들 때 사용한 것입니다.
    foreach는 find와 같이 사용하면 편리할 때가 많습니다.
    예를 들어 현재 directory의 밑에 위치하는 모든 .vhd file에 대해서 line수를 알고 싶으면
    foreach i (`find . -name \*.vhd -print`)
    wc -l $i
    end
    이렇게 하면 되지요.

    3. awk ( '오크'로 발음)
    Text file의 line들을 읽을 때마다 pattern을 검사해서 어떤 action을 할 수 있습니다. 컬럼 단위로 어떤 일을 하기도 편합니다.
    예를 들어 lion이라는 패턴이 나오는 줄마다 세 번째 위치하는 말을 꺼내어 뽑고 싶다면
    awk '/lion/{print $3}' filename
    하면 되는 것입니다. 만약 summary라는 말이 나오는 줄마다 세 번째 위치한 값만 모두 합해서 마지막에 프린트하고 싶으면
    awk '/summary/{sum = sum + $3}; END{print sum}' filename
    이렇게 하면 되는 것입니다. 특정 정보를 뽑아 연산을 할 수도 있고 내부에 변수를 두어 사용할 수도 있기 때문에 잘 쓰면 별짓을 다(?) 할 수 있습니다. 자세한 내용은 manual이나 internet을 참조하세요. 보통 awk -f aa.awk filename 와 같이 awk script를 만들어 사용합니다.
    쉬운 예를 몇개만 추가해 보죠(2001.8.30)
    예를 들어 첫번째 컬럼과 세번째 컬럼만 print하고 싶다면
    awk '{print $1 $3}' file > tmp
    이렇게 하면 되고요
    큰 verilog netlist에서 assign abc = abc; 와 같이 self assignment가 있는 부분만 comment처리하고 싶으면(줄 시작에 //를 삽입)
    /assign/ {if ($2 ";" == $4 ) print "//" $0; else print $0}
    !/assign/{print $0}
    이렇게 하면 됩니다.
    또 합성 script에서 compile이라는 명령어가 있으면 그 앞에 예를 들어 set_max_transition = 1.2 라는 줄을 삽입하고 싶으면
    /compile/{printf "set_max_transition\n"; printf $0}
    !/compile/{print}
    이렇게 하면 됩니다.
    만약에 여러개의 *.scr 파일들에 대해 위와 같은 처리를 하고 싶을 때 위의 script를 tt.awk에 써 두었다면
    foreach i (*.scr)
    awk -f tt.awk $i >! tmp
    \mv tmp $i
    end
    이렇게 하면 되지요. 만약 특정 file들에 대해 하고 싶고 그 file들의 명단이 list라는 file에 있으면
    foreach i (`cat list`)
    ..마찬가지로 이렇게 하면 됩니다.

    잘 쓰면 편리한 vi 명령어


    다음에는 vi에 대해서 알아두면 막강한 기능들에 대해 간단히 소개해 보죠.
    많은 사람들은 vi가 아주 단순하고 초보적인 editor로 알고 있는데 사실은 가장 막강한 editor입니다. 만약 text editing 대회가 있다면 vi를 사용하는 고수가 우승하지 않을까..
    마우스 움직이는 것이 얼마나 시간이 많이 갑니까, 또 window에 커서를 위치하고 type-in하는 것도 시간이 많이 걸리고요. vi에서는 그냥 키보드에서 모든 것을 끝냅니다.
    여기서는 기본적인 것은(h,j,k,l,p,P,a,A,b,u,w,r,R,d,D,dd,J,yy ...등 vi에는 기능이 없는 키를 찾기가 힘들 정도입니다. 물론 모두 command 모드에서 동작) 설명하지 않고, 사람들이 몰라서 잘 쓰지 않는 편리한 기능을 소개하겠습니다.

    1. Mark
    명령어는 m 입니다. 특정 line을 a라고 mark하고 싶으면 그냥 ma하시면 됩니다.
    나중에 a로 가고 싶으면 'a 하면 되고요, a위치에서 현재 줄까지 lion을 tiger로 바꾸고 싶으면
    :'a,.s/lion/tiger/g'
    하면 됩니다. 또 enter도 표시할 수 있습니다. Ctrl V 다음에 enter를 치면 ^M으로 표시되면서 enter가 됩니다. 그러니까 모든 줄에서 comma를 찾아서 '=>'로 바꾸고 줄을 바꾸고 싶으면
    $s/,/=> ^M/g
    하면 되지요. 위에서 ^M을 찍기 위해서 실제로는 Ctrl+V한 후에 enter키를 친 것입니다.
    또는 어느 구간 a에서 b까지 (물론 marking한 후에) line의 시작에다가 tab을 두고 entry라는 말을 넣고 싶으면
    : 'a,'b s/^/ entry/g'
    라고 하면 되지요.(entry 앞에 tab을 두었습니다.) 맨 뒤에 있는 g 옵션을 빼면 한 줄에 대해서 한 번만 한다는 뜻입니다.
    또 a와 b사이를 몽땅 copy해서 다른 위치에 가서 place하고 싶으면
    : 'a,'b y
    한 후에 해당 위치에 가서 p 하면 되는 것입니다. 힘들게 마우스로 스크롤할 필요가 없습니다. a에서 b까지 지우려면 'a,'b d 하면 되겠죠?

    2. search & replace
    위에도 나왔지만 ^는 줄의 처음, $는 줄의 마지막을 뜻하므로 search에서 사용할 수 있습니다. 그러니까 줄의 시작에 있는 lion만 찾아서 tiger로 바꾸고 싶으면
    :s/^lion/tiger
    하면 되고 a 표시한 곳부터 현재 line까지 aa를 bb로 바꾸고 싶으면 :'a,. s/aa/bb/g 하면 됩니다.
    진정한 vi의 power는 regular expression을 쓸 때 나타납니다. (Lenarning vi editor라는 책에 잘 나옵니다.)
    예를 들어 모든 줄에서 abc라는 pattern부터 줄 끝까지를 tiger로 고치고 싶으면
    :%s/abc.*/tiger
    하면 되고요,
    abc : out std_logic_vector(7 downto 0);
    go_gen : in std_logic;
    ...
    과 같은 부분을
    abc => abc,
    go_gen => go_gen,
    ...
    로 바꾸고 싶으면
    :'a,.s/ \(.*\) :.*/\1 => \1,
    로 하면 됩니다.
    또 tab이나 space가 여러개 있는 것을 하나의 tab으로 표시하고 싶으면
    :s/[ ][ ]*/ /g
    로 하면 됩니다. 여기서 bracket안에는 tab과 space를 하나씩 적었습니다.
    g 명령도 편리합니다. 예를 들어 school이라는 말이 나오는 줄마다 middle을 high로 바꾸고 싶으면
    :%g/shcool/s/middle/high/g
    로 하면 됩니다.
    또 dog라는 말이 나오는 줄을 모두 지우고 싶으면
    :%g/dog/d
    하면 되지요.
    모든 줄을 대문자로 바꾸고 싶으면
    :%s/\(.*\)/\U\1
    로 하면 됩니다. 예가 너무 많아서 다 들 수가 없습니다.

    3. Macro 지정
    이것은 반복되는 key 입력을 하나의 macro로 지정할 수 있는 기능입니다. 예를 들어 어느 file에서 몇 줄에 걸쳐 aa,bb,cc,dd,ee,..이런 줄이 있는데 이것을
    aa => aa,
    bb => bb,
    cc => cc,
    라고 바꾸고 싶다고 합시다. 그러면 먼저
    $s/,/ => ^M/g
    한 후에
    /[a-z]
    로 해서 찾기를 해 둔 뒤 (알파벳 소문자를 찾는 것입니다.) 나중에 n (new:계속찾기)를 사용하기 위해 미리 수작(?)을 부리는 것임.
    map t yw$pn
    이라고 하면 (word를 yank해서 줄 끝으로 간 후에 yank한 word를 place하고, 다음 alphabet pattern을 찾아 다음 위치로 간다.) 커서를 aa의 시작위치에 두고 그냥 ttttt... 이렇게 하면 t를 한번 칠 때마다 한 줄씩 처리됩니다. 일일이 copy-이동-paste-이동 할 필요가 없지요.

    10000000000
    01000000000
    00100000000
    00010000000
    뭐 이런 패턴을 만든다고 해도
    00000000000을 만들어 yank해서 여러 줄을 만든 후에
    map t r1jl 해서 (1로 replace한 후에 밑으로 한 칸, 오른쪽으로 한 칸) 정의하고 그냥 tttt..하면 자동으로 바뀌는 것입니다.
    또 어떤 pattern을 찾은 후에 그 줄 뒤까지 모두 지우고 싶으면 먼저 찾기를 해 둔 후에
    map T nd$
    이렇게 하면 되겠지요?

    3. 그외
    또 line 255로 갈 때도 그냥 255G 하면 되고요, tab의 크기를 조정할 때도 set tabstop=4와 같이 해서 tab의 간격을 조절하기도 합니다. 찾기를 할 때도 case insensitive하게 하고 싶으면 set ic하면 되고요.
    이런 모든 setting은 home directory의 .exrc에서 설정할 수도 있습니다.

    그 외에도 좋은 기능이 많은 것 같은데 생각이 나지 않는군요.