論理合成編はこちらから aki-fpga.com
前回の続きになります。 今回は論理合成後のログの確認になります。
Efinity 生成のレポート
合成を行うとプロジェクト直下に "outflow" ディレクトリが作成されます。 沢山ファイルが出力されていますが、この中の下記ファイルを開きます。
project_name.info.log
log ファイルには合成を行った時間と結果が記載されています。 辿っていくと Info や Warning が入り乱れているのが分かると思います。 数行程度なら良いですが、少し規模の大きい回路だと何千行も出力され、 重要な Warning を見落としてしまいます。(これはいけない)
しかも、このログ生成機能には恐ろしい点があります。 再度合成を行いファイルを見るとすぐ分かりますが、 今までの合成情報は残したままファイルに追記する形で結果が出力されます。
[何度か合成した様子、1万行は凄い...]
このままでは合成の度にファイルの容量がどんどん増えていってしまいます。 間違って git push したらクレームものです。 この乱雑なログをどうにかしたいと思います。
Python プログラムの作成
ソースコードは下記です。行っていることは単純で、Efinity が生成したログを読み込み、 Info,Warning,Error の結果に分けて新しくファイルを作成します。 読み込んだ情報を端末に色を付けて表示しつつ、元のログは削除します。 ファイル名は自動で取得する形式にしても良いですが、参照先を変更することは少ないので、このような処理にしました。
# ------------------------------------------------------------------------------ # 2023-05-29 # Python 3.10.4 # # Efinity 合成時に出力される Log ファイルから、Error/Warning/Info の項目で別ファイルに出力するプログラム # 経緯として、Efinity Log 出力は、前回のファイルの最終行から追記される形で出力される。(何故このような仕様なのかは不明) # そのため、何度か合成を行うとファイルサイズがドンドンと増加していく。 # デバッグがとてもやりにくいため、確認したい行を抽出し、参照元の Log は毎回削除することとした。 # # v1.00 new relaese # v1.01 ファイル関数を共通化 # ------------------------------------------------------------------------------ #------------------------------------------------------------------------------- # import 宣言 #------------------------------------------------------------------------------- import os #------------------------------------------------------------------------------- # 標準出力 関数 #------------------------------------------------------------------------------- BLACK = '\033[30m' RED = '\033[31m' GREEN = '\033[32m' YELLOW = '\033[33m' BLUE = '\033[34m' PURPLE = '\033[35m' CYAN = '\033[36m' WHITE = '\033[37m' END = '\033[0m' def paint(color, str): return color + str + END #------------------------------------------------------------------------------- # Efinity が生成する log を読み込み、Info,Warning,Err に分けて出力する #------------------------------------------------------------------------------- def file_export(rf, wf, exce, color): with open(wf, "w") as fw: try: with open(rf, "r") as f: try: for line in f: if exce in line: fw.write(line.rstrip("\n")+"\n") print(paint(color, line)) except FileNotFoundError as err: print(err) except FileNotFoundError as err: print(err) try: os.remove(rf) except FileNotFoundError as err: print(err) #------------------------------------------------------------------------------- # F5 の場合は python 実行ファイルではなく、ディレクトリからのパスになるため注意 #------------------------------------------------------------------------------- # import file r_log_err = "./outflow/K5Stack10_MIDI.err.log" r_log_War = "./outflow/K5Stack10_MIDI.warn.log" r_log_inf = "./outflow/K5Stack10_MIDI.info.log" # export file w_log_err = "./outflow/Info_Error.log" w_log_war = "./outflow/Info_Warning.log" w_log_inf = "./outflow/Info_Info.log" file_export(r_log_inf, w_log_inf, "INFO", CYAN) file_export(r_log_War, w_log_war, "WARNING",GREEN) file_export(r_log_err, w_log_err, "ERROR", YELLOW)
上記では info.log のみ確認しましたが、一緒に生成される下記ログも圧迫ファイルなので、消去します。
project_name.info.log project_name.warn.log project_name.err.log
Python の実行
作成した Python は python ディレクトリをの中に移動しました。 プロジェクトのカレントディレクトリから Python を実行してみます。
python3 python/Infolog.py --- 結果の一部、実機では色付けして表示される [EFX-0000 INFO] Resource Summary [EFX-0000 INFO] =============================== [EFX-0000 INFO] EFX_ADD : 813 [EFX-0000 INFO] EFX_LUT4 : 5058 [EFX-0000 INFO] EFX_MULT : 4 [EFX-0000 INFO] EFX_FF : 4722 [EFX-0000 INFO] EFX_RAM_5K : 91 [EFX-0000 INFO] EFX_GBUFCE : 3 [EFX-0000 INFO] =============================== [EFX-0034 WARNING] Project XML file specified. Source files specified in the command line are ignored.
outflor ディレクトリの中に下記ファイルが出力されているので確認します。 Info,Warning,Error の結果でまとまっていると思います。 端末に表示するのを Warning だけにしてみるとか、VSCode の Split 機能で片側にソースコード、 もう片方にログファイルを表示すると相当開発がしやすくなります。 FPGA 開発のログ量は凄まじいので、これでも確認は大変ですが、多少は見やすくなるでしょう。
Info_Info.log Info_Warning.log Info_Error.log
Python実行コマンド を tasks.json に記載
前回作成したコマンドに追記します。 これで、合成のあとに自動でpython が実行されます(ラクラク)
"command": "source /tools/efinity/2023.1/bin/setup.sh; efx_run.py ./Efinity-Project.xml --flow compile; python3 python/Infolog.py",
終わりに
次は シミュレーションについて記載予定です。 改善点や、もっと良い方法をご存知でしたら教えてください。