高位合成友の会 第3回 (2015/12/08) でのスライド
TRANSCRIPT
Polyphony ~ Python ベースの高位合成コンパイラ~
有限会社シンビー 片岡 / 鈴木
目次
● Polyphony の特徴
● 現在の開発状況
● 今後の開発
Polyphony の特徴
Polyphony はこんなツール ( になる予定 )
特徴● Python で書いたコードを HDL(Verilog)
に変換するためのコンパイラ
● コードは Python インタプリタで動く普通の Python のコード
● 特殊なクラスや言語拡張は基本的になし
● ただし,使える言語要素に制限あり
● オープンソース
Polyphony はこんなツール ( になる予定 )
得意なこと
● 抽象度の高い処理記述
● ソフトウェアのハードウェア化
● 動くものを早く作る
出来ないこと,苦手なこと
● クロック単位のタイミング制御
● ハードウェアの制御
● 性能の追求
Python のいいところ
開発が早い● ソースの読みやすさ,書きやすさ● 割とすぐに身につく ( 学習コスト低め )● 標準ライブラリが充実● 使える外部ライブラリも多い
Python の上のような特徴を生かした高位合成ツール( になる予定)
ハードウェア記述言語の生産性と性能
生産性
性能( 速度,リソース ...)
高
低
高位合成処理系
VHDLVerilog
良い悪い
夢の処理系
ハードウェア記述言語の生産性と性能
生産性
性能( 速度,リソース ...)
高
低
高位合成処理系
VHDLVerilog
良い悪い
Polyphonoy( 目標 )
いまここ !↓
夢の処理系
ハードウェア記述言語の生産性と性能
生産性
性能( 速度,リソース ...)
高
低
高位合成処理系
VHDLVerilog
良い悪い
Polyphonoy( 目標 )
夢の処理系・言語機能の充実
・コードの再利用
・最適化性能アップ・バックエンドライブラリの充実
いまここ !↓
現在の開発状況
値 ( リテラル)
● 使えるのは整数, True , False だけ
● 浮動小数点数は現状未対応 将来的にはサポート予定
● 文字列も...今後検討
変数
とりあえず普通に使えますが……
課題 : 常に符号あり 32 ビット整数型として合成
32 ビット使い切るようなケースはまれ
しかし, Python には変数の型を明示する方法がない
#Pythonは値の代入により変数の型が決まるx = 120
変数
課題 : 常に符号あり 32 ビット整数型として合成
対策案 : 表明 ( アサーション ) によるビット数推定
assert 文で値の範囲,符号,ビット幅などのヒントをコンパイラに与える
実行時の検証にもなり,二度おいしい
#x は符号なし 7 ビットに合成
assert 0 <= x and x <= 127
#x のビット数を直接指定することも可assert x.bit_length() == 7
式
算術演算,ビット演算
比較演算,論理演算
x = 1 + (2 + 3) * -4y = y & 0b 11110000
d = a < b < ce = x and y or z
リスト
生成
参照と代入
● 長さは固定長● リストに入れられる要素は整数
型, True , False のみ
xs = [1, 2, 3, 4]ys = [0] * 4096
xs[0] = xs[-1] * 2
リスト
追加,削除など長さを変える操作不可
メソッドは基本的に不可
追加,削除はあったほうが便利…どういう操作をサポートするかどうかは検討中です
list.append(5)
list.index(a)list.count(b)list.sort()
関数定義 & 関数呼び出し
Python の関数⇒ Verilog のモジュール
def f(x): ...
module f(...); ...
Python
Verilog
関数定義 & 関数呼び出し
Python の関数呼び出し⇒ Verilog のサブモジュール
def f(x): g(x)
module f(...); g g_inst(...);
Python
Verilog
関数定義 & 関数呼び出し
関数の並列実行
という関数があるとき
f() と g() は,並列に実行されます
(※ データフロー解析の結果,関数に依存関係がなく関数の内側で外の環境を変化させないことが条件 )
も並列に実行,ただし逐次実行も可能です(同じ FU の並列度は調整可能 )
def f(x): ...def g(y): ...
x = f(0) + g(1)
x = f(0) + f(1)
関数定義 & 関数呼び出し
内部関数もサポート
def f(x, y): def f_a(a): ... def f_b(b): ...
return f_a(x) * f_b(y)
制御構造 : for
for ループ
for i in range(x): # ここだけ range関数使える
...
else: # for-else も一応対応 (基本使わないけど... ) ...
制御構造 : for
一応リストも回せます
内部的には…こう変換しています
for x in xs: # xsはリスト func(x)
# len()はリストの長さを得る組み込み関数
for i in range(len(xs)): x = xs[i] func(x)
その他利用可能な言語要素
● if-elif-else● while-else● continue, break● assert● return● print 関数
… などが利用できます
テストベンチ合成
テストベンチ向けの合成も可能
def func01(x): def inner(y): return y + 1 return inner(x)
@testbenchdef test(): assert 1 == func01(0) assert 2 == func01(1) assert 3 == func01(2)
ソースコードの制限
Python のどんなコードも合成できるわけではない
例えば,● クラス● 辞書,タプルなどのオブジェクト● 組み込み関数 (sorted, map, filter…)● クロージャ…など,使用できない言語要素は多い
今のところ C 言語などと表現力はあまり変わらない
Polyphony を使ってみた例
すごくシンプルなプロセッサの実装
1. CPU エミュレータのようなソースを Python で書
く
2. 実際に FPGA の上でソフトプロセッサとして動か
す
Polyphony を使ってみた例
def mips_main(imem:list, dmem:list): ... while True: iaddr = IADDR(pc) ins = imem[iaddr] pc = pc + 4 op = ins >> 26 if op == R: funct = ins & 0x3f shamt = (ins >> 6) & 0x1f rd = (ins >> 11) & 0x1f rt = (ins >> 16) & 0x1f rs = (ins >> 21) & 0x1f if funct == ADDU: reg[rd] = reg[rs] + reg[rt]
次の FPGAマガジン (No.12) に載るかも・・・?
今後の開発
今後の開発予定機能の例
言語要素のサポート強化
例えば,
● クラス
● 高階関数
をサポート
その他の開発予定機能
● import 文によるコードの再利用
● 組込み関数 enumerate, zip, any, all, abs, sum, ...
● ライブラリ numpy, scipy ( ほとんど妄想 )
...
おわりに
Polyphony はオープンソースです
GitHub で公開中https://github.com/ktok07b6/polyphony
● バグ報告● 追加機能のリクエスト● プルリクエスト
歓迎します☺
ご清聴ありがとうございました