※ ご覧になりたいQ&A 掲載号のタイトルをクリックしてください。
※ ご覧いただくにはSolvNet IDが必要です。
【 論理合成編: Design Compiler, PrimeTime 】
Today&Tomorrow 113/ サポートQ&A 論理合成編 Design Compiler
Q1 Synopsysツールのインストール方法が過去のバージョンでは、ユーザ指定したディレクトリにインストールできましたが、最新のバージョンでは出来ません。ユーザ指定したディレクトリにインストールする方法はありませんか?
Q2 DCTでのセッションをddcフォーマットで出力して、別の環境でそのddcを使用して合成を進めると、ddc内にハードコード化されたtluplusファイルのフルパス情報により、エラーが発生してしまいます。エラー回避の為、上書きする方法を教えてください。
Q3 Multibit register を含むLibraryを用いてMultibit Register Bankingを実行したところ、最適化のログに出現したWarningメッセージの意味は?
Q4 Design CompilerのTopographicalモードでのセル使用率の計算式を教えてください。
Q5 UPFデザインで、DCGの物理合成においてVoltage Areaを指定した場合の配線経路見積りにおいてVoltage Areaを考慮することは可能でしょうか?
Q6 Design Compiler Topographical Modeからstart_icc2コマンドを使用してICC2 Floorplan Explorationを実行しているのですが、ICC2 のGUIが起動直後exitしてDesign Compiler に戻ってしまいます。何か設定が抜けているのでしょうか?
Today&Tomorrow 112/ サポートQ&A 論理合成編 Design Compiler
Q1 最適化を行う前にSingle Bit RegisterとMultibit Registerの対応(一致性)を確認する方法はありますか?
Q2 update_bounds -removeを使って、特定の下位階層に対して別のboundsを作る処理をしているのですがErrorになってしまいます。何か制限がありますか?
Q3 ライブラリセルに対してセルごとに異なるderateを設定しています。DDCを読み込んだ時にderateの情報が保存されていません。DDC読み込み時に再度設定しないといけないのでしょうか?
Q4 使用するライブラリにどのようなタイプのインテグレーテッド・クロックゲーティング(ICG)セルが存在しているか確認する方法はありますか?
2018年
Today&Tomorrow 111/ サポートQ&A 論理合成編 Design Compiler
Q1 Verilog 2001を使用したcase文で、以下のように//synopsys full_case parallel_caseを付けています。SystemVerilogでは等価な記述がIEEEで定義されたと聞いています。どのように記述すれば良いですか?
Q2 ICGのEnableが0固定でクロックが止まっている構成の論理があるのですがICGのEnableを考慮して、クロックをとめるような設定は存在するでしょうか?
Q3 RTL infer multi bitフローでマルチビット化してるのですが、マルチビット化率が低く、report_multibitで原因を調査したところ、以下の”r3”分類されるレジスタが多いようです。原因としてどのようなことが考えられますでしょうか?
Attributes....
Q4 DFT挿入後のネットリストを入力として、ASCIIインターフェースのDCGでPhysical考慮の最適化を実施する場合にUser/Functionモードを考慮した配置をさせることは可能でしょうか?
Q5 optimize_netlist -areaを使用して面積削減を進めています。
その前のcompile_ultraコマンドでの合成では、set_multi_vth_constraintを設定してleakage最適化を行っています。optimize_netlist -areaでもleakage最適化を行うと聞いていますが、set_multi_vth_constraintの設定は考慮されますか。
Q6 複数のオプションをTcl変数を介してコマンドに渡す方法を教えてください。
Q7 Unix環境変数を利用したTclスクリプト記述時のエラーの対策方法をおしえてください。
Q1 Register Merge 機能に関して質問です。
1) デザイン全体でRegister Merge機能を停止するには?
2) 一部の階層のみfalseにするには?
3) 一部の階層のみtrueにするには?
4) inst_a階層以下にinst_bとinst_cがある場合inst_a階層へのfalse設定でinst_bとinst_cもfalse?
5) 設定を確認する方法は?
Q2 実際にRegister Mergingが行われたか確認する方法は?
Q3 RTLで推定されたレジスタに対して、特定のライブラリセルにマッピングする方法はありますか?
Q4 Design CompilerはIEEE Encryptionで暗号化されたファイルを読むことができますか?
Q5 合成時にDW minPower最適化を行う設定は?
Q6 特定ネットのファンアウト数を確認する際、経路上のバッファを考慮しない方法がありますか。
2017年
Q1 set_size_only コマンドで Size-Only指定されたリーフ・セルのコレクションを生成する方法はありますか?
Q2 デザイン中に、パラメータでインスタンスされるモジュールが存在します。しかし、elaborateコマンド実行後のモジュール名にはパラメータの値は追加されていますがパラメータ名は追加されません。なぜパラメータ名が追加されなかったのでしょうか?
Q3 DCT で合成後、write_sdc で SDC を出力するとネットの capacitance とresistance が set_load と set_resistance で出力されます。これらを出力させないようにする方法はありますか?
Q4 SystemVerilogモジュールをブラックボックスとしてリストする2つの変数がありますが、それぞれどのように扱われるでしょうか。
Q5 Design Compiler でバスのレジスタをマルチビット・レジスタにしていますが、マルチビット・レジスタにならないレジスタがあります。なぜマルチビット・レジスタにならないのか、理由を確認することは可能でしょうか?
Q6 スクリプトにall_faninコマンドを使用しているのですが、Design CompilerとDC Explorerで異なる結果となります。異なる結果となる要因は何でしょうか。
Q1 SystemVerilogでparameterに初期値の設定が無い以下の記述を使おうとしています。
module param_nondefault #( …
上位階層test.svでは以下の様にインスタンスしています。
param_nondefault #...
しかしDesign Compiler L-2016.03で読み込むとエラーとなります。
SystemVerilog IEEE Std 1800-2012によればparameterを使用したunpacked arrayが使えます。
=constant_param_expressionは[ ]で囲われているので、初期値はオプション設定になるので読み込みErrorになるのはおかしいのではないでしょうか?
Q2 SystemVerilogで以下の様にポート(in0, in1, out0, out1)に対し、Unpacked Array定義を使用しています。
module test #…
この記述を合成後にネットリスト出力したところ、Unpacked Arrayで定義したin0, in1, out0, out1が単純な32ビットのバスに展開されてしまいました。
module test …
これではUnpacked Array定義と対応が取れないのですが、なぜこのような出力になるのか理由を教えてください。
Q3 Power CompilerでIntegrated Clock Gating(ICG) セル挿入時に特定のライブラリセルの使用を制限することができますか?
Q4 set_dont_use -power コマンドで設定したICGセルをライブラリセルから確認する方法はありますか?
Q5 シフトレジスタ構成の4ビットレジスタに対し、create_multibitコマンドで4ビットのマルチビット・レジスタをマッピングする方法について教えてください。compile_ultra実行前のreport_multibitでは指定したレジスタはマルチビット対象として認識されているが、
compile_ultra -scan 実行後、マルチビット・レジスタにマッピングされません。どのようにすればマルチビット・レジスタにマッピングできるでしょうか。
Q6 Design Compile GraphicalやDC Explorerでマルチビット・レジスタを使用した合成を行っていますが、合成後にマルチビット化率を確認する方法はありますか?
Q7 階層設計において、下位階層をBlock Abstraction Modules(BAM)として、トップモジュールに組み入れ、GUIのLayout Viewerで確認すると、トップモジュールのスタンダードセルは見えますが、BAM内のスタンダードセルが見えません。BAM内のスタンダードセルを見えるようにするにはどうすればいいですか?
Q8 Design Compiler Graphical を使用しています。report_timing コマンドで確認したパスの経路を GUI で簡単に確認する方法はありますか?
Q9 report_qor の結果をグラフなどで見やすくする方法はありますか?
Q10 Logic0/1や case analysis設定の定数が伝播しているピンを確認する方法はありますか?
Q1 Design Compiler®上でCPU時間やメモリーをチェックするコマンドがあるのは知っていますが、実行マシンのロード状況や、メモリーなども合せて確認する方法はありますか?
Q2 DC Ultra™ Topographical modeにてTiming Worst条件となるライブラリとTLUPlusを使った最適化を実施しています。本来であれば、Timing Worstに加えLeak Worstとなるシナリオを設定し、MCMM(マルチコーナー / マルチモード)最適化を実施すべきですが、最適化後のネットリストを使用して、暫定的にライブラリとTLUPlusを差し替えたPower Reportを取得したいと考えています。どのようにすればこのようなPower Reportが得られますか?
Q3 Design CompilerのRM(Reference Methodology)を使用して階層設計を実施しています。下位階層デザインをBlock Abstractionで設計し、上位階層の最適化時に読み込んでいるのですが、デザインの読み込みに非常に時間がかかっています。読み込みを加速させる手段はありますか?
Q4 DC Explorerを実行後、解析のためにGUI(Graphical User Interface)の論理段数ヒストグラムを使用しています。バッチモードで論理段数をレポートする機能はありますか?
Q5 Design Compilerでの最適化後、複数のタイミング違反パスを確認すると、いくつかのパスで「ripple adder」を使用していました。なぜ、Design Compilerは遅延が生じるripple adderを選択するのですか?また、その使用を抑制する方法はありますか?
Q1 Design Compiler®は、Multi Driven Netに対して自動的にANDゲートを挿入する仕様になっているようですが、ANDゲートの挿入を抑える方法はありますか?
Q2 リンクしているライブラリに含まれるマルチビット・レジスタのライブラリ・セルのコレクションを取得したいのですが、簡単な方法はありますか?
Q3 マルチビット・レジスタ・セルとシングルビット・レジスタ・セルの対応を確認したいのですが、なにか良い方法はありますか?
Q4 図のような構成でクロック・ゲーティング(CG)を挿入したネットリストがあります。アクティビティ情報を設定して解析したところ、クロック・ソースに近いCG0 / CG10 / CG11の停止期間が長くないことがわかりました。CGの段数が多く、CTS(クロックツリー合成)後、クロックツリーの電力が大きくなる懸念があるため、CGの段数を減らしたいと考えています。何か良い方法はありますか?
Q5 Q4の回答からCGセルがマージできることはわかりました。マージした場合、イネーブル信号がどのように変化したのかを簡単に確認する方法はありますか? またその際、Formality®でのチェックに支障はありませんか?
Q6 create_auto_path_groupsの機能を使ってパス・グループを生成したいのですが、マクロの数が非常に多く、パス・グループがたくさんできてしまいます。パス・グループ生成の対象からマクロを外すことはできますか?
Q7 フロアプラン(DEFフォーマット)入力でDesign Compiler Graphicalを使用しているのですが、DEFに定義されたSoft Blockage(ソフト・ブロッケージ)のエリア内にレジスタが配置されるケースがあります。これを抑える方法はありますか?
2016年
Q1 Design Compiler®のGUI(Graphical User Interface)を使わずに特定のオブジェクトからRTLをCross-Probingする方法はありますか?
Q2 Design Compilerの合成では、マルチコアでの実行はサポートされていますか?サポートしている場合、1ライセンスあたり何コアまで使用できますか?
Q3 Design Compilerで4コアを指定してcompile_ultraを実行したのですが、シングルコア実行時と比較しても実行時間にあまり差がありませんでした。set_host_options -max_cores 4を設定していますが、これ以外に他の設定が必要なのでしょうか?
Q4 Design Compiler Graphical K-2015.06バージョンのフィジカル合成結果をL-2016.03バージョンで開きコンジェスチョン・マップを確認したところ、配置が同じにもかかわらずL-2016.03の方が混雑しているように見えます。これはどういった現象ですか?
Q5 タイミング改善にパス・グループを作りたいのですが、良い機能はありますか?
Q6 report_qorコマンドで各group_pathのWNS(Worst Negative Slack)やTNS(Total Negative Slack)を確認していますが、結果をWNSの悪い順にレポートすることは可能ですか?
Q7 非常に配線が混雑しているデザインで、既にDesign Compiler Graphical(compile_ultra -spg)を使用しています。少しでも混雑を改善したいのですが、何か対策はありますか?
Q8 論理合成実行中に(OPT-150)と(OPT-314)のメッセージが出力されました。組み合わせ回路のタイミング・ループがあるようなのですが、このメッセージは何を意味しているのですか?
Q9 図のような組み合わせ回路のタイミング・ループをレポートするコマンドはありますか?また、タイミング・ループを確認するコマンドはありますか?
Q10 デザインを読み込んだ後に、set_disable_timingコマンドで明示的にタイミング・ループを遮断しました。report_timingの-loopオプションやcheck_timingコマンドでタイミング・ループが表示されないのはなぜですか?
Q11 (OPT-314)のWarningメッセージに(originally by case_analysis)と表示されています。これは何を意味しているのですか?
Q1 定数の乗算が多くあるデザインです。乗算器は大きくて遅いという認識から、今までは以下のようにシ フト演算結果を用意して使用していました。これが一番良い結果を得られる方法だと考えていますが、他に良い書き方はありますか?
Q2 set_register_typeコマンドを使用して、いくつかのレジスタに特定のフリップフロップ(またはラッチ)がマッピングされるよう設定しています。
set_register_typeコマンドに-exactオプションを追加すると、指定したフリップフロップをマッピングします。
-exactオプションを使用しない場合、どのようなセルがマッピングされるか確認することはできますか?
Q3 あるブロックを対象にset_optimize_registersを設定していますが、下記のメッセージにあるようにリタイミングが停止してしまいました。
RTDC-136 (error) Aborting retiming of design %s.
停止した理由とリタイミング実施の方法を教えてください。
Q4 設計の初期段階で、すべての物理ライブラリ(Milkyway™ / LEF)がそろっていない状態ですが、フィジカル・シンセシスを実行する方法はありますか?
Q5 Design Compilerを使用して、多電源ドメイン間に挿入されるレベルシフタの挿入チェックを実施しようと考えています。現状では多電源対応の正しいライブラリは準備できていないため、既存のプリミティブ・セルを擬似レベルシフタとして使用したサンプル・デザインを準備しています。このサンプル・デザインに対して、最低限の設定でcheck_level_shifterおよびreport_level_shifterでのチェックを実施したいのですが、良い方法はありますか?
Q1 K-2015.06バージョンより、Design Compiler®やIC Compiler™の一部として組み込まれていたLibrary Compiler™は、スタンドアロンとしてインストールする必要があるとの情報を得ました。詳細を教えてください。
Q2 (Q1の続き) Design Compiler K-2015.06リリースから、インストール・イメージにLibrary Compilerが含まれず、別途インストールしてリンクを作成する方法に変更されましたが、メジャー・リリースのサイクルがそれぞれ異なるので同一バージョンが存在しない場合は、どのような組み合わせのリンクを行えば良いですか?
Q3 図のような回路を論理合成しようとしています。セレクタ(MUX)の前後にデータパスがあるのですが、データパス抽出によるCarry Save Adder Tree化(DP_OP化)※2は可能ですか?
※2 Carry Save Adder Tree化(DP_OP化)に関しては 「Today&Tomorrow 99号 サポートQ&A論理合成編 Q1」をご参照ください
Q4 設計初期段階のデザイン(RTL)をDesign Compilerで読み込み、analyze / elaborate / linkを実行したところ、LINK-5『resolve reference』のメッセージが出力されました。オンライン・マニュアルでLINK-5を調べてみましたが、何のメッセージなのかわかりません。このメッセージについて教えてください。
Q5 デザイン内に存在するライブラリ化されているクロックゲーティング・セル(インテグレーテッド・クロックゲーティング・セル)を抽出したいのですが良い方法はありますか?
(Power Compiler™で挿入したインテグレーテッド・クロックゲーティング・セルだけでなく、RTLに直接記載しているセルも含めて抽出)
Q1 RTLからAdder Treeなどの論理構造を解析したいのですが、何か良い方法はありますか?
Q2 target_libraryに複数のVth(しきい値電圧)を持つライブラリを指定していますが、最適化中にそれぞれの使用率の推移を確認することはできますか?
Q3 あと少しタイミングQoR(Quality Of Results)を改善したいとき、compile_ultraを使った、短時間で簡単かつ効率的に結果を出せるオプション設定などはありますか?
Q4 Design Compiler GraphicalのSPG(Synopsys Physical Guidance)フローでは、変数compile_register_replicationがデフォルトのtrueとなっているため、合成中、必要に応じて全回路にわたりレジスタ複製を実行します。特定のレジスタのみ複製を回避することはできますか?
Q5 Design Compilerで、マルチビット化されたレジスタと元のシングルビット・レジスタを確認したいのですが、何か方法はありますか?
Q6 “マルチビット・レジスタ・バンキング”を行った際のバンキング情報を確認する手段として、
1. report_multibitコマンドの出力結果
2. identify_register_banksコマンド実行時のログで確認する方法
これらの2つの手段がありますが、(RTL推定後の)compile_ultra実行後、およびPhysical-Awareマルチビット・レジスタ・バンキング実行後のそれぞれで、累積のバンキング率を算出する良い手段はありますか?
Q7 Design Compiler上で、クロックが到達していないレジスタやマクロを簡単に見つけることはできますか?
Q8 Design Compilerで、階層出力ピンに接続している階層内のネットを抽出したいのですが、うまく抽出できません。なにかよい方法はありますか?
Q9 タイミング例外(false_path、multicycle_path)が設定されたレジスタをリストアップしたいのですが、簡単に取得する方法はありますか?
Q10 特定のライブラリ・セルを使用したインスタンス・セルを通過するタイミング・パスを、下記の設定で“disable”にし、report_timingコマンドで“No paths”になっていることを確認した後、.ddcファイルに保存しました。
set_disable_timing [get_lib_cells slow/bufd1] -from A -to Z
しかし、保存した.ddcファイルを再読み込みしたところ、set_disable_timingを設定したはずのパスが確認できてしまいます。これはなぜでしょうか?
Q2 図1のように、現在一時的に入力オープン(Undriven)となっている階層ピン“MEMWRAP/TEST”を含むデザインがあります。
この階層ピンは後工程でネット接続するため、入力オープン(Undriven)のままの状態でcompile_ultraを実行したのですが、図2のようにこの階層ピンにドライブされているサブ階層内の接続が削除されてしまいました。
なぜ、サブ階層内の接続が削除されてしまったのでしょうか? また、この接続を保持する方法はありますか?
Q3 RTLのいくつかの階層に、機能追加のため数百ゲートのセルを挿入し、それらのセルの接続関係を合成後まで保持させようと考えています。また、これらのセルは階層としてまとめて挿入しておらず、個々のインスタンス名を把握できていません。該当するセルをコマンドで抽出して、size_onlyまたはset_dont_touchを一括で設定する方法はありますか?
Q4 入力32ビット幅、出力64ビット幅の積和演算処理が必要になり、論理合成でタイミングと面積を改善するためにDesignWareコンポーネントであるDW02_mult、DW01_addをRTLにインスタンス記述しました。DW02_mult、DW01_addを使用したので、最も良いタイミングおよび面積が得られることを期待しています。
記述例
`define width 32…
ところがcompile_ultra実行後にreport_resources -hierarchyを実行したところ、以下のようなメッセージが出力されました。
Information: …
DW02_mult、DW01_addをインスタンス記述するのではなく、演算子 *, +, -を使用する方が良い結果が得られるのでしょうか?
Q5 RTL内にインスタンス記述されたDesignWareコンポーネントのセル名を取得する方法はありますか?
Q6 階層ピンに接続するネットをDesign Compilerで抽出する際、そのピンに接続する階層内部のネットが抽出できません。指定した階層ピンに接続する階層内部のネットを抽出する方法はありますか?
Q7 最適化中、WNS(Worst Negative Slack) / TNS(Total Negative Slack) / Elapsed Timeといった情報が表示されますが、この表示内容は変更できますか?(例:メモリー使用量を表示するなど)
Q1 以下のような演算を含むRTLをcompile_ultraで最適化しました。
wire [7:0] a, b, c, z;
assign z = a + b + c;
使用された加算器を確認するためにreport_resources -hierarchyを実行したところ、DP_OP_***という表示が出てきました。このDP_OP_***というのは何ですか?また、加算器が2個レポートされないのはなぜですか?
Q2 入力32ビット幅、出力36ビット幅の積和演算が必要になり、以下のような記述をしました。
wire [31:0] a, b, c, d,
wire [34:0] temp0, temp1;
wire [35:0] z;
assign temp0 = a * b;
assign temp1 = c * d;
assign z = temp0 + temp1;
temp0、temp1は、必要な精度と入力a、b、c、dの有効範囲を検討し、最小の35ビット幅にして乗算器の面積を少しでも削減しようとしています。上記のRTLをcompile_ultraで合成し、使われた演算器を確認するためにreport_resources -hierarchyを実行したところ、下記のようなInformationが出力されました。
Information: Operator associated with resources 'add_5
(test.v:5)' in design 'test' breaks the datapath extraction
because there is leakage due to truncation on its fanout to
operator of resources 'add_6 (test.v:6)'. (HDL-120)
このInformationは何を意味しているのでしょうか?
Q3 compile_ultraを実行したところ、わずかにネガティブ・スラックとなるタイミング・パスが残ってしまいました。report_timingにてタイミング・パスを確認したところ、論理段数が多く、最適化されていないように思われます。以前このようなケースではcompile_ultraに-timing_high_effort_scriptオプションを付けて解決していたのですが、使用したところ無効なオプションだというワーニングが出力されました(OPT-1342)。このオプションは使用できないのでしょうか?またこのネガティブ・スラックとなったタイミングを改善することはできますか?
dc_shell> compile_ultra -timing_high_effort_script
Warning: The -timing_high_effort_script option is ignored. (OPT-1342)
Q3 合成済みネットリストの面積削減のためにoptimize_netlist -areaコマンドを使用しています。定数レジスタが存在するので削除したいのですが、optimize_netlist -areaコマンドでは削除できないようです。これはコマンドの仕様ですか?
Q4 RTL記述にSystemVerilogのinterface文を使用してボトムアップ階層設計を進めています。interface文では階層セルのポートは、下記(左)のようなピリオド( . )でポート名を記述します。sub階層を単独合成した後ではchange_namesにより、下記(右)のようにB.Xがアンダースコア( _ )を使ったB_Xに変わってしまいます。topモジュールではsub階層とのlink時に下記のようなLINK-1エラーが発生し、統合できません。何か対処方法はありますか?
Q5 ボトムアップ合成を行っています。下位階層の合成結果を保存したDDCファイルが複数あるため、どのファイルを現在参照しているか確認したいのですが、何か方法はありますか?
Q6 Design Compiler Graphicalを用いたトップレベル・デザインの最適化で、階層ブロックのモデルとしてBlock Abstractionを使用しています。この際、Block Abstraction内部のタイミング・パス(Block Abstraction内のReg - Reg間パス)がトップレベル・デザイン上でレポートされているのですが、なぜですか?
Q7 Design Compiler GraphicalでPhysically Aware Register Banking機能であるidentify_register_banksコマンドを実行する際に、“Input map file”と“Register group file”が必要と聞いていますが、それぞれどのように準備すればよいですか?
Q8 異クロック間のパスのクロックの組み合わせを確認する方法はありますか?
Q9 バージョンJ-2014.09-SP1から、タイミング解析の変数名が変わったものがあります。またデフォルト値が変わったものもありますが、これらを変更した理由と変更点を教えて下さい。
Q10 J-2014.09-SP1より、set_clock_sense -stop_propagationの動作が変更になっています。J-2014.09以前の動作と同等の解析をしたいのですが、よい方法はありますか?
Q3 マルチVthライブラリを使用してリークの最適化を行なっています。各ライブラリのリーク、タイミングの特性を知るために、今までは特定のセルをマッピングしてreport_powerでリーク値、report_timingでタイミング値を取得していましたが、簡単にすべてのセルを考慮した特性を知ることはできますか?
Q4 -spgオプションを付けてDesign Compiler Graphical合成をしています。タイミングがクリティカルなネットは自動的に上層レイヤが使用される(Layer Optimization)と認識しています。実際にどのネットが上層レイヤに割り付けられたかを知るには、どのように調べればよいですか?
Q5 all_fanoutのコマンド結果がDesign CompilerとDC Explorerで異なります。なぜですか?
Q6 IC Compilerにはリーフ・セルのコレクションを作成するget_flat_cellsコマンドがありますが、Design Compilerにも同様のコマンドはありますか?
Q7 クロック定義がされているにも関わらず、タイミング・レポート上でレポートされないタイミング・パス・グループが存在するのはなぜですか?
Q8 Design Vision上で効率的に回路図をトレースする方法はありますか?
Q9 synencでユーティリティを暗号化しているのですが、info bodyでプロシージャのコードがすべて見えてしまいます。
dc_shell>info body [procedure名]
このようなコマンドでも中身を表示させないようにするにはどうすればよいですか?
Q10 合成スクリプト実行時、各種コマンドが実行される際にどのようなライセンスを取得しているのかを確認する手段はありますか?
【 論理合成編: 2014年以前 Design Compiler 】