fc2ブログ

Tcl基礎文法最速マスター

流行っているようなので。しかしTclは流行っていないようです。
せめてEDAツールを使う人用に。
Tk?なにそれおいしいの?



参考サイト
Tcl Developer Site
8.4.1マニュアル 目次
もっとTcl/Tk

参考資料
Tcl/Tkプログラミング入門



Tclの文法一覧です。
他の言語をある程度知っている人はこれを読めばTclの基礎をマスターして
Tclを書くことができるようになっています。
簡易リファレンスとしても利用できます。

■ 1.基礎


1.1 インタラクティブ環境
  インタラクティブ環境はtclshコマンドでシェル風REPLが起動します。

$ tclsh
% puts "Hello tclsh"
Hello tclsh
% exit


1.2 puts文
  puts文です。自動的に末尾に改行が付加されます。
  改行しないときは -nonewline をオプションに付けます

# Hello World
puts "Hello World!"

# 改行なし
puts -nonewline "Hello World!"


1.3 コメント文
  コメント文です。Perlと違い、スペースを含め行頭が#でないとエラーとなります。
  途中から#を使ってコメントしたい場合は、; で文を区切ります。

# コメント
puts "Hello World!" # こんにちは世界 <- これはエラー
puts "Hello World!" ; # こんにちは世界 <- これはOK


1.4 変数の宣言
  変数はsetコマンドで設定します。unsetコマンドで削除です。
  setコマンドで設定した変数は変数名の前に$付けて参照します。

# 変数の設定
set hoge 777
puts $hoge
  -> 777
# 変数の削除
unset hoge
puts $hoge
  -> can't read "hoge": no such variable


1.5 スクリプトの実行
  スクリプトの実行です。

tclsh script.tcl

  出力結果をファイルに書き出すにはリダイレクトを使います。

tclsh script.tcl > out.txt


■ 2.数値


2.1 数値の表現
  整数、小数、指数が使用できます。

set num 123
set num 0.1
set num 1.1e+10


2.2 四則演算
  演算はexprコマンドを使います。

expr 1 + 1    -> 2
expr 1 - 1    -> 0
expr 1 * 2    -> 2
expr 1 / 2    -> 0
expr 1.0 / 2  -> 0.5
expr 1 % 2    -> 1


2.3 インクリメントとデクリメント
インクリメントとデクリメントはincrコマンドを使います。

#インクリメント
incr i 1
#デクリメント
incr i -1



■ 3.文字列


3.1 数値の表現
  文字列はシングルクォートかダブルクォートで囲みます。ダブルクォートの中では\t(タブ)や\n(改行)などの特殊文字を利用することができます。またダブルクォートで囲まれた文字列の中では変数展開することができます。

set str1 = 'abc';
set str2 = 'def';
set str3 = 'a\tbc\n';
# 変数展開(結果は abc def)
set str4 = "$str1 def";


3.2  文字列操作
  各種文字列操作です。

# 結合
append str1 "aaa" "bbb"

# 分割
split "aaa,bbb,ccc" ,

# 長さ
string length "abcdef"

# 切り出し
string range "abcd" 0 2   -> "ab"

# 検索
string first "cd" "abcd"    -> 2


■ 4.配列


4.1 配列の宣言と代入
  配列です。またtclの配列はハッシュです。
  配列名と添字で代入をします。

# 配列への代入
set array(1) "abc"


4.2 配列の要素の参照と代入
  配列の要素を参照と代入です。

# 要素の参照
puts $array(1)

# 要素の代入(配列の代入と同じ)
set array(1) "def"


4.3 配列の個数
  配列の個数を取得です。

array size array


4.4 配列の操作
  ハッシュなので配列の先頭とか末尾の取り出すようなことはしません。

■ 5.ハッシュ


5.1 ハッシュ変数の宣言と代入
  tclの配列はハッシュのようなものですが、キーに対してのアクセスがあまりできません。
  ディクショナリ型を作成するdictを使ってハッシュを作ります。

# ハッシュ作成
dict create
# ハッシュ作成&代入
set hash [dict create "abc" 123]


5.2 ハッシュの要素の参照と代入
  ハッシュの要素の参照と代入です。

# 要素の参照
dict get $hash "abc"

# 要素の代入
dict set hash "def" 456


5.3 ハッシュに関する関数

# キーの取得
dict keys $hash

# 値の取得
dict values $hash

# キーの存在確認
dict exists $hash "abc"

# ハッシュのキーの削除
dict unset hash "abc"


■ 6.制御文


6.1 if文
  if文です。

if {条件} {
# 処理
}


6.2 if ~ else文
  if ~ else文です。

if {条件} {
# 処理
} else {
    # 処理
}


6.3 if ~ elseif文
  if ~ elseif文です

if {条件} {
# 処理
} elseif {条件} {
# 処理
}


6.4 while文
  while文です

set i 5
while {$i != 0} {
    # 処理
    incr i -1
}


6.5 for文
  for文です

for {set i 1} {$i <= 5} {incr i} {
    # 処理
}


6.6 foreach文
  foreach文です。

foreach i {A B C} {
    # 処理
}

 EDAツールだと、合成/STAとかだとクロック指定や外部端子のリスト、
  レイアウトではPLACED/FIXED属性のインスタンスやシールド属性の付加用のリストなどを頻繁に作ります。
  しかし10Mインスタンスぐらいの規模になると、設計データのファイルサイズが大きすぎるため(数~十数GB)
  設計データから抽出するのが厳しくなるため、EDAツールにビルトインされているtclを使い効率良く情報を取り出します。

6.7 比較演算子
比較演算子です。tclは文字列型なのでPerlのように比較演算子が区別されていません。

$num1 == $num2 ; # $num1は$num2と等しい
$num1 != $num2 ; # $num1は$num2と等しくない
$num1 < $num2 ; # $num1は$num2より小さい
$num1 > $num2 ; # $num1は$num2より大きい
$num1 <= $num2 ; # $num1は$num2以下
$num1 >= $num2 ; # $num1は$num2以上


■ 7 プロシージャ
tclでは関数、サブルーチンのことをプロシージャと言います。
tclで新しいプロシージャを作るには、procコマンドを使用します。

proc multiple { x y } {
  puts [expr $x * $y ]
  return
}
# 実行
multiple 4 5    -> 20


returnに何も指定していないとヌル文字を返します。
またプロシージャの外で定義された変数はglobalコマンドで参照します。

set x 4

proc multiple { y } {
  global x
  puts [expr $x * $y ]
  return
}
# 実行
multiple 5 -> 20


可変引数の場合は、引数の最後にargsを使いプロシージャ内で取り出します。

proc multiple { x y args } {
  set work [expr $x * $y]

  foreach i $args {
    set work [expr $work * $i]
  }
  puts $work
}
# 実行
multiple 1 2 3 4 -> 24


■ 8 ファイル入出力
ファイルの入出力です。

# 読み出し専用で開く
open filename r
# 書き込み専用で開く
open filename w


■ その他知っておいた方がいいこと
考え中…




誰かspice基礎文法最速マスターとか書いてくれないかなぁ。あとLEF/DEFとか…
スポンサーサイト



コメント

非公開コメント

No title

ifの条件が'()'で囲まれていますよ

Re: No title

> ifの条件が'()'で囲まれていますよ

返信遅くなりました。
ご指摘ありがとうございます。
ifの条件を修正しました。