« June 2008 | Main | August 2008 »

2008.07.29

今日の日記

・On Lisp読んだ
 手を動かす時間が無いので、通勤電車の中でまったりと読みました。前半はいまいちで、後半が少し面白かった。こりゃマクロ最強だわ!ってのは特に見つけられなかった。

http://d.hatena.ne.jp/higepon/20060727/1154010196
shiroさん>Schemerにとってローカル変数は関数呼出しのシンタックスシュガーにすぎないからです。

のような話は、自分で手を動かして初めておもしろさが分かったので、On Lispも手を動かさないと駄目だろうなというのが感想。

・焚書
本を燃やしてしまえ!という表現は過激すぎると思う。公共の場で特定の書名を出して言うことではない。とはいえ、それでも言いたくなる本は存在するわけで。

もう少し柔らかい呼び方は無いのだろうか。「再生紙として第2の人生を歩んでしまえ!」とか。

・言語バトル
は是非やって欲しい。それ○○でもできるよ!の応酬。

| | Comments (0) | TrackBack (0)

2008.07.25

今日の日記

・Verilog Parser
勢いでTokenの定義を書いてみた。

YUKI.N>python verilog_lex.py
Traceback (most recent call last):
File "verilog_lex.py", line 163, in
lexer = lex.lex(optimize=1)
File "/usr/lib/python2.5/site-packages/ply/lex.py", line 449, in _form_master_re
llist, lre = _form_master_re(relist[:m],reflags,ldict,toknames)

File "/usr/lib/python2.5/site-packages/ply/lex.py", line 449, in _form_master_re
llist, lre = _form_master_re(relist[:m],reflags,ldict,toknames)
RuntimeError: maximum recursion depth exceeded

明日から問題を切り分けていこう!

・鈴鹿サーキットへ行ってきた
家族4人で鈴鹿サーキットへ。
平日なのに結構な客がいる、と言っても乗り物には待ち時間0で乗れたので満足。
でかいプールで遊んだけど、自分の娘が一番可愛かった。やばいくらい可愛い。

| | Comments (0) | TrackBack (0)

Verilog のconcatenation operatorとreplication operator

replicationを知らなかった。

concatenationはよく使う。
a[31:0] <= {b[15:0], c[15:0]};
の書き方。これで、bとcを連結してaに代入できる。

replicationは名前の通り繰り返し。{b, {3{a, b}}}で、{b, a, b, a, b, a, b}と同じ。

テストパターンなんかで、バイト毎に特定の値を入れるときに使えそう。

bus_data[31:0] <= {4{tdata[8:0]}};

仕様書には{{と}}がreplication operatorの定義になっているけど、{{はトークンとして出てこないじゃん。{ replication constant { でreplicationね。

| | Comments (7) | TrackBack (0)

2008.07.22

FPGAとパソコンを繋ぐ良い方法?

FPGAとパソコン間で数M~数10Mバイトくらいのデータをやりとりする簡単な方法って無いだろうか。

僕だけじゃなくて同じようなことをしたい人が簡単に後追い出来るもので、3年後でも使えそうなやり方を探している。当初は、CypressのEZ-USBが書籍も多くKITも多いので、ベストだと思ったんだけど、日本橋行ったら全然置いてないの。FTDI社のキットは大量にあったんだが、シリアルと転送速度きついし、3年後にこのキットが買える可能性も低そうなのでスルーしてきた。

ネットワークで繋ごうか。XPORTなら3年後も手に入りそうな気がする。

こうなるとCF、SDカード、USBメモリってのは全然悪くない選択肢で、3年後も確実に手に入る。

| | Comments (0) | TrackBack (0)

2008.07.18

3 not problem

http://parametron.blogspot.com/2008/07/3-not-problem.html

kinabaさん経由で知る。http://www.kmonos.net/wlog/

3bitの反転が駄目。notが2つしかないから、サイクリックな回路にならない。
反転するってのは7からの引き算だし、本質的には加算器になるんだろうな。
キャリー的な信号にnotを使う気がする。

まだ答えは見ていないので、暇な会議の時にでもこっそり考えてようと思う。

| | Comments (0) | TrackBack (2)

2008.07.15

今日の日記

・ぱたへね第4版
 hogelogさんにTwitterで教わる
 http://twitter.com/hogelog/statuses/858755820

• Covers the revolutionary change from sequential to parallel computing, with a new chapter on parallelism and sections throughout the book highlighting parallel hardware and software topics
• Includes new content on Flash memory and Virtual Machines
• Includes a new appendix by industry experts covering the emergence and importance of the modern GPU (graphics processing unit)

 何となく改悪な気もしなくもない。マルチプロセッサやら、VM、GPUなんてのは、いわいるCPUの応用であって、まずは基礎をしっかり教えて欲しい。紹介するのは良いんだが、割を食った記事がCD-ROMにいってしまうのは悲しい。基礎は書籍で、応用はCD-ROMに行って欲しい。この本が出る頃には、ぱた☆へねの2章終わっていると良いな。

・関数呼び出し
 gccで思った通りのアセンブラを出すのが意外に面倒。
 最適化しないと引数をいったんローカル変数としてコピーするし、最適化すると使わない関数呼び出しがまるまる消えたりする。最適化できないCソース書くのは簡単なんだけど、本質じゃないところが見苦しい。むう。
 組み込み用のコンパイラの方が素直にアセンブラ出してくれる。gcc苦手。

 そんな中、引数が5つでもレジスタで渡すsparcに惚れた。7つまではレジスタ渡しらしい。ちゃんと調べよう。


・パーサ
 pythonのgetoptの使い方が分かった。おせー。

・勉強
 TwitterでC++の話が盛り上がる。efficient C++や、Inside the C++ Object Model でバイナリな話から勉強してはどうかと思った。あと、mixiのveritakコミュを見ているとsystem verilogも勉強したくなってきた。

・ゆの
xが不定値を表すというverilogの特徴が使えないかと思ったが挫折。

| | Comments (2) | TrackBack (0)

2008.07.10

今日の混乱

・ABI
今日まで「関数の引数が4個以下ならレジスタ渡し、5個以上ならスタックを使う」ってのが、大半のCPU/コンパイラで採用されていると自信を持っていた。大半ってのは9割以上。

http://d.hatena.ne.jp/suu-g/20080504
http://d.hatena.ne.jp/niha/

を見ていて、あれ x86ってこんなルールだったのかと驚く。ついでに手持ちのgccでいろいろやってみたら、sparcを除く、MIPS、ARM、SHで引数の数に関係無くスタックを使っているっぽい。

引数4つルールは、どうもシステムコールと勘違いしていた模様。(OSにも依るけど)

と思ったけど、昔のデバッグの様子を思い出しても、引数4個以下でレジスタ渡しだったよな。あれはルネサス純正コンパイラの話なんだろうか。

ちょっと混乱中

・kinabaさんに教わった事。
×メタパニ
○メダパニ

・思い出
♪きゅーん、きゅん、きゅーん、きゅん、私の彼はパイロット
って、もう少しテンポ速いと記憶してた。カセットテープ買ったはず。

| | Comments (9) | TrackBack (0)

2008.07.06

疲れた

mixi疲れではなく、昨日から下の娘が熱を出したので、看病している嫁の看病等でくたくたになる。Googleのイベントには参加できず。次があるさ。

夕方から自分の方が体調が悪くなり横になる。

唯一元気な上の娘がお医者さんになり、「おなか出してください。怖くないですよ」といろいろと見てもらった。おなかの上で指ピアノを演奏したり、馬乗りで飛び跳ねるとか、そんなレベルだけど元気になった。

「最後にお薬だしますね。朝と昼と夜と3回飲んで下さい。あと、ポテトはいかがですか?」で吹き出した。新しいビジネスモデルだな。

| | Comments (0) | TrackBack (0)

2008.07.05

今日の日記

・ぱた☆へね
> http://twitter.com/fd0/statuses/850534456
> 何故、最初に 1 かどうかを比較するようにコンパイルされるのかがわからない。
僕も良く分からないです。最初は0から比較する方がよさげな気がする。

手持ちのgccで試してみました。

arm:ジャンプテーブル
x86:1から
sparc:1から
sh:ジャンプテーブル

caseが4個しかなくてもARMとSHはジャンプテーブルにされた。残りは1から比較しているので、gcc的に1から比較する理由がありそうに思う。

・コミュ疲れ
わっさーとみきしーをはじめた。Twitterも含めて、それぞれ参加者が「微妙に違う」ので大変。これを女の子のノリで、全員に返事とかしだすと破綻すると思う。ほどほどにしよう。

・京都GTT
仕事が一個入ったのと下の娘が熱を出したので、今回はお休みします。行きたかったな~。

C言語撃退講座 K&Rは置いて、俺の話を聞け
表紙と勢いに釣られて買ったが、おっさんが昔を懐かしんで読む本だと思う。初心者にはお勧めしません。危うい記述がネタなのか本気なのか良く分からないので、いちいち突っ込むのはおかしいんだけど、ポインターの所は明らかに間違っている。

| | Comments (1) | TrackBack (0)

2008.07.04

今日の日記

xfy Blog Editorなるものを使ってみた。どうよ。はてなには対応していない。

Continue reading "今日の日記"

| | Comments (0) | TrackBack (1)

2008.07.02

Hardware Transactional Memory はじめの一歩

http://tcc.stanford.edu/publications/tcc_isca2004.pdfを読んでみた。(リンク先pdf注意)

今の僕の理解では、マルチプロセッサをまたがるキャッシュみたいな物。この論文の実装だと、トランザクションのコミットが全プロセッサにブロードキャストされるので、キャッシュ全部スヌーピングとそんなに変わらない気がした。

メモリ以外のI/Oにアクセスするときは、ロールバックが発生しない状態にしてから、I/Oのアクセスを行う。動きがトランザクションに使うバッファがオーバーフローしたときと同じなので、pseudo-overflowとは上手い名前を付けると思った。

いまいちロールバックの実装が分からなかったのだが、トランザクションをリクエストする前に全レジスタをなんらかの形で保存するようだ。これはハードウェアのサポートが無いと辛い。リネームの仕組みでも良いし、レジスタウィンドウでもよさげ。

これ、もうちょっと面白い部分を全面に出して、パタヘネレベルで解説してくれるとうれしい。

| | Comments (0) | TrackBack (0)

今日の日記

・ぱた☆へね
 次はswitch文がテーブルジャンプになる話。しかし、gccの出すこれがシミュレータで動かない。L13のアドレスを$2に持ってきているだけなんだけどね。
lui $2,%hi(.L13)
addiu $2,$2,%lo(.L13)
 Verilogのせいか、ずっとcase文だと思っていたのは秘密。

コンパイラ入門
 きむら(K)さんに教わって、早速斜め読みしました。良心的な入門書だと思います。文法の定義(生成ルール)や実際のソースコードはほとんど無く、コンパイラの基本的な話を丁寧に書いてあります。LRのパーサ(LR(0)、SLR、LR(1)、LALR(1))について30ページも記載してあり、力が入っています。全体が200ページ程度なので、1割以上がLRの説明です。

後書きにも書いてありますが、これを読んでからドラゴンブック、タイガーブック、コンパイラの構成と最適化、に向かうとちょうど良いと思います。ドラゴンブックに比べると、内容はかなりはしょってあるので、これ1冊では厳しい所がでてきます。

yaccのデバッグの所は、shift/reduce conflict が出たときの話が載っていました。-v オプションで情報を出し、y.outputにどのような情報が載っているか、何を検討するべきかが説明してありました。

随所にあるコラムが秀逸で、とても参考になりました。
 プログラムにおける意味(semantics)、意味論って何?
 lex記述と手書きの比較
 コンパイラとインタープリタの速度差が約10倍程度の理由。
とかとか。「SLRでは力不足で、LR(1)では強力過ぎて難しいから、LALR(1)クラスが、ちょうど手頃な表現力と複雑さを持っている」と書いてあって、もやもやしていたところが一つすっきりしました。何気ない一言ですが、こういう目線をもってもう一度教科書に戻ると新しい発見がありそう。

・include のネスト
Cで、お互いのファイルをincludeした場合、コンパイラはどうなるのか調べてみた。cygwinのgccだと200回くらいネストしたら #include nested too deeply でギブアップした。ちゃんと無限ループに入らないようになっているんだ。こんな事考えたことも無かった。

| | Comments (3) | TrackBack (0)

2008.07.01

Verilog 2005 のCompiler directivesメモ

とりあえずまとめてみた。規格として必要としていることと、僕が必要としていることをごっちゃに書いているので、検索で飛んできた人は鵜呑みにしないように。

`begin_keywords [19.11]
`end_keywords [19.11]
この2つがペア。使ったことないし、OpenSparcにも出てこないので無視。そのままパーサへ。

`celldefine [19.1]
`endcelldefine [19.1]
PLIで使う。OpenSparcにも出てこないので無視。そのままパーサへ。

`default_nettype [19.2]
デフォルトのネットを禁止する。そのままパーサへ。

`define [19.3]
`undef [19.3]
パーサの前で処理する。`resetallの影響を受けない。

`ifdef [19.4]
`else [19.4]
`elsif [19.4]
`endif [19.4]
`ifndef [19.4]
パーサの前で処理しないと駄目。

`include [19.5]
パーサの前で処理する。少なくとも15レベルのネストの処理必須。コマンドラインのオプションで、パスの指定が出来るようにする。

`resetall [19.6]
OpenSparcにも出てこないので無視。そのままパーサへ。

`timescale [19.8]
そのままパーサへ

`line [19.7]
説明多いな。
オリジナルのファイル名と行番号を記述するのに使う。`lineディレクティブはソース上のどこにでも書けるが、同じ行には空白だけ認められる。コメントも駄目。`resetallの影響を受けない。

line_compiler_directive ::= `line number "filename" level

numberが行番号、filenameがファイル名。レベルは0、1、2のどれかの値を取り、1はinclude fileに入ったときの最初のライン、2がinlude fileを出た最初のライン、0はそれ以外を表す。パーサに入る前に処理。


`nounconnected_drive [19.9]
`unconnected_drive [19.9]
未接続の入力ポートの処理
OpenSparcにも出てこないので無視。そのままパーサへ。

`pragma
そのままパーサへ。

これでいこう。

| | Comments (0) | TrackBack (0)

« June 2008 | Main | August 2008 »