トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF 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から,とりあえずパースするために必要そうな部分だけを
抜きだしてみました.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で定義しているポートの名前が取得できていることがわかります.

さて

いろいろ遊んでみよう.