今日は久々に米国在住のM氏と会話できた。
その中で、LiveCygwinを教育用に使っていただいたという報告があった。
ただ、RCX向けのC++環境が実働しなかったので、コンパイラを入れ換えたということだ。(↓ 私が試したら動いた)
RCXは自分では、Cでしか動作確認しておらず、C++が動作しないことに気がつかなかった。早めに対処したいが、しばらくは多忙のため、対応不可。
追記
RCXを利用できる環境があったので、試してみたが、動くじゃないかぁ…
彼は何をやったら動かなかったのだろう?
もっとも、brickOSの推奨環境のgccバージョンは古いので、このバージョンで動作しないような記述をしていたら当然動かないのだが…?
追記の追記
M氏から返信が来て、やはり小さなプログラムはOKだったが、大きなものがNGとのこと。どうやら、RCXのメモリには入らないような大きさのものだったのでは?
という結論になりそうだ。コンパイラをバージョンアップしたことで、生成コードが若干小さくなって、ぎりぎりNGがぎりぎりOKになる境界だった可能性大。
その中で、LiveCygwinを教育用に使っていただいたという報告があった。
ただ、RCX向けのC++環境が実働しなかったので、コンパイラを入れ換えたということだ。(↓ 私が試したら動いた)
RCXは自分では、Cでしか動作確認しておらず、C++が動作しないことに気がつかなかった。早めに対処したいが、しばらくは多忙のため、対応不可。
追記
RCXを利用できる環境があったので、試してみたが、動くじゃないかぁ…
彼は何をやったら動かなかったのだろう?
もっとも、brickOSの推奨環境のgccバージョンは古いので、このバージョンで動作しないような記述をしていたら当然動かないのだが…?
追記の追記
M氏から返信が来て、やはり小さなプログラムはOKだったが、大きなものがNGとのこと。どうやら、RCXのメモリには入らないような大きさのものだったのでは?
という結論になりそうだ。コンパイラをバージョンアップしたことで、生成コードが若干小さくなって、ぎりぎりNGがぎりぎりOKになる境界だった可能性大。
sfl2vlにSFLの拡張書式を追加した。
今回の追加は、par文とrelay文に関するもの。
まず、par文は並列動作を記述するための構文だけれど、ハードウェアは基本が並列であり、特に断わりない限り、物事は並列に動作する。そこで、「par」を省略可としてみた。
次に、ステージ中の、他タスクの呼び出しには、relayやgenerateを使うが、こちらも、ほとんどのケースで、relayしか使う必要がないことから、もっと見た目に綺麗な書式にしたいと思っていた。今回、「relay」を省略可能にしてみた。
これらの省略形を用いると、先日のm8のアドレスモードデコードのステージは、↓のようになる。
主観だが、かなりすっきりして、気持ち良くなったと思う。
20090307版からのベータ版でのサポートとなる。
3/11追記
generateだけ残るのは気持ち悪いので、generateかrelayなのかをツール側で判定するようにして、generateも省略可能とした。
ステージ中では、基本としてrelay扱いとなり、ステージ外では、generateと扱う。
上に絡むが、instrselfとinstroutは、起動しない時には0を保証するので、同時ONのチェック対象外とした。relayを同時に複数のステージに発行する時、ステージのリセット信号でハザードが発生していたのを抑止。
この結果、これらの信号は設計者のチェックに任せるので、多少気を付けないといけない。
今回の追加は、par文とrelay文に関するもの。
まず、par文は並列動作を記述するための構文だけれど、ハードウェアは基本が並列であり、特に断わりない限り、物事は並列に動作する。そこで、「par」を省略可としてみた。
次に、ステージ中の、他タスクの呼び出しには、relayやgenerateを使うが、こちらも、ほとんどのケースで、relayしか使う必要がないことから、もっと見た目に綺麗な書式にしたいと思っていた。今回、「relay」を省略可能にしてみた。
これらの省略形を用いると、先日のm8のアドレスモードデコードのステージは、↓のようになる。
stage decode { any { OPR_IMM: { exec.run(mr(pc).i); pc := alu.exe(ADD, pc, 0x01).o;} OPR_MEM: { memory.run(mr(pc).i); pc := alu.exe(ADD, pc, 0x01).o;} OPR_PC : exec.run(pc); OPR_ACC: exec.run(acc); OPR_ZER: exec.run(0x00); } }
主観だが、かなりすっきりして、気持ち良くなったと思う。
20090307版からのベータ版でのサポートとなる。
3/11追記
generateだけ残るのは気持ち悪いので、generateかrelayなのかをツール側で判定するようにして、generateも省略可能とした。
ステージ中では、基本としてrelay扱いとなり、ステージ外では、generateと扱う。
上に絡むが、instrselfとinstroutは、起動しない時には0を保証するので、同時ONのチェック対象外とした。relayを同時に複数のステージに発行する時、ステージのリセット信号でハザードが発生していたのを抑止。
この結果、これらの信号は設計者のチェックに任せるので、多少気を付けないといけない。
自分でサンプルコードを書くにしても、16進で書くのは大変なので、m8用のアセンブラを作成した。
少し、記法も調整し分りやすくした(つもり)。
アーカイブ名は変更していないので、
ここからダウンロードしてほしい。
少し、記法も調整し分りやすくした(つもり)。
アーカイブ名は変更していないので、
ここからダウンロードしてほしい。
SFLの演習例題として、8bitの小型CPU m8を作ってみた。
XilinxのFPGAにマッピングすると、CPUだけなら、100スライス程度で実現できる。
命令数12個と、機能は最小限に絞り込んだが、アドレッシングモードに特徴を持たせて、おもしろい使い方ができる。用意したアドレッシンッグモードは↓の5つ。
1 即値 OPコードに続く1バイトをデータとして演算
2 PC プログラムカウンタをデータとして演算
3 ACC Accをデータとして演算
4 zero 値0をデータとして演算
5 メモリ OPコードに続く1バイトをアドレスとするメモリ内容をデータとして演算
命令は、OPコードの上位4ビットで区分けして、↓の12個となる。
0:ADD add
1:SUB subtract
2:AND logical and
3:OR logical or
4:XOR logical xor
5:NOT not
6:SLT set less than
7:MOV move to acc
8:BEQ branch when acc==0
9:JMP jump
A:LOD load from memory
B:STO store to memory
サブルーチン呼び出し命令はないれど、アドレッシングモードを組み合わせると、メモリ上に作ったスタックエリアにPCを格納した上で、サブルーチン呼び出しができる。(もちろん、スタックでなく、固定番地に戻りアドレスを格納するならもっと簡単な手順にできる)
lod #stack
sub #1
sto #stack ; スタックポインタ -1
mov pc
add #4
sto $stack
jmp foo ; fooを呼び出し
サブルーチンリターンは、
lod $stack
jmp acc
でいい。(もちろん、これで戻ると、戻り先で、スタックの調整が必要なのは、言うまでもない)
こんな小さな、CPUでサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… :-)
XilinxのFPGAにマッピングすると、CPUだけなら、100スライス程度で実現できる。
命令数12個と、機能は最小限に絞り込んだが、アドレッシングモードに特徴を持たせて、おもしろい使い方ができる。用意したアドレッシンッグモードは↓の5つ。
1 即値 OPコードに続く1バイトをデータとして演算
2 PC プログラムカウンタをデータとして演算
3 ACC Accをデータとして演算
4 zero 値0をデータとして演算
5 メモリ OPコードに続く1バイトをアドレスとするメモリ内容をデータとして演算
命令は、OPコードの上位4ビットで区分けして、↓の12個となる。
0:ADD add
1:SUB subtract
2:AND logical and
3:OR logical or
4:XOR logical xor
5:NOT not
6:SLT set less than
7:MOV move to acc
8:BEQ branch when acc==0
9:JMP jump
A:LOD load from memory
B:STO store to memory
サブルーチン呼び出し命令はないれど、アドレッシングモードを組み合わせると、メモリ上に作ったスタックエリアにPCを格納した上で、サブルーチン呼び出しができる。(もちろん、スタックでなく、固定番地に戻りアドレスを格納するならもっと簡単な手順にできる)
lod #stack
sub #1
sto #stack ; スタックポインタ -1
mov pc
add #4
sto $stack
jmp foo ; fooを呼び出し
サブルーチンリターンは、
lod $stack
jmp acc
でいい。(もちろん、これで戻ると、戻り先で、スタックの調整が必要なのは、言うまでもない)
こんな小さな、CPUでサブルーチンができても仕方ないだろうという突っ込みどころ満載であるが、それはそれとして… :-)
デモ用の記述を整理している時に、i8086のコンパイラを探したが、オープンソースのコンパイラでは、i8086向けのものはあまりない。いくつかのサイトを見ていると、旧ボーランドが、古いソフトをパーソナルユース向けに無償でダウンロードできるようにしているらしい。
Turbo C 2.01
がとりあえず目についたが、ふと、サイトを散策すると、
Turbo Pascal 1.0
なんてのも見つかる。おお!懐しい!。
実は、Turbo Pascalのこの初期のころのバージョンは私は大好きだったのだ。
あっという間に完了するコンパイル、エティタと統合された開発環境、値段の安さ等、当時のコンパイラの常識を引っくり返した優れものだった。
これには、いくらか秘密があり、高速コンパイルの一番の理由は、固定番地のライブラリルーチンにあったと思う。(もちろん、Pascalの言語仕様も貢献しているが…)
独立したツールを作ることを考えると、固定されたライブラリ(10kBくらいだったか?)が、当時の小さなフロッピー容量を圧迫したが、それにも代えがたいありがたいツールであった。
おそらく、世界中のPascalユーザ数増加に大きな役割を果したと思う、このソフト、今でも、簡単なプログラム練習用には、充分通用するのでは?
追記:
さて、i8086命令互換CPUのバスタイミングを整理して、BIUをきれいにしたので、シリアルコントローラやRAMを接続して、FPGAに載せてみようと作業をしてみた。
が、手持ちのボードには、若干入らなかった(;-p)。
レジスタファイルや演算回りを整理すれば、まだかなり論理を圧縮できそうだけれど、i8086としては、2000スライスで実現できているのは、小さい方かも?
論理を削る作業は棚上げして、他のボードを調達するか…
ちなみに、HD-LAB社の商用IP8086コアで、2300スライスなので、大きさ的には、こんなものかもしれない。今回、ISEが報告した周波数が非常に低い(10MHz)ので、長いパスを見直して、周波数アップを図った方がよさそうだが、そこまでやるか…?
10MHzでも、充分使い道はあるので、悩み所。
Turbo C 2.01
がとりあえず目についたが、ふと、サイトを散策すると、
Turbo Pascal 1.0
なんてのも見つかる。おお!懐しい!。
実は、Turbo Pascalのこの初期のころのバージョンは私は大好きだったのだ。
あっという間に完了するコンパイル、エティタと統合された開発環境、値段の安さ等、当時のコンパイラの常識を引っくり返した優れものだった。
これには、いくらか秘密があり、高速コンパイルの一番の理由は、固定番地のライブラリルーチンにあったと思う。(もちろん、Pascalの言語仕様も貢献しているが…)
独立したツールを作ることを考えると、固定されたライブラリ(10kBくらいだったか?)が、当時の小さなフロッピー容量を圧迫したが、それにも代えがたいありがたいツールであった。
おそらく、世界中のPascalユーザ数増加に大きな役割を果したと思う、このソフト、今でも、簡単なプログラム練習用には、充分通用するのでは?
追記:
さて、i8086命令互換CPUのバスタイミングを整理して、BIUをきれいにしたので、シリアルコントローラやRAMを接続して、FPGAに載せてみようと作業をしてみた。
が、手持ちのボードには、若干入らなかった(;-p)。
レジスタファイルや演算回りを整理すれば、まだかなり論理を圧縮できそうだけれど、i8086としては、2000スライスで実現できているのは、小さい方かも?
論理を削る作業は棚上げして、他のボードを調達するか…
Device utilization summary: --------------------------- Selected Device : 3s200ft256-5 Number of Slices: 2008 out of 1920 104% (*) Number of Slice Flip Flops: 614 out of 3840 15% Number of 4 input LUTs: 3882 out of 3840 101% (*) Number of IOs: 42 Number of bonded IOBs: 37 out of 173 21% Number of BRAMs: 8 out of 12 66% Number of GCLKs: 1 out of 8 12% Number of DCMs: 1 out of 4 25%
ちなみに、HD-LAB社の商用IP8086コアで、2300スライスなので、大きさ的には、こんなものかもしれない。今回、ISEが報告した周波数が非常に低い(10MHz)ので、長いパスを見直して、周波数アップを図った方がよさそうだが、そこまでやるか…?
10MHzでも、充分使い道はあるので、悩み所。
以前、SFLの話をある人にした時に、
「SFLでは、レジスタの初期値を自由に設定できますか?」
と聞かれ、現状の仕様では、セットとリセットしかないと答えたら、それでは使えないというような反応が来たことがある。
論理設計の0.1%にもみたないような僅かな仕様で、採否を決めようとするのは、不思議だが、恐らく、採用しない理由が欲かったのだろう。
ということで、sfl2vlでは、初期値を自由に設定できるようにした。
ついでに、定数にビット幅の重みを明示的に持たせられるようにする。
(10進定数を新たに定義したので、幅を持たない整数値の回路中での扱いを変更した)。
定数の変更だが、Verilog風に、
整数'定数
で、整数ビットの定数値を作る。
定数プリフィックスには、0b, 0o, 0x などの従来の定数の他、10進定数 0dを定義した。
また、レジスタの宣言において、初期値を明示的に設定できるようにした。
「SFLでは、レジスタの初期値を自由に設定できますか?」
と聞かれ、現状の仕様では、セットとリセットしかないと答えたら、それでは使えないというような反応が来たことがある。
論理設計の0.1%にもみたないような僅かな仕様で、採否を決めようとするのは、不思議だが、恐らく、採用しない理由が欲かったのだろう。
ということで、sfl2vlでは、初期値を自由に設定できるようにした。
ついでに、定数にビット幅の重みを明示的に持たせられるようにする。
(10進定数を新たに定義したので、幅を持たない整数値の回路中での扱いを変更した)。
定数の変更だが、Verilog風に、
整数'定数
で、整数ビットの定数値を作る。
定数プリフィックスには、0b, 0o, 0x などの従来の定数の他、10進定数 0dを定義した。
また、レジスタの宣言において、初期値を明示的に設定できるようにした。
module t { reg a<8>=0x80, b<8>=8'0d5, c<8>; c:=a+b; }
のような記述を許している。
sfl2vlの20090222版からのサポートとなる(ベータ版扱い)。
回路的には間違っていないし、シミュレーションでは動作しているのに、実機で動作していなかったMidway-8080であるが、問題は、メモリの初期化のためのBMMファイルにあった。BMMファイルには、ビットレーンを記述するので、下記のように記述したが、実は、XilinxのISEはビットレーン情報はビット数を計算するためだけに使っていて、値は見ていない。data2memで確認すると、全くの逆順にデータが格納されていた(!)。
そこで、BMMファイルに記述するビットレーンを逆順にしたら動きだした。
(画面にゴミが見えるのは、VRAMを256x240に設定しているからであり、インベーダーの解像度、256x224に合わせればゴミは消える)
蓋を開けてみれば、こんなことだ(笑)
これにデジタル処理の音声回路を付けたら完成だ♪
ただ、このボードには標準では音声の出力コネクタがないので、どこのピンに出すべきか…
そこで、BMMファイルに記述するビットレーンを逆順にしたら動きだした。
(画面にゴミが見えるのは、VRAMを256x240に設定しているからであり、インベーダーの解像度、256x224に合わせればゴミは消える)
ADDRESS_SPACE rom8k RAMB16 [0x0000:0x1fff] BUS_BLOCK board/rom/Mram_ram1 [1:0]; board/rom/Mram_ram2 [3:2]; board/rom/Mram_ram3 [5:4]; board/rom/Mram_ram4 [7:6]; END_BUS_BLOCK; END_ADDRESS_SPACE;
蓋を開けてみれば、こんなことだ(笑)
これにデジタル処理の音声回路を付けたら完成だ♪
ただ、このボードには標準では音声の出力コネクタがないので、どこのピンに出すべきか…
SFL2VLでは、データ端子に同時に複数の代入が生じた場合に、競合の検出を行なうようなVerilogコードを出していたが、疑似検出が多くあまり便利ではなかったので、コードを整理して、修正した。
20090217のベータ版のみでの対応だが、かなり効率的に競合の検出ができている(ような気がする)。
次のステップは、どの端子同士が競合を起しているかを出力するべきかどうかだが、競合発生時に、シミュレーションストップさせないと、出力が膨大になるので、対応を検討中。それと、合成された中間信号名で出力しても、分りにくいだろうしね~
20090217のベータ版のみでの対応だが、かなり効率的に競合の検出ができている(ような気がする)。
次のステップは、どの端子同士が競合を起しているかを出力するべきかどうかだが、競合発生時に、シミュレーションストップさせないと、出力が膨大になるので、対応を検討中。それと、合成された中間信号名で出力しても、分りにくいだろうしね~
ZIPファイルをハードディスクに展開するだけで、開発環境一式が揃うLiveCygwinに、nxtOSEKを搭載した、LiveCygwin-nxtOSEKを作成していたが、ETロボコンの推奨開発環境とツールのバージョンを合わせて、そのままETロボコンの開発環境として、利用可能とした。
私はETロボコンの技術委員だけれど、この環境自体は、ロボコンの公式環境ではなく、サービスとして提供するものであることに注意
自分の手持ちのLEGO NXTで動作確認を行ない正常動作を確認している。
ちなみに、LiveCygwinはCygwin環境がすでに構築されていても、同時起動しない限り、バッティングしないので、安心して試されたし。同時に動かしておかしくなった時には、再起動をおすすめ。
サンプルのHello Worldを実行するまでの手順は、以下になる。
0. LiveCygwin起動 (上のファイルを展開して、startup.batを実行)
1. NextToolでNXTファームウェアをインストール
NXTの裏のリセットボタンをピンの先で5秒程度押し、ファームウェアアップデートモードにする。(小さくクリック音が聞こえてくる状態)
PCを接続し、
私はETロボコンの技術委員だけれど、この環境自体は、ロボコンの公式環境ではなく、サービスとして提供するものであることに注意
自分の手持ちのLEGO NXTで動作確認を行ない正常動作を確認している。
ちなみに、LiveCygwinはCygwin環境がすでに構築されていても、同時起動しない限り、バッティングしないので、安心して試されたし。同時に動かしておかしくなった時には、再起動をおすすめ。
サンプルのHello Worldを実行するまでの手順は、以下になる。
0. LiveCygwin起動 (上のファイルを展開して、startup.batを実行)
1. NextToolでNXTファームウェアをインストール
NXTの裏のリセットボタンをピンの先で5秒程度押し、ファームウェアアップデートモードにする。(小さくクリック音が聞こえてくる状態)
PCを接続し、
cd /usr/nxttool/ ./NeXTTool /COM=usb -firmware=lms_arm_nbcnxc_106.rfw
しばらくすると完了。一旦、NXTの電池を抜いて、NXTを再起動する。
2. helloworld例題のコンパイル
cd /home/nxtOSEK/samples/helloworld make all
3. 実行ファイルダウンロード
sh rxeflash.sh
4: 実行
NXTの赤いボタンを押して、ダウンロードソフトを実行する。
それでは、ETロボコン参加者の皆さん、がんばりましょう♪
もう五年以上前の話になるが、(株)タイトーのご好意で、スペースインベーダのプログラムROMを教育用に提供していただいた。その時は、Midway game platformをFPGA上に実現し、もともとアナログ回路で実現していた効果音も、FPGA上で1ビットデジタル処理によるオリジナルDSP処理で出していた。使用したCPUは私が書下した8080A命令互換CPUである。
この時は、Midwayでは、白黒出力で、画面に色テープを張ってカラー表示していたところを、我々は、画面の場所ごとに、色を変えることで対応した。
SRAM/ROMには、汎用品を用い、画面出力は、NTSCカラーとして出していた。
昔の成果物を例題として、整理しようと考えていて、これらをFPGAの内部RAMとVGA出力に変更している。
CPUとVGA他の周辺回路を載せた状態の合成結果を下記に示す。
ゲート的にはまだまだ余裕がある。
まだ、音声は載せていないが、Verilatorでシミュレーションして、VRAMの中身をダンプして、正常動作を確認した。
FPGAにダウンロードするのは、これからだが、現状のシミュレーション画面を表示しておこう。
本画像のキャラクタの著作権は、(株)タイトーにある。
Copyright 1978 TAITO Corporation.
All rights reserved.
この時は、Midwayでは、白黒出力で、画面に色テープを張ってカラー表示していたところを、我々は、画面の場所ごとに、色を変えることで対応した。
SRAM/ROMには、汎用品を用い、画面出力は、NTSCカラーとして出していた。
昔の成果物を例題として、整理しようと考えていて、これらをFPGAの内部RAMとVGA出力に変更している。
CPUとVGA他の周辺回路を載せた状態の合成結果を下記に示す。
ゲート的にはまだまだ余裕がある。
Device utilization summary: --------------------------- Selected Device : 3s200ft256-5 Number of Slices: 666 out of 1920 34% Number of Slice Flip Flops: 279 out of 3840 7% Number of 4 input LUTs: 1279 out of 3840 33% Number of IOs: 42 Number of bonded IOBs: 34 out of 173 19% Number of BRAMs: 8 out of 12 66% Number of GCLKs: 1 out of 8 12% Number of DCMs: 1 out of 4 25%
まだ、音声は載せていないが、Verilatorでシミュレーションして、VRAMの中身をダンプして、正常動作を確認した。
FPGAにダウンロードするのは、これからだが、現状のシミュレーション画面を表示しておこう。
本画像のキャラクタの著作権は、(株)タイトーにある。
Copyright 1978 TAITO Corporation.
All rights reserved.
Apple-I互換システムでは、WozのモニタとキャラクタジェネレータROMの二つのメモリを初期化したかったというのは、前に書いた。これらの内容は、bitファイルを作成した後から、自由に書き換えられると便利なので、合成前のソースではなく、bmmファイルとmemファイルから勝手に初期化する方法を模索していた。
ところが、ISEの標準パスでは、memファイルは一つしか許されないということらしい。(二つを指定した時には文句を言われなかったのに、二つ目を新規作成しようとしたら、メッセージが出てきた)。
とういうことで、方針としては、二つのメモリを一つとして扱い、一気に初期化してしまうことに決めた。
Apple-Iシステムのメモリマップと、data2memの認識するメモリマップを一致させる必要は全くないので、モニタROMのBRAMを 0x000-0x7FFに設置し、VRAMを0x800-0xFFFとする。こうしておいて、memファイルの、CGパターンの始まる所に、アドレス指定記述を置く。
シリアルケーブルを持ってこなかったり、独立して使えるVGAモニタが東京の職場にはなかったりするので、実機での確認はできないが、bitファイルは正しく生成されていることをdata2memのbitファイルダンプ機能を使って確認ずみ。
分ってしまえば、なぁんだということは多い。
(でも、説明書にもう少し書くか、エラーメッセージくらい出せよと言っておこう)
ところが、ISEの標準パスでは、memファイルは一つしか許されないということらしい。(二つを指定した時には文句を言われなかったのに、二つ目を新規作成しようとしたら、メッセージが出てきた)。
とういうことで、方針としては、二つのメモリを一つとして扱い、一気に初期化してしまうことに決めた。
Apple-Iシステムのメモリマップと、data2memの認識するメモリマップを一致させる必要は全くないので、モニタROMのBRAMを 0x000-0x7FFに設置し、VRAMを0x800-0xFFFとする。こうしておいて、memファイルの、CGパターンの始まる所に、アドレス指定記述を置く。
シリアルケーブルを持ってこなかったり、独立して使えるVGAモニタが東京の職場にはなかったりするので、実機での確認はできないが、bitファイルは正しく生成されていることをdata2memのbitファイルダンプ機能を使って確認ずみ。
分ってしまえば、なぁんだということは多い。
(でも、説明書にもう少し書くか、エラーメッセージくらい出せよと言っておこう)
バレンタインにちなんで(?)、プリプロセッサに機能追加した。
%ifdef
%else
%endif
が、Cのプリプロセッサ同様に動作する。
それと、識別子中に、
abc%XX%def
と書くことで、マクロ定義した、XXを識別子の一部として認識させる。
ついでに、コメントのネストも動くようにした(はず)。
変更後のパッケージは、
次にある。
http://www.ip-arch.jp/sfl2vl.html
追記:電車の中であるが、ふと、ifdefがあって、ifndefがないのはどうよと思い、ifndefを追加した。上書きしたので、上のURLはそのまま。バタバタしていて、今回の機能はほとんど確認が取れていないので、上のパッケージは正式リリースではないことに注意。
もう一つついでに、SFL構文で使う数字に+/-で定数を付加することを許す。
のような使い方を許すことで、ライブラリ化に便利となる(はず)。
%ifdef
%else
%endif
が、Cのプリプロセッサ同様に動作する。
それと、識別子中に、
abc%XX%def
と書くことで、マクロ定義した、XXを識別子の一部として認識させる。
ついでに、コメントのネストも動くようにした(はず)。
変更後のパッケージは、
次にある。
http://www.ip-arch.jp/sfl2vl.html
追記:電車の中であるが、ふと、ifdefがあって、ifndefがないのはどうよと思い、ifndefを追加した。上書きしたので、上のURLはそのまま。バタバタしていて、今回の機能はほとんど確認が取れていないので、上のパッケージは正式リリースではないことに注意。
もう一つついでに、SFL構文で使う数字に+/-で定数を付加することを許す。
%d N 10 module test_%N% { input a<N> ; output f<N-1> ; f=a<N-2:0> ; }
のような使い方を許すことで、ライブラリ化に便利となる(はず)。
lburgの記述のマッチングパターンを増やし、コスト関数を工夫して、生成するコードの改良を図る。もちろん、まだ、ピープホール最適化をしているわけではないので、無駄なコードは出るのであるが、パターンマッチで最適化できる最低限のことはコンパイラの初期生成時に行なっておく方が結果が良いはずなのだ。
先日の、8クイーン問題のコンパイラ出力リスト(の一部)を下記に示す。
先日のコードより、2割程、生成するコードの大きさが小さく、よい感じになってきつつある。
先日の、8クイーン問題のコンパイラ出力リスト(の一部)を下記に示す。
先日のコードより、2割程、生成するコードの大きさが小さく、よい感じになってきつつある。
0448 06AD C8 INY 0449 06AE 91 F6 STA (R3),Y 0450 06B0 ;INDIRI2 0451 06B0 BA TSX 0452 06B1 BD 03 01 LDA $101+2,X 0453 06B4 85 F6 STA R3 0454 06B6 BD 04 01 LDA $102+2,X 0455 06B9 85 F7 STA R3+1 0456 06BB ;LSHI2 0457 06BB 06 F6 ASL R3 0458 06BD 26 F7 ROL R3+1 0459 06BF ;ADDP2 0460 06BF 18 CLC 0461 06C0 A5 F6 LDA R3 0462 06C2 69 3B ADC #x & 255 0463 06C4 85 F6 STA R3 0464 06C6 A5 F7 LDA R3+1 0465 06C8 69 09 ADC #x>>8 0466 06CA 85 F7 STA R3+1 0467 06CC ;INDIRI2 0468 06CC A0 00 LDY #0 0469 06CE B1 F8 LDA (R4),Y
VHDL EDAツールセットのAllianceを整理・拡張しようという
Herbプロジェクト
のMukundさんから、以前作成していたAlliance関連のチュートリアル資料の利用を打診してきた。
Allianceをきれいにしてもらえるのは大歓迎なので、さっそくOKを出したついでに、関連すると思われる他のチュートリアル資料も提示しておいた。
(といっても、全部、日本語なんですが…)
Mukundさんは、MOTIFを使っていたAllianceのGUIをGTKに置き換えようとしている。gtkならWindows版もあるので、ライブCDへの統合の可能性もある。Windowsでコンパイルできる環境を整えてもらえるように、お願いしてみようかな。
Herbプロジェクト
のMukundさんから、以前作成していたAlliance関連のチュートリアル資料の利用を打診してきた。
Allianceをきれいにしてもらえるのは大歓迎なので、さっそくOKを出したついでに、関連すると思われる他のチュートリアル資料も提示しておいた。
(といっても、全部、日本語なんですが…)
Mukundさんは、MOTIFを使っていたAllianceのGUIをGTKに置き換えようとしている。gtkならWindows版もあるので、ライブCDへの統合の可能性もある。Windowsでコンパイルできる環境を整えてもらえるように、お願いしてみようかな。