一般社団法人 電子情報通信学会
THE INSTITUTE OF ELECTRONICS,INFORMATION AND COMMUNICATION ENGINEERS

信学技報
IEICE Technical Report
VLD2019-114 HWS2019-87 (2020-03)

プログラマブル SoC における Erlang からのハードウェア制御
若林秀和†

石浦菜岐佐†† 関西学院大学 理工学部 〒 669–1337 兵庫県三田市学園 2-1
あらまし 本稿では Erlang プログラムからカスタムハードウェアを制御するための一手法を提案する. 近年の組込みシステムには, IoT サービスのための通信を含む益々高い機能とともに, 複雑な計算をエッジで行うための高い性能が求められるようになってきている. 本稿では, プログラマブル SoC において通信処理を Erlang で実装し, 処理量の大きな計算はハードウェアで実行する枠組みとして, Erlang プログラムから Erlang ポートを介してハードウェアの制御を行えるようにする. ハードウェアを制御するための Erlang メッセージはポートを介してバイト列として授受され, 外部プログラムでこれをハードウェアのレジスタの読み書きに変換する. ハードウェアに簡単なニューラルネットワークを実装して Erlang から制御を行った結果, 実行時間を大幅に短縮できることが確認できた.
キーワード

Erlang, ハードウェア, ポートHardware Control from Erlang Programs on Programmable SoC
Hidekazu WAKABAYASHI† and Nagisa ISHIURA†† Kwansei Gakuin University, 2-1 Gakuen, Sanda, Hyogo, 669–1337, Japan
Abstract This article presents a method for controlling custom hardware from Erlang programs. Higher andhigher functionality, including communication capability for IoT services, is required for embedded systems as wellas high performance to shift sophisticated information processing from cloud to edge. With the view of implementing message processing in Erlang and oﬄoading heavy computation tasks to custom hardware, our method enables
activating hardware modules from Erlang programs through Erlang ports. Erlang messages to control hardware aresent and received via ports as byte sequences, which external programs translate into reads and writes to hardware
registers. Through a preliminary experiment using a hardware implemented neural network, we conﬁrmed that theexecution time was substautially reduced by our oﬄoaded scheme.
Key words Erlang, hardware, port
セージを捌く Web サービスの実装に用いられている [3]. また,

1. は じ め に

並行プロセスとメッセージ通信によってイベントを簡潔に記述

組込みシステムは, 家電製品, 自動車, 医療用機関, 産業機器できる点や, IoT デバイスの開発に必要なライブラリが豊富に等, 多岐に渡る製品に内蔵されている. これらの製品に対するある点に注目し, Elixir を利用して IoT デバイスを開発するフ多種多様な要求に対応するため, 組込みシステムには益々高い

レームワーク Nerves の開発が行われている [4].
一方で, データ通信の帯域削減の観点から, システムにおける機能や性能が求められている.
近年ではネットワーク環境の普及およびこれを活用した新た主な処理をクラウド側からエッジ側へと移行する動向がある.

なサービスの拡大に伴い, 組込みシステムには単体での動作だ

これにより, レスポンスやデータ秘匿性を向上させることがでけでなく他のシステムとの連携が求められるようになってきてきるが, 処理を高速に実行するだけの性能がエッジ側の端末にいる. 組込みシステムの機能はこの点でも高度化しており, こ要求される. このため, 処理の大きい部分をハードウェアで実のようなシステムの仕様記述や効率的な設計手法も重要な課題装し, 高速化を図る試みが多くされている.
文献 [5], [6] の高位合成手法では Eralng からの高位合成手法となっている.
これ対する一アプローチとして, Erlang [1] や Elixir [2] 等を提案している. この手法では, Erlang のサブセットにより記の並行処理プロセスに基づいたメッセージ処理指向言語を用い述された並行プロセスを並列に実行可能なハードウェアにできてシステムの制御を記述する試みがなされている. Erlang はる. しかし, 合成可能な Erlang 文法に制限があり, 合成可能な交換器の実装のために開発された言語で, 近年では大量のメップロセス数が 10 程度等 適用できる機器が限定されてしまう.

― 119 ―
This article is a technical report without peer review, and its polished and/or extended version may be published elsewhere.
Copyright ©2020

by IEICEそこで本稿では, Erlang プログラムをプロセッサ上で実行し,処理量の大きな計算を専用ハードウェアに実行させるための枠組みとして, Erlang プログラムからポートを介してハードウェは限定されてしまう.

3. Erlang からのカスタムハードウェア制御

アを制御する方法を提案する. Erlang プログラムからポートに

本稿では外部との通信処理を Erlang で実装し, 処理量の大メッセージを送信して外部プログラムを実行し, 外部プログラ

きな計算を専用ハードウェアで実行するというスキームを実現

ムから MMIO (Memory Mapped I/O) でハードウェアを制御するため, Erlang からハードウェアを制御する一手法を提案すする. ポートを介することで, ハードウェアが何らかの理由で強る. Erlang プログラムからポートを介してメッセージを外部プ制終了しても, Erlang プログラムは動作し続けることができる.

ログラムに送信し, 外部プログラムによって MMIO でハード本手法を用いて, ニューラルネットワークの処理をハードウェウェアの制御を行う. ハードウェアでの計算結果は, 外部プロア化して Erlang から実行できるようにした. その結果, 実行時グラムがポートを介して Erlang に返信する.

3. 1 Erlang からのハードウェア制御法間を大幅に短縮することができた.

Erlang プログラムからハードウェアを制御する方法として

2. Erlangは以下の 3 通りが考えられる.

2. 1 Erlang（ 1 ） 内部プロセスからのハードウェア制御

Erlang [1] は並行処理指向の関数型言語であり, 動的に生成さハードウェアのレジスタやポートに直接値を書き込む関数をれる複数のプロセスにより並行処理を記述する. プロセス間の作り, その関数を内部プロセスから呼び出すことによりハードデータ共有は, 共有メモリではなく非同期のメッセージ通信にウェアを制御する. メッセージ通信によってハードウェアを直より行う. プロセスは非常に軽量であり, 多数のプロセスを生成接制御することができるが, Erlang の実行環境である Erlangして大量のメッセージを処理することができる. また, Eralng

RunTime System (以下 ERTS) 自体を書き換える必要がある.

は共有メモリを持たず, 資源等の管理はプロセスで行う. 排他

また, 実装によってはハードウェアが強制終了すると内部プロ制御を実装する必要がないため, プログラムの並列化を容易にセス自体も強制終了してしまう危険性がある.

行える.

（ 2 ） 外部プロセスからのハードウェア制御

外部機器との通信は, TCP や UDP のソケットを利用して行ハードウェアを制御する外部プロセスを実装し, TCP またはう. Erlang では並列, 逐次, ブロッキング, ノンブロッキングな

UDP のパケットを送信しハードウェアを制御する. ソケットどの様々なサーバを構築することができる. 特に並列サーバで通信によるハードウェアの制御が可能になるが, ハードウェアは, 新しいソケット接続ごとにプロセスを生成することにより,に TCP や UDP の通信とメッセージの解釈を行う機能を実装

同時に数十万のクライアントから来るメッセージを処理するこする必要がある.とができる.

（ 3 ） Erlang ポートを介したハードウェア制御

また, Erlang では “ポート” を介した外部接続も可能である.

ERTS の外部のオペレーティングシステムのプロセスで外部ポートを利用すると, C や Python 等 で書かれた外部プログラプログラムを実行し, バイト型通信チャネルであるポートを通ムと Erlang を接続することができる. この時, 外部プログラムじてそのプロセスと通信をする. ERTS 自体を書き換える必要

は Erlang ランタイムシステムとは別のオペレーティングシスはない上, 外部プログラムが強制終了した場合でも ERTS は動テムのプロセスで動作する.

作し続けることができる.

2. 2 Erlang からの高位合成

本稿では, 実装の容易さも考慮し, (3) の Erlang ポートを介

文献 [5], [6] では Erlang からの高位合成手法を提案している. この手法では, Erlang のサブセットで書かれた 1 つのプロしたカスタムハードウェアの制御方法を提案する.

3. 2 システム概要

セスを 1 つのハードウェアモジュールに合成する. プロセスはシステムの概要図を図 1 に示す. Erlang プログラムは複数メッセージ通信を除いて他のプロセスを並行に実行できる. まの Erlang プロセスを起動し, 外部ノードと通信を行いながら機た, スケジューラやプロセスの管理等の実行時環境のオーバー器の主要な処理を行う. ハードウェアによる計算を起動する場ヘッドもなくなる.

合には, ポートに対して必要な情報をメッセージとして送信す

この手法では, Erlang のプログラムをコンパイルして得られる. 外部プログラムはプロトコル変換部と HW 制御部から成る BEAM 仮想マシンのアセンブリコードから CDFG を生成り, プロトコル変換部がポートから出力されるバイト列を解釈し, これをバイナリ高位合成系 (機械語を入力とする高位合成し, HW 制御部が MMIO でハードウェアのレジスタに値を書系) ACAP [7] のバックエンドに入力して Verilog HDL を得る.

き込むことによりハードウェアを制御する. 計算結果がレジス

BEAM の命令の中には, メッセージの送受信, ガベージコレクタに書き込まれると, 外部プログラムはこれをバイト列に変換ション等, データフローグラフが大規模になるものが存在する

して Erlang ポートに返す.

ため, これらの処理は, 別途独立したハードウェア (ライブラリモジュール) として実装している.

これにより, Erlang プログラムからは特にハードウェアを意識することなく, メッセージ通信によって計算のオフローディン

しかしこの手法では, 合成できる Erlang の文法に制約が大グを行うことができる. また, ポートを通じてハードウェアを制きく, ソケットやポートを利用した Erlang プログラムは合成で御することによって, ハードウェアが動作している間も Erlang

きない. また, 合成を想定している Erlang プロセス数は 10 程プログラムを動作させることができる.

度であり, 動的なプロセス生成もできないため, 適用可能な機器― 120 ―

図1

システムの概要

3. 3 データの変換
外部プログラムとの通信は, Erlang ポートを管理するプロセスを用意し, そのプロセスとメッセージ通信を行うことにより実現する.
ハードウェア起動時には, 命令や入力値をまとめたメッセー
ジを Erlang のライブラリである term to binary 関数でバイト列に変換し, Erlang ポートに送信する.

Erlang のタプルを変換しハードウェアに送信する様子を図(a) Erlang からハードウェアへの送信

2 (a) に示す. この例では, Erlang プログラムから {add, 1, 2}を送信している. {add, 1, 2} を term to binary でバイト型に変換すると, 131, 104, 3, 100, 0, 3, 97, 100, 100, 97, 1, 97,2 というバイト列が得られる. これをポートを通じてプロトコル変換部へと送信する. プロトコル変換部では受け取ったメッセージを復号し, 情報を読み取る. 今回のバイト列の例では, 131 から Erlang binary であることを読み取り, 104 でタプル, 次の 3 より要素数が 3 であること, 100, 0, 3 から第 1 要素は 3 文字のアトムであること, 97, 100, 100 から文字列は addであること, 97, 1 からタプルの第 2 要素は short int 型の整数で値は 1 であること, 最後に 97, 2 からタプルの第 3 要素はshort int 型の整数で値が 2 であることを読み取る. これらの情報から, 1 と 2 の加算を行うという命令を生成し, MMIO でハードウェアに値を入力する.
ハードウェアから値を読み取り Erlang に返信する様子を(b) ハードウェアから Erlang への返信

図 2 (b) に示す. ハードウェアの計算結果が格納されているレ

図2

ジスタを MMIO で読み取り, 結果をバイト型に変換する. 今

プロトコル変換の流れ回の例では, 先頭に Erlang binary であることを示す 131 に,short int 型整数の 3 であることを示す 97, 3 を連結しバイト列 131, 97, 3 に変換する. ポートを通じて送られたメッセージは Erlang のライブラリ binary to term で復号され計算マッピングしたハードウェアの入出力用のレジスタの読み書きを行うことによりハードウェアの制御を行う.
ハードウェア側では, これらの仕様に合わせて構成をカスタマイズする必要がある. ハードウェア構成の概要を図 3 に示す.

結果である 3 が読み取られる.

Erlang からのデータはバイト列で送られてくるためこれを復号する必要がある. 主要なものを抜粋した解釈表を表 1 に示
す. Erlang のデータはタグとデータという組み合わせで表現さハードウェアには CPU とハードウェア間のやり取りを担うバスモジュールを用意する. バスモジュールはアクセスするレジ
スタ番号と, 書き込む値, 制御信号を受取り対応するレジスタに値を書き込む. どのレジスタがどのアドレスに対応するかは,れている.

ハードウェアを設計する際に決定する. CPU からバスモジュー
表1

ルにアクセスするためには, レジスタがマッピングされているバイト列の解釈表 (一部)バイト列

意味

アドレスに値を書き込むことでやり取りができる. 計算結果を131

Erlang binary

読み取るときは, 計算が完了するまで待機し, 計算結果が格納さ97, nshort int 型 の n

れているレジスタの値を読み取る.

100, 0, n 要素数 n のアトム
104, n4. 実装と実験

要素数 n のタプル

4. 1 プログラマブル SoC による実装

107, 0, n 要素数 n のリスト

本稿で提案するハードウェア制御方式に基づく制御の雛形を Xilinx 社のプログラマブル SoC である PYNQ-Z1 上に実装

3. 4 外部プログラムからのハードウェア制御
Erlang から送られてきたメッセージを元にアドレス空間にした.

― 121 ―

ではサーバを起動する関数である start server() と, ポートとctrl
address

CPU

通信をするプロセスを起動する start port() を呼び出す.

Memorydata

サーバのソースコードを図 6 に示す. start server 関数を実行すると, 4000 番ポートを開いてサーバを起動し (2 行目),
reg

サーバのソケットをオープンして待機状態に入る (4–7 行目).

regloop for server 関数はサーバの待機ループである. 11–13 行目

ctrl
indexvalbus

HWreg

で外部ノードから UDP で受け取ったメッセージから必要な情reg

報を取り出し, 14 行目で 2 数 X と Y の和を (ハードウェアで) 計算する add 関数を実行する. 得られた結果は 15 行目で図 3 MMIO によるハードウェア制御送信元に返信する. add 関数 (19 行目) は命令と引数をタプルにまとめ, call port 関数を呼び出す. call port 関数は, 22 行目

PYNQ-Z1 は Zynq を搭載した評価ボードであり, Pythonを利用した制御や Jupyter Notebook を利用した開発が可能

で hw port にメッセージを送信して計算を依頼し, 結果を add関数に返す.

である. Zynq では, プロセッサ部分を PS (Processing Sys-tem), FPGA 部分を PL (Programable Logic) と呼んでおり,PS 部には ARM 搭載し, Linux を動作させることが可能であ1 main () ->2start_server () ,3start_port () .

る. PYNQ では FPGA の設定ファイルである bitstream を“Overlay” と呼んでおり, 複数の Overlay を用意しておくこと

図5

メイン関数

により動的に FPGA を再構成することも可能である.

4. 1. 1 システムの構成実装したシステムの構成を図 4 に示す. Erlang プログラムと外部プログラムは PS 部に, カスタムハードウェアとバスモジュールは PL 部に実装した.

Erlang プログラムは外部ノードと UDP によって通信を行う
server プロセスと, ポートを介して外部プログラムと通信をする hw port プロセスから成る. 外部ノードとしては, 温度センサや水位センサのようなものを想定している. 今回の実装では,server プロセスは外部ノードからデータを受け取ると hw portプロセスに計算を依頼する. hw port プロセスは外部プログラ
ムを介してハードウェアで計算を行い, 結果を受け取ると, それを server プロセスに返信する. server プロセスは受け取った結果をノードへ送信する.
プロトコル変換部は, erlang-port-with-python [8] を参考にPython で実装した. プロトコル部からハードウェアへのアク
セスは PYNQ Project で提供されているの MMIO クラスを利用した.

PS 部と PL 部のやり取りには AXI を利用し, AXI に Vivado
HLS で高位合成した IP を接続した.

1 start_server () ->2spawn ( fun () -> server (4000) end ) .
3
4 server ( Port ) ->5
{ ok , Socket } = gen_udp : open ( Port , [ binary]) ,6
io : format (" server opened socket : ~ p ~ n " ,[Socket ]) ,7
lo op _ fo r_ s er v er ( Socket ) .
89 loop_for_sever ( Socket ) ->10
receive
11{ udp , Socket , Host , Port , Bin } = Msg ->12
io : format (" server received : ~ p ~ n " , [Msg ]) ,13
{ Ref ,X , Y } = binary_to_term ( Bin ) ,14
Fac = add (X , Y ) ,15
gen_udp : send ( Socket , Host , Port ,term_to_binary ({ Ref , Fac }) ) ,16
loop1 ( Socket )
17
end .
18
19 add (X , Y ) -> call_port ({ add , X , Y }) .
20
21 call_port ( Msg ) ->22hw_port ! { call , self () , Msg } ,23receive24{ hw_port , Result } ->25
io : format (" received : ’~p ’ ~ p ~ n " , [Result , self () ])26
end ,27
Result .
図6

サーバの Erlang コード

Erlang ポートとの通信部を図 7 に示す.
start port 関数を呼び出すと, 2–7 行目で接続プロセスを生成する. 3 行目の register で接続プロセスを hw port と命名し,他の関数から呼び出しやすくする. 4 行目の process ﬂag を呼び出すことで, 接続プロセスを補足が可能なシステムプロセスに変更する. 5 行目の open port で 外部プログラム my protocol.pyと接続するポートを開く. 6 行目で 本体の loop 関数を呼び
図4プログラマブル SoC による実装

出す.

loop 関数は 14 行目で メッセージを受信すると, メッセージか4. 1. 2 Erlang プログラム

ら必要な要素を取り出し, 15 行目でメッセージを term to binary

Erlang プログラムのメイン関数を図 5 に示す. メイン関数

でバイト列に変換して Port に送信する. 16, 17 行目で Port

― 122 ―

から返ってきたメッセージを受信し, 18 行目でメッセージをうプログラムを実行する.

binary to term で復号して結果を送信元に送信する. 19–22 行目は例外処理であり, エラーメッセージを表示して例外を発生させる. メッセージの送受信が完了すると 23 行目で再度待機状態に入る.
1 start_port () ->2spawn ( fun () ->3
register ( hw_port , self () ) ,4
process_flag ( trap_exit , true ) ,5Port = open_port ({ spawn , "./ erlang_port/ my_protocol . py "} , [{ packet , 2} ,binary ]) ,6loop ( Port )7end ) .
8
9 stop () ->10
hw_port ! stop .
11
12 loop ( Port ) ->13
receive14{ call , Caller , Msg } ->15
Port ! { self () , { command ,term_to_binary ( Msg ) }} ,16
receive17{ Port , { data , Data }} ->18
Caller ! { hw_port ,binary_to_term ( Data ) };
19
X ->
20
io : format (" unknown message : [~ w ]~n " , [ X ]) ,21
throw ( ’ Unknown message received. ’)
22
end ,
23
loop ( Port )
24
end .
図7

ポートと通信を行う Erlang コード

1 #! / usr / bin / env python3
2 # -* - coding : utf -8 -* 3
4 from protocol import Protocol
5 from pynq import Overlay
6 from pynq import DefaultIP
7 import bnn
8 from PIL import Image
9 import numpy as np
10 import struct
11
12 class MyProtocol ( Protocol ) :13
def h a n d l e r _ w r i t e _ h w ( self , x ) :14
self . overlay = Overlay ( ’/ home /xilinx / j u p y t e r _ n o t e b o o k s /bitstreams / neural_hw /d e s i g n _ n e u r a l _ h w _ w r a p p e r . bit ’)15
return x
16 ,17
def h a n d l e r _ n e u r a l _ h w ( self , x , y ) :18
mat_ip = self . overlay . prop_cycle_0
19in1 = 0 x10
20in2 = 0 x18
21
out1 = 0 x20
22
mat_ip . write ( in1 , x )23
mat_ip . write ( in2 , struct . pack (" < f " ,y))24
mat_ip . write (0 x00 , 1)25
a = mat_ip . read ( out1 )26
b = struct . pack (" > i " , a )27
res1 = struct . unpack (" > f " , b ) [0]28
return res1
29
30 if __name__ == ’ __main__ ’:
31
MyProtocol () . run ()図8

ハードウェアの制御を行う Python コード

4. 1. 4 ハードウェア構成
プロセッサとのやり取りを仲介するバスモジュールとメイン

4. 1. 3 外部プログラム
プロトコル変換部は Python3 で実装した. Python3 で実装することにより PYNQ の Overlay クラスを最大限利用することが可能となる. ハードウェアの制御を行うプログラムを図 8モジュールを搭載したハードウェアを実装した. メインモジュー
ルは Vivado HLS を使って C++から高位合成をしたものを搭載し, バスモジュールとしては AXI を採用した.
高位合成を行う C++プログラムを図 9 に示す. a と b を加に示す.

12 行目の MyProtocol クラス内に関数を handler というヘッダをつけて実装する. 13 行目の handler write hw(self, x)関数は FPGA をコンフィグレーションする関数となっている. この関数が呼び出されると Overlay 以下に記述されたbitstream などの情報をもとに FPGA をコンフィグレーションする. 成功した場合は引数をそのまま返し, 失敗した場合は算し c に格納するだけの簡単なプログラムである. 2–5 行目のpragma 演算子で, 関数と引数を AXI のポートに接続するよう指定する. これにより AXI から容易に値を書き込むことができるようになる.
このプログラムを Vivado HLS で高位合成し, Xilinx が提供する統合開発環境である Vivado で FPGA の概要図であるブロック図を設計し, 設定ファイルである bitstream を生成する.

エラーを出力し停止する.

17 行目の handler neural hw はハードウェアに値を入力し, 計算結果を読み込む関数となっている. 18 行目で IP 内の prop cycle 0 にアクセスするためのドライバが作成され,mat ip を通じてアクセスできるようにする. 19–21 行目の変数はオフセットとなっており, 入力と出力用のレジスタが基準かブロック図を図 10 に示す. 左上の rst ps7 0 100M は 100Mhzの周期でリセット信号を出すモジュールとなっており, 左下のprocessing system7 0 が PS 部となっている. また, 右の add 0が図 9 のプログラムを高位合成して得られるモジュールであり,中央の ps7 0 axi periph が AXI Interconnect である.

ら何番目にあるかを示している. これらの値は高位合成をした際に生成されるドライバのヘッダのソースを読むことで特定できる. 22, 23 行目でレジスタに書き込みを行う. 23 行目で pack関数を利用しているのは入力値が小数の場合にも対応できるようにするためである. 24 行目で 0 番目のレジスタに 1 を書き込むことで FPGA が動作する. 25-27 行目で計算結果を読み取

1 void add ( int a , int b , int & c ) {2 # pragma HLS INTERFACE ap_ctrl_none port =return
3 # pragma HLS INTERFACE s_axilite port = a
4 # pragma HLS INTERFACE s_axilite port = b
5 # pragma HLS INTERFACE s_axilite port = c67c = a + b;8 }り, 26, 27 行目で unpack を利用することで, 計算結果が小数の場合でも正しく値を読み取ることができる. 28 行目で計算結果を Erlang に送信する. 30, 31 行目で Erlang とのやり取りを行― 123 ―

図9

高位合成される C++プログラム

の助成による.
文

図 104. 2 実ブロック図

験Erlang プログラムからハードウェアを起動して計算を行い,計算結果を返信するまでの処理時間を評価する実験を行った.

10 層の完全結合層からなる n 入力 1 出力のニューラルネットワークを Python およびハードウェアで実装し, ポートを介して Erlang から起動した.
結果を表 2 に示す. 実行時間は起動から計算までを 1000 回繰り返すのに要した時間である. “Erlang + SW” は, Erlangからリクエストを送信して, ソフトウェアで計算が完了して結果を返信する実行方式であり, “Erlang + HW” は Erlang からリクエストを送信して, ハードウェアで計算を行い結果を返信する実行方式である. Erlang + SW の方式では n の増加に応じて実行時間も増加しているのに対し, Erlang + HW の方式
では n が 1,024 の場合と 65,025 の場合を比較しても 0.1 秒程度しか増加していないのが分かる. これは HW 起動のオーバ
ヘッドは大きいが, 計算量が大きい場合には処理時間の削減効果が大きいことを示している.
表2

実行時間の比較

実行時間 [s]nErlang + SW Erlang + HW

1,024

5.01

4.14

4,096

6.83

4.13

16,384

12.39

4.24

65,02535.38

4.28(CPU: 650MHz dual-core Cortex-A9, FPGA: Artix-7)

5. む す び
本稿では, プログラマブル SoC における Erlang からのハードウェア制御方法を提案した. Erlang プログラムからポートを介して外部プログラムにメッセージを送信し MMIO でハードウェアを制御することにより, ハードウェアが強制終了しても,Erlang プログラムは動作し続けることが可能となった. 評価実
験を行ったところ, 本手法の有効性を確認できた.
ハードウェア起動のオーバーヘッドが大きいため, Erlang プ
ログラムから呼び出すを外部プログラムを C 言語などで実装することが今後の課題として挙げられる.
謝献[1] Joe Armstrong 著, 榊原一矢訳: プログラミング Erlang, オーム社 (2008).
[2] Dave Thomas 著, 笹田耕一 訳, 鳥井雪 訳: プログラミング
Elixir, オーム社 (2016).
[3] 力武健次: “Erlang で学ぶ並行プログラミング,” Software Design, 2015 年 4 月号, pp. 124–129 (Apr. 2015).
[4] Nerves が開拓する「Elixir で IoT」の新世界 - SlideShare (online), https://www.slideshare.net/takasehideki/nervese
lixiriot (accessed 2020-01-20).
[5] H. Takebayashi, N. Ishiura, K. Azuma, N. Yoshida, andH. Kanbara: “High-Level Synthesis of Embedded SystemsController from Erlang,” in Proc. Workshop on Synthesis
And System Integration of Mixed Information Technologies(SASIMI 2016), pp. 285–290 (Oct. 2016).
[6] K. Azuma, N. Ishiura, N. Yoshida, and H. Kanbara: “Distribute Memory Architecture for High-Level Synthesis ofEmbedded Controllers from Erlang,” in Proc. ACM SIGPLAN International Workshop on Erlang 2017, pp. 13–19(Sept. 2017).
[7] N. Ishiura, H. Kanbara, and H. Tomiyama: “ACAP: BinarySynthesizer Based on MIPS Object Codes,” in Proc. International Technical Conference on Circuit/Systems, Computers and Communications (ITC-CSCC 2014), pp. 725–728 (July 2014).
[8] fujimisakari/erlang-port-with-python - GitHub (online),
https://github.com/fujimisakari/erlang-port-with-python (accessed 2020-01-05).

辞

本稿の研究にあたり, ご指導, ご助言を頂きました京都高度技術研究所の神原弘之氏, 吉田信明氏, 立命館大学の冨山宏之教授, 元立命館大学の中谷嵩之氏に感謝いたします. また, 本研究に関してご討論, ご協力頂いた関西学院大学石浦研究室の諸氏に感謝いたします. なお, 本研究は一部 JSPS 科研費 19H04081― 124 ―