Polyphony のパイプライン
高位合成コンパイラ から データ・フロー・コンパイラへ
Polyphony では pipeline というキーワード(もっと正確な単語を考えないと)、で処理をパイプライン化することが出来るようになった。これはいつ入ったか忘れたけど、v0.3.6 からか?v0.3.5 が 2019/5/9 で v0.3.6 が 2019/5/30 でそもそも現バージョンはパンデミック前の 4年前。そろそろちゃんと v0.3.7 出さないとね。
pipeline
Polyphony は単なる高位合成ではなく、データ・フローをかなりしっかりおっている。なので、データ・フロー・コンパイラと呼びたい(勝手に呼んでいるだけ)。どれくらいしっかりおっているかというと、pipeline 化する時に for 文の展開をかなり真面目にやっている。
例えば、for 文による多重ループ。これがあると単純には pipeline 化出来ない。そこで多重ループを1重ループに展開している。
if 文は以前から mux 化(ハードウェア化)している。 なので if 文による分岐という概念はない。データ・フロー的にも for 文の中に if があっても大丈夫なように設計されている。
コンパイルはフェーズの最初では if などは then と else のブロックに別れているが、多重ルールの展開など、様々なパスを経るうちにブロックというよりデータ中心のデータ・フローが出来上がる。
中間的にはデータフローを考慮した IR ぽい形になって、抽象的な HDL となり、最終的に Verilog-HDL に出力される。
MyHDL 的なものとの整合性
pipeline 化すると、外部のインタフェースとうまく適合して、効率よくデータの受け渡しが出来るようになりたい。そうすると、どうしても Python の関数インタフェースでは表現できない。結果として、MyHDL がそうであったように、signal 的あるいは wire 的なオブジェクトを生成し、それを I/F とする、、、という手法に向かう。
でも、それってダサくない?
結局、Verilog-HDL を Python や C で書き下すような感じなる。つまり Verilog-HDL でこういう I/F になるはずだよねという事を想像しながら、その HDL コンパイラ独自のデータ変換方法に合わせて記述をしていく。プログラムが持つ本質の I/F で表現されることなく、表面上の記述変換をするはめになる。
現時点で良いアイデアはないのだが、とりあえず github にある Polyphony の開発途中のバージョンのブランチでは、よりうまくその手の I/F を記述可能になりつつある。出来たら v0.4 になるのかな?
- Polyphony そういえばウェブサイトを一新した。
- GitHub - polyphony-dev/polyphony: Polyphony is Python based High-Level Synthesis compiler. github のサイトはこちら。開発中のブランチも公開しているよ。