2016年04月01日

3月度概況

access1603.jpg3月度の弊社HPへのアクセス状況は図のようになりました。3月は、大学などの春休みの影響で、例年多少アクセスが減少するのですが、これを織り込めばほぼ従来通りといったところでしょう。

先月度応募いたしましたHPCS2016ですが、不採録という結果となりました。今回の発表は、従来行ったいくつかの発表を紹介し、これらを総合した形で新しい数値計算の可能性を示すというのが趣旨なのですが、肝心の新しい数値計算の可能性を示す部分の書き込みが少々不足しておりました。

これをきちんと行うには少々時間が足りなかった、というのが本音ではあるのですが、何とかなるであろうと考えたのが判断ミスで、時間の無駄をしてしまいました。ただ、この時点で改めて全体を見直す機会が得られたという意味では、全くの無駄でもなかろうと考えております。

さて、HPCSがだめとなりますと、2年に一度の発表はどうするか、という問題が改めて生じるのですが、当初発表を計画しておりましたDAシンポジウム2016の論文募集が公表されております。論文締め切りはアブストラクトが6月24日、最終論文が8月12日と、かなりの余裕があります。これなら、CodeSqueezer2.0も何とかなるかもしれません。ある程度のバグを許容する形でCode Squeezer2.0のβバージョンを作成して発表するというのが、さしあたりの目標となるでしょう。

と、いうわけで、先送りいたしましたコンサルティング業務が立て込む中、コンパイラを仕上げる作業を開始いたしました。こちらにつきましても、簡単にご紹介いたしましょう。

まず、CodeSqueezerは、「mhdl」と呼ばれる構造化数式記述言語で記述された演算仕様を、演算機能を持つブロックをリンクと呼ばれる信号線で接続した「ブロックダイアグラム」に変換し、外部入力の仕様(ビット幅など)に応じて、それぞれのブロックをVerilogHDLの単純な文に対応するノードをVerilogHDLのWireに対応するワイヤで接続した「ノードグラフ」に変換するという過程を通して、VerilogHDLに変換します。

ブロックダイアグラムをノードグラフに変換するのは、ブロック毎に準備された「コーダ」により行います。mhdlコンパイラがおこなうべき作業は、mhdlで記述された演算仕様をブロックダイアグラムに変換する作業ということになります。

mhdlによる演算仕様の記述はブロック定義の形で行います。ブロックは、名前と入出力ポートを規定するブロック定義文と、そのブロックの演算処理を規定するいくつかの代入文と、ブロック内部でのみ使用するいくつかのブロック定義から成り立っています。ブロック定義の範囲は、字下げによって規定され、ブロック定義文よりも深い字下げが続く範囲の代入文とブロック定義文が、そのブロックに含まれます。

このような処理は、これまでに公開しているCodeSqueezerでも行っているのですが、あまり整理された形でコーディングされているとはいいがたく、きちんとした形に書き改める必要があります。そこで、3月度は、字下げの形で記述されたブロック定義を、ブロック定義の包含関係を規定する「ブロック定義ツリー」の形に変換する部分を記述いたしました。

この部分のアルゴリズムは、以下の通りです。

(0) Blockクラスに、親ブロックへのポインタparentと子ブロックへのポインタのリストchildren、このブロックに含まれる代入文のリストexprsおよびブロック定義のレベルを示す整数をメンバ変数として用意しておきます。
(1) mhdlの文を一つ読み込む関数:行頭のブランクの数(レベル)とブロック本体をIndentクラスとして返します。このクラスには、この文がブロック定義であるか否かのフラグも含めておきます。
(2) 最上位ブロックrootを定義し、この下にすべてのブロック定義を置くものとします。rootのレベルは-1とします。また、現在処理中のブロックを表すcurの初期値をrootとします。
(3) 親ブロックとなりえるブロックへのポインタを格納する親候補スタックを準備します。
(4) curをスタックにプッシュします。(curが親にもなりえるため)
(5) 新しい行を読み込みます。ソースコードの終わりに達したら処理を終えます。
(6) 新しい行が親候補スタック最上段のレベルに等しいか浅い間、親候補スタックをポップします。
(7) 新しい行がブロック定義文なら、ブロックを作成してcurとしてスタック最上段のchildrenに追加します。
(8) 新しい行が代入文なら式に変換し、スタック最上段のexprsに追加します。
(9) (4)に戻ります。

mhdlのソースコードにはコメントや継続行が含まれますが、ブロック定義ツリーに変換する前に、これらは取り除き、文単位にまとめる処理がなされます。エラーが発生した場合には、ソースコードのどの行にエラーがあったかを表示する必要があるのですが、この処理に伴いプログラムの要素が持つ行情報が失われてしまいます。そこで、mhdlの行を読み込む際に、有効な文の要素をトークンとして切り出し、トークンに行情報をもたせるようにします。トークンは、名前、定数、記号などのプログラムを構成する原子的要素で、行情報のほかに文字パターンをもたせてエラーメッセージに反映させるようにします。

以上が、これまでに作成した部分です。後は、以下の作業が残っております。

・トークンへ切り出し:正規表現を用いればすっきりとしたコードでできそうです。
・代入文の処理:複数の代入を可能とするため、リストの形での処理が必要となります。数式処理は、複数の演算子を同時に処理する「スーパーブロック」を用いれば、コンパイラ自体は比較的簡単に記述できそうです。スーパーブロックのコーダが必要になるのですが、最終的にコーダ部分はコンパイラとは別扱いとし、あとでも修正可能な形にしたいと考えております。
・コーダ:各種基本的機能を持つブロックのコーダと、ユーザ定義ブロックのコーダを作成します。

さて、6月までにこれら作業が完了いたしますでしょうか。アブストラクトは見切り発車という手もありますが、あまり好ましいことではありません。コンサルティングもまだ入っておりますので、スケジュール的にはかなりきついのですが、ここは何とかするしかありません。
posted by 管理人 at 14:33| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/174724928

この記事へのトラックバック
Powered by さくらのブログ