Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

XilinxのHLS front end のソースコードが github にて公開されました

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

はじめに

XilinxのHLSがgithubにアップされたのを知ったのは、2月27日です。

この時は、これはなんだかよくわからなかったんですが、その後、下記のような内容がTwitterでまわってきました。

forums.xilinx.com

これにより、github にアップされたのは、Vitis HLS の front-end 部のソースコードということが分かりました。

そして、昨日、EETimes にアップされた下記の記事を Linkedin で知りました。この記事には、Kick Ni さん (director of product marketing for AI and software, Xilinx)のコメントも載っています。

www.eetimes.com

Xilinx/HLS の中身

githubXilinx/HLS の中身を眺めてみました。

github.com

次の3つのディレクトリから構成されています。

  • LLVM
  • plugins
  • vitis_hls_examples

上記の vitis_hls_examples のディレクトリを覗くと、次のような High level flow の図が出ています (説明のために、図を引用します)

https://github.com/Xilinx/HLS/raw/2020.2/vitis_hls_examples/high-level-inject-flow.png

今回公開されたのは、図の上の方の HLS C/C++ から LLVM IR (output.bc) を生成する部分のようです。C/C++ に HLS 用の pragma (HLS XXXXなど) から

  • Preprocess : HLS Clang/Clang-tidy
  • Syntax checker : HLS Clang-tidy
  • Dataflow lawyer : HLS xilinx-dataflow-lawyer
  • Compilation : HLS Clang

で処理して、LLVM IR (output.bc) として出力する。というものらしいです。

Clangの Parse に、ParseXlxPragma.cpp というファイルがありました。この部分が 対応する pragma のようです。

  auto *Handle =
      StringSwitch<Handler>(str(MaybeName))
          .CaseLower("dataflow", HandleXlxDataflowPragma)
          .CaseLower("pipeline", HandleXlxPipelinePragma)
          .CaseLower("unroll", HandleXlxUnrollPragma)
          .CaseLower("loop_flatten", HandleXlxFlattenPragma)
          .CaseLower("loop_merge", HandleXlxMergePragma)
          .CaseLower("loop_tripcount", HandleLoopTripCountPragma)
          .CaseLower("inline", HandleInlinePragma)
          .CaseLower("interface", HandleInterfacePragma)
          .CaseLower("resource", HandleResourcePragma)
          .CaseLower("stream", HandleStreamPragma)
          .CaseLower("reset", HandleResetPragma)
          .CaseLower("allocation", HandleAllocationPragma)
          .CaseLower("expression_balance", HandleExpressionBanlancePragma)
          .CaseLower("function_instantiate", HandleFunctionInstantiatePragma)
          .CaseLower("array_partition", HandleArrayPartitionPragma)
          .CaseLower("array_reshape", HandleArrayReshapePragma)
          .CaseLower("top", HandleTopFunctionPragma)
          .CaseLower("occurrence", HandleOccurrencePragma)
          .CaseLower("protocol", HandleProtocolPragma)
          .CaseLower("latency", HandleLatencyPragma)
          .CaseLower("dependence", HandleXlxDependencePragma)
          .CaseLower("stable", HandleXlxStablePragma)
          .CaseLower("stable_content", HandleXlxStableContentPragma)
          .CaseLower("shared", HandleXlxSharedPragma)
          .CaseLower("disaggregate", HandleXlxDisaggrPragma)
          .CaseLower("aggregate", HandleXlxAggregatePragma)
          .CaseLower("bind_op", HandleXlxBindOpPragma)
          .CaseLower("bind_storage", HandleXlxBindStoragePragma)
          .CaseLower("extract", UnsupportPragma)
          .CaseLower("REGION", UnsupportPragma)
          .CaseLower("array_map", UnsupportPragma)
          .CaseLower("clock", HandleClockPragma)
          .CaseLower("alias", HandleMAXIAliasPragma)
          .CaseLower("data_pack", HandleDataPackPragma)
          .Default(HandleUnkwonPragma);

Clang-tidy は、HLS/llvm/clang-tools/extra/clang-tidy のことのようです。このディレクトリの下に、xilinx があります。
この中で Preprocess および Syntax check をするようです。これらのドキュメントも ここ にあります。

xilinx-dataflow-lawyer は、HLS/llvm/clang-tools/extra/xilinx-dataflow-lawyer のことのようです。

xilinx-legacy-rewriter というものが HLS/llvm/clang-tools/extra/xilinx-legacy-rewriter にありますね。

LLVMのTarget は、ここ (FPGA) にありますね。
ドキュメントは、ここ にありましたが、Xilinx FPGA Intrinsics だけしかありませんね。

IRBuilder が

にありました。

Analysis にもありました。

終わりに

githubソースコードを眺めましたが、オリジナルに対して追加された/変更されたファイルが分からないのでちょっと面倒でした。