トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Diary/2012-11-15の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!VHDLファイルをJRubyでいじる

VHDLでJavaをいじるためのライブラリ,というのはいくつか公開されていますが,
今回は,
http://sourceforge.net/projects/edautils/files/
から,
parsevhdl-30OCT2012.tar.gz
をダウンロードして試してみます.
で,いろいろと手軽にさわってみたいな,と,JavaじゃなくてJRubyでいじってみることに.

::準備
ダウンロードして展開してできる
 parsevhdl-30OCT2012/lib/parseVhdl.jar
がロードすべきライブラリのJARファイル.
たとえば,
/Users/miyo/src/parsevhdl-30OCT2012/lib/parseVhdl.jar
だとすると,
 export CLASSPATH=/Users/miyo/src/parsevhdl-30OCT2012/lib/:$CLASSPATH
とかしてクラスパスに追加しておきます.
あ,もちろんJRubyも用意しておく必要があります.

::とりあえず,いじるためのローダーを用意
ダウンロードしたファイルのexampleから,とりあえずパースするために必要そうな部分だけを
抜きだしてみました.{{ref test.rb}}.
中身は↓のような感じ.
 def parse_vhdl(fName, lName)
   include Java
   require 'parseVhdl.jar'
   java_import 'com.eu.miscedautils.SortHDL.ANTLRNoCaseFileStream'
   istream = ANTLRNoCaseFileStream.new(fName)
   lexer = com.eu.miscedautils.vhdlparser.VhdlRTLLexer.new(istream)
   tokenStream = org.antlr.runtime.CommonTokenStream.new(lexer)
   parser = com.eu.miscedautils.vhdlparser.VhdlRTLParser.new(tokenStream)
   parser_ret = parser.parseVhdlRTL(lName, true)
   return parser_ret
 end

::実行
jirbを起動して,ローダーをload.パースしたいVHDLファイルをくわせてみます.
VHDLファイルは,たとえば{{ref counter.vhd}}とか.
あ,解析のためにディレクトリが作られるので何もないところで実験するのがいいです.
たとえば,~/tmp/test とかで実験しました.~/tmp/testの下に,test.rbとcounter.vhdをおいて,
 miyo@cider:% cd ~/tmp/test
 miyo@cider:% jirb
 irb(main):001:0> load "test.rb"
 irb(main):002:0> ret = parse_vhdl("counter.vhd", "work")
とかすると,retにVHDLを解析した結果である
com.eu.miscedautils.vhdlparser.VhdlRTLParser.parseVhdlRTL_returnのインスタンスがバインドされます.
あとは,
 p ret.root.getSymbolTable
とか
 tbl = ret.root.getSymbolTable
 p tbl['counter']
とか
 tbl['counter'].getPorts.get(0)
 tbl['counter'].getPorts.get(0).getName()
とかしていじれます.ちなみに最後の式の評価結果は"pClk"で,
counter.vhdで定義しているポートの名前が取得できていることがわかります.

::さて
いろいろ遊んでみよう.