« 今日の日記 | Main | SICP 4.1.2 Representing Expressins »

2007.09.05

Xilinx ISE、EDIF、そしてLisp!

今日はニッチな所でblog書く。

素人がSICPの4章で驚くのは、なんといっても入力された文字列がいつの間にかListになっていること。最初の一歩の面倒なところを(read)一発で変換できているのが凄い。もしかして、(read)でEDIF読み込めない?と思ってやってみた履歴。

まず、準備としてISE環境でのedifの作り方。ngc2edifコマンドを使う。昔作ったshallotで試してみる。こういうとき、一つでも自分で作った回路があると便利だ。ISEで合成しngcまで作る。その後にこのコマンド。
> ngc2edif shallot.ngc
で、shallot.ndfが作られる。拡張子はndfだけど中身は立派なedif。テキストエディタで見てみよう。

やっていく過程で、びっくりするような低レベルなバグ発見。Verilogの中で普通に<=と=が混在している。クオータスの合成ツールって、ブロッキングとノンブロッキング代入の混在を見逃すのか?→後で書く or 誰か書いて(web 2.0的他力本願)

どきどきしながら、今できたファイルを読み込む。
(define input-port
 (open-input-file "d:/home/study/SICP/edif/shallot.ndf"))
(define shallot-edf (read input-port))

で、変数 shallot-edfに作ったままのedifが入っている!Wikipediaによると、「これは見かけはプログラム言語LISPに似ている。」との事だが、似ているんじゃない、S式そのものだ。

後は、適当にアクセスの手続きを用意する。

;;edifのバージョンを取得
(define edif-version
 (lambda (edif)
  (edif-scan 'edifVersion (edif-inner-list edif))))

::edfiのStatusを取得
(define edif-Status
 (lambda (edif)
  (edif-scan 'status (edif-inner-list edif))))

;;edifのレベルを取得
(define edif-Level
 (lambda (edif)
  (edif-scan 'edifLevel (edif-inner-list edif))))

;;検索失敗の試験
(define edif-fail
 (lambda (edif)
  (edif-scan 'edifFail (edif-inner-list edif))))

(define edif-inner-list
 (lambda (edif)
  (cdr (cdr shallot-edf))))

(define edif-tag
 (lambda (parameter)
  (car parameter)))

(define edif-scan
 (lambda (keyword edif-list)
  (if (null? edif-list)
    'fail
    (let ((parameter (car edif-list)))
     (if (eq? keyword (edif-tag parameter))
       parameter
       (edif-scan keyword (cdr edif-list)))))))


gaucheで実行

(edif-version shallot-edf)
gosh> (edifVersion 2 0 0)

(edif-Level shallot-edf)
gosh> (edifLevel 0)

(edif-Status shallot-edf)
gosh> (status (written (timestamp 2007 9 5 11 29 49) (program "Xilinx ngc2edif" (version "J.33")) (author "Xilinx. Inc ") (comment "This EDIF netlist is to be used within supported synthesis tools") (comment "for determining resource/timing estimates of the design component") (comment "represented by this netlist.") (comment "Command line: shallot.ngc ")))

キタコレ!
5分くらいでここまで出来たぜ。

普通に読めるということは、頑張れば修正もできるし、新しく書けるって事だ。1からedif作ってHDLを経由しない俺様合成ツールを作るもよし、内部ノード引き出しツールを作ってもよし、FPGAシミュレータ作ってもよし。広がれ妄想!

|

« 今日の日記 | Main | SICP 4.1.2 Representing Expressins »

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference Xilinx ISE、EDIF、そしてLisp!:

« 今日の日記 | Main | SICP 4.1.2 Representing Expressins »