高位合成友の会 第3回 (2015/12/08) でのスライド

32
Polyphony Python ベベベベベベベベベベベベベベベベベベベベベ ベベ / ベベ

Upload: ktok07b6

Post on 16-Apr-2017

912 views

Category:

Software


7 download

TRANSCRIPT

Page 1: 高位合成友の会 第3回 (2015/12/08) でのスライド

Polyphony ~ Python ベースの高位合成コンパイラ~

有限会社シンビー 片岡 / 鈴木

Page 2: 高位合成友の会 第3回 (2015/12/08) でのスライド

目次

● Polyphony の特徴

● 現在の開発状況

● 今後の開発

Page 3: 高位合成友の会 第3回 (2015/12/08) でのスライド

Polyphony の特徴

Page 4: 高位合成友の会 第3回 (2015/12/08) でのスライド

Polyphony はこんなツール ( になる予定 )

特徴● Python で書いたコードを HDL(Verilog)

に変換するためのコンパイラ

● コードは Python インタプリタで動く普通の Python のコード

● 特殊なクラスや言語拡張は基本的になし

● ただし,使える言語要素に制限あり

● オープンソース

Page 5: 高位合成友の会 第3回 (2015/12/08) でのスライド

Polyphony はこんなツール ( になる予定 )

得意なこと

● 抽象度の高い処理記述

● ソフトウェアのハードウェア化

● 動くものを早く作る

出来ないこと,苦手なこと

● クロック単位のタイミング制御

● ハードウェアの制御

● 性能の追求

Page 6: 高位合成友の会 第3回 (2015/12/08) でのスライド

Python のいいところ

開発が早い● ソースの読みやすさ,書きやすさ● 割とすぐに身につく ( 学習コスト低め )● 標準ライブラリが充実● 使える外部ライブラリも多い

Python の上のような特徴を生かした高位合成ツール( になる予定)

Page 7: 高位合成友の会 第3回 (2015/12/08) でのスライド

ハードウェア記述言語の生産性と性能

生産性

性能( 速度,リソース ...)

高位合成処理系

VHDLVerilog

良い悪い

夢の処理系

Page 8: 高位合成友の会 第3回 (2015/12/08) でのスライド

ハードウェア記述言語の生産性と性能

生産性

性能( 速度,リソース ...)

高位合成処理系

VHDLVerilog

良い悪い

Polyphonoy( 目標 )

いまここ !↓

夢の処理系

Page 9: 高位合成友の会 第3回 (2015/12/08) でのスライド

ハードウェア記述言語の生産性と性能

生産性

性能( 速度,リソース ...)

高位合成処理系

VHDLVerilog

良い悪い

Polyphonoy( 目標 )

夢の処理系・言語機能の充実

・コードの再利用

・最適化性能アップ・バックエンドライブラリの充実

いまここ !↓

Page 10: 高位合成友の会 第3回 (2015/12/08) でのスライド

現在の開発状況

Page 11: 高位合成友の会 第3回 (2015/12/08) でのスライド

値 ( リテラル)

● 使えるのは整数, True , False だけ

● 浮動小数点数は現状未対応 将来的にはサポート予定

● 文字列も...今後検討

Page 12: 高位合成友の会 第3回 (2015/12/08) でのスライド

変数

とりあえず普通に使えますが……

課題 : 常に符号あり 32 ビット整数型として合成

32 ビット使い切るようなケースはまれ

しかし, Python には変数の型を明示する方法がない

#Pythonは値の代入により変数の型が決まるx = 120

Page 13: 高位合成友の会 第3回 (2015/12/08) でのスライド

変数

課題 : 常に符号あり 32 ビット整数型として合成

対策案 : 表明 ( アサーション ) によるビット数推定

assert 文で値の範囲,符号,ビット幅などのヒントをコンパイラに与える

実行時の検証にもなり,二度おいしい

#x は符号なし 7 ビットに合成

assert 0 <= x and x <= 127

#x のビット数を直接指定することも可assert x.bit_length() == 7

Page 14: 高位合成友の会 第3回 (2015/12/08) でのスライド

算術演算,ビット演算

比較演算,論理演算

x = 1 + (2 + 3) * -4y = y & 0b 11110000

d = a < b < ce = x and y or z

Page 15: 高位合成友の会 第3回 (2015/12/08) でのスライド

リスト

生成

参照と代入

● 長さは固定長● リストに入れられる要素は整数

型, True , False のみ

xs = [1, 2, 3, 4]ys = [0] * 4096

xs[0] = xs[-1] * 2

Page 16: 高位合成友の会 第3回 (2015/12/08) でのスライド

リスト

追加,削除など長さを変える操作不可

メソッドは基本的に不可

追加,削除はあったほうが便利…どういう操作をサポートするかどうかは検討中です

list.append(5)

list.index(a)list.count(b)list.sort()

Page 17: 高位合成友の会 第3回 (2015/12/08) でのスライド

関数定義 & 関数呼び出し

Python の関数⇒ Verilog のモジュール

def f(x): ...

module f(...); ...

Python

Verilog

Page 18: 高位合成友の会 第3回 (2015/12/08) でのスライド

関数定義 & 関数呼び出し

Python の関数呼び出し⇒ Verilog のサブモジュール

def f(x): g(x)

module f(...); g g_inst(...);

Python

Verilog

Page 19: 高位合成友の会 第3回 (2015/12/08) でのスライド

関数定義 & 関数呼び出し

関数の並列実行

という関数があるとき

f() と g() は,並列に実行されます

(※ データフロー解析の結果,関数に依存関係がなく関数の内側で外の環境を変化させないことが条件 )

も並列に実行,ただし逐次実行も可能です(同じ FU の並列度は調整可能 )

def f(x): ...def g(y): ...

x = f(0) + g(1)

x = f(0) + f(1)

Page 20: 高位合成友の会 第3回 (2015/12/08) でのスライド

関数定義 & 関数呼び出し

内部関数もサポート

def f(x, y): def f_a(a): ... def f_b(b): ...

return f_a(x) * f_b(y)

Page 21: 高位合成友の会 第3回 (2015/12/08) でのスライド

制御構造 : for

for ループ

for i in range(x): # ここだけ range関数使える

...

else: # for-else も一応対応 (基本使わないけど... ) ...

Page 22: 高位合成友の会 第3回 (2015/12/08) でのスライド

制御構造 : for

一応リストも回せます

内部的には…こう変換しています

for x in xs: # xsはリスト func(x)

# len()はリストの長さを得る組み込み関数

for i in range(len(xs)): x = xs[i] func(x)

Page 23: 高位合成友の会 第3回 (2015/12/08) でのスライド

その他利用可能な言語要素

● if-elif-else● while-else● continue, break● assert● return● print 関数

… などが利用できます

Page 24: 高位合成友の会 第3回 (2015/12/08) でのスライド

テストベンチ合成

テストベンチ向けの合成も可能

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)

Page 25: 高位合成友の会 第3回 (2015/12/08) でのスライド

ソースコードの制限

Python のどんなコードも合成できるわけではない

例えば,● クラス● 辞書,タプルなどのオブジェクト● 組み込み関数 (sorted, map, filter…)● クロージャ…など,使用できない言語要素は多い

今のところ C 言語などと表現力はあまり変わらない

Page 26: 高位合成友の会 第3回 (2015/12/08) でのスライド

Polyphony を使ってみた例

すごくシンプルなプロセッサの実装

1. CPU エミュレータのようなソースを Python で書

2. 実際に FPGA の上でソフトプロセッサとして動か

Page 27: 高位合成友の会 第3回 (2015/12/08) でのスライド

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) に載るかも・・・?

Page 28: 高位合成友の会 第3回 (2015/12/08) でのスライド

今後の開発

Page 29: 高位合成友の会 第3回 (2015/12/08) でのスライド

今後の開発予定機能の例

言語要素のサポート強化

例えば,

● クラス

● 高階関数

をサポート

Page 30: 高位合成友の会 第3回 (2015/12/08) でのスライド

その他の開発予定機能

● import 文によるコードの再利用

● 組込み関数 enumerate, zip, any, all, abs, sum, ...

● ライブラリ numpy, scipy ( ほとんど妄想 )

...

Page 31: 高位合成友の会 第3回 (2015/12/08) でのスライド

おわりに

Polyphony はオープンソースです

GitHub で公開中https://github.com/ktok07b6/polyphony

● バグ報告● 追加機能のリクエスト● プルリクエスト

歓迎します☺

Page 32: 高位合成友の会 第3回 (2015/12/08) でのスライド

ご清聴ありがとうございました