- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!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で定義しているポートの名前が取得できていることがわかります.
::さて
いろいろ遊んでみよう.