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から,とりあえずパースするために必要そうな部分だけを
抜きだしてみました.test.rb(185).
中身は↓のような感じ.
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ファイルは,たとえばcounter.vhd(190)とか.
あ,解析のためにディレクトリが作られるので何もないところで実験するのがいいです.
たとえば,~/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で定義しているポートの名前が取得できていることがわかります.
- さて
いろいろ遊んでみよう.