以下、実施形態の一例について図面を参照しつつ説明する。
[クロックツリー生成装置]
まず、本実施形態に係るクロックツリー生成装置のハードウェア構成について説明する。図1は、本実施形態に係るクロックツリー生成装置を構成するコンピュータ910のハードウェア構成例を示すブロック図である。
バス914には、CPU911と、RAM912と、ROM913と、可換媒体記憶装置915と、外部インターフェース916とが接続されている。
CPU911は、データの処理及び演算を行うと共に、バス914を介して接続された上記の構成ユニットを制御するものである。ROM913には、予めブートプログラムが記憶されており、このブートプログラムをCPU911が実行することにより、コンピュータ910が起動する。図示しないハードディスクなどにコンピュータプログラムが記憶されており、そのコンピュータプログラムがRAM912にコピーされ、CPU911により実行される。CPU911は、コンピュータプログラムを実行することにより、後述するクロックツリー生成に係る処理を行う。
なお、本発明における取得手段、フリップフロップ数特定手段、クロック特定手段、及び分割手段、並びにバッファ挿入手段は、CPU911が、ROM913などに記憶されたプログラム(クロックツリー生成プログラム)を実行することで実現される。
可換媒体記憶装置915は、CD−ROMやフロッピーディスクなどの媒体924を動作させる装置である。外部インターフェース916は、コンピュータ910内部と外部とを接続するインターフェースであり、ネットワークに対してコンピュータプログラム及びRTL設計データ等を入出力することができる。ディスプレイ920は、コンピュータ910からの出力表示を行い、キーボード921及びマウス922はコンピュータ910への情報入力に使用される。モデム923は、LANや電話線などを通じてネットワークと接続する。
本実施形態は、コンピュータ910がプログラムを実行することによって実現することができる。また、プログラムをコンピュータ910に供給するための手段、例えばかかるプログラムを記録したCD−ROM等のコンピュータ読み取り可能な記録媒体又はかかるプログラムを伝送するインターネット等の伝送媒体も本発明の実施形態として適用することができる。また、上記のプログラムを記録したコンピュータ読み取り可能な記録媒体等のコンピュータプログラムプロダクトも本発明の実施形態として適用することができる。上記のプログラム、記録媒体、伝送媒体及びコンピュータプログラムプロダクトは、本発明の範疇に含まれる。記録媒体としては、例えばフレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、磁気テープ、不揮発性のメモリカード、ROM等を用いることができる。
[比較例の問題点]
本実施形態を説明する前に、従来から行われている比較例の問題点などについて説明する。
図2は、第1比較例に係るクロックツリーシンセシス(以下、「CTS(Clock Tree Synthesys)」と表記する。)を説明するための図を示す。CTSは、回路内に供給されるクロック供給ラインに発生するスキュー(クロック遅延差分を意味する。以下同様とする。)を低減させるための手法である。
第1比較例では、CTS実行時は、マスターのクロックがルートとして用いられる。具体的には、図2において、バッファ101がクロックルートセルとなる。「クロックルートセル」とは、複数のセルを駆動するためのクロックを発生するセルに相当する。また、分周クロック生成用の分周FF102はスルー指定されることで、バッファと同じ扱いとなる。この場合、バッファ101からのクロックは、クロックツリー103(クロックツリー104も含むものとする。)を介して、複数のフリップフロップ(以下、単に「FF」とも表記する。)から構成されたFF群105まで伝搬される。なお、FF群は実際にはFF以外の構成要素も有する。本明細書では、このようなFF以外の構成要素と複数のFFとを有する集合体を「FF群」と呼ぶこととする。
基本的にはFFはバッファよりも遅延時間が大きいため、第1比較例では、バッファ101からFF群105までのパスディレイ(即ちインサーションディレイ。本明細書では、クロックルートセルからFF群内のFFセルまでのパスディレイを「インサーションディレイ」と呼ぶ。)が増加する傾向にある。そのため、クロックパスの遅延(クロック遅延)が大きくなる。よって、第1比較例では、チップ内バラツキを考慮した際に発生するスキューにより、タイミングエラーが発生し易いと言える。また、第1比較例では、バッファ101からのクロックで駆動されるFF数が多いため、言い換えるとクロックツリー103に含まれるFF数が多いため、クロックツリー103が大きくなる傾向にある。これにより、最も遅延の大きいクロックパスに合わせてスキュー調整が行われるため、回路全体のインサーションディレイが大きくなると言える。
図3は、第2比較例に係るクロックツリーシンセシスを説明するための図を示す。第2比較例では、クロックツリーシンセシスのルートが分割される。具体的には、破線117で示すようなバッファ111から分周FF112までの接続によって、クロックツリー113とクロックツリー114とに分割される。この場合、バッファ111及び分周FF112がクロックルートセルとなり、バッファ111からのクロックでFF群115が駆動され、分周FF112からのクロックでFF群116が駆動される。
図4は、図3に示した回路を別の表現により示した図である。なお、図3と同一の符号を付した構成要素については同一の意味を有するものとして、その説明を省略する。図4において、FF115aはFF群115を構成するFF(言い換えるとクロックツリー113に含まれるFF)の1つであり、FF116a、116bはそれぞれFF群116を構成するFF(言い換えるとクロックツリー114に含まれるFF)の1つである。また、FF115aとFF116aとは組合回路119aを介してデータの授受を行い、FF116aとFF116bとは組合回路119bを介してデータの授受を行う。なお、バッファ111はマスタークロックを生成し、バッファ118はクロックルートセルとなる。
第2比較例のようにルートを分割することで、第1比較例と比較して、ルート単位の駆動FF数が減少するため、クロックパスの遅延が減少する傾向にある。また、第2比較例に係るクロックツリー113、114は、第1比較例に係るクロックツリー103と比較して、駆動FF数が少ないため、インサーションディレイが小さくなる。更に、第2比較例では、分周FF112の遅延時間がキャンセルされる。しかしながら、第2比較例では、クロックツリー113とクロックツリー114との間のスキューが大きいため、異なるクロック間でのデータの受け渡し時に、タイミングエラーが発生し易いと言える。言い換えると、クロックツリー113とクロックツリー114との間のスキューにより、クロックタイミングの調整を行いにくいと言える。
次に、図5及び図6を参照して、チップ内バラツキについて具体的に説明する。
図5は、チップ内バラツキを考慮する場合の基本的手法を説明するための図を示す。図5に示す回路では、FF121とFF122とが組合回路123を介してデータの授受を行い、FF121、122は、それぞれ分岐点124で分岐された経路125a、126からクロックが供給される。基本的には、チップ内バラツキを考慮する場合、分岐点124から先のPTV条件(Process、Temperature、Voltage)を変えて、遅延が求められる。この場合、分岐点124を起点とする経路125a、125b(以下、単に「経路125」と表記する。)と経路126とでは、PTV条件が異なる。
ここで、回路がターゲット周波数で動作するためには、「セットアップ制約」及び「ホールド制約」の2種類のタイミング制約を満たすことが望ましい。一般的に、送り側のFF121から出力された信号が、受け側のFF122に到達するタイミングは、現クロックの後、つぎのクロックの前になければならない。信号の到達が現在のクロックよりも後に届くことを保証するのが「ホールド制約」であり、次のクロックよりも前に届くことを保証するのが「セットアップ制約」である。
基本的には、セットアップ制約についての解析を行う場合には、経路125については最も遅いPTV条件に設定され、経路126については最も早いPTV条件に設定される。これに対して、ホールド制約についての解析を行う場合には、経路125については最も早いPTV条件に設定され、経路126については最も遅いPTV条件に設定される。なお、分岐点124の位置がFF121、122に物理的に近いほど、チップ内バラツキの影響を受けにくくなる。
図6は、図5に示したFF121、122の動作例を示す。図6(a)〜(c)は、それぞれ、横軸に時間を示しており、上から順に、マスタークロックの信号の立ち上がり、FF121のクロック端子での信号の立ち上がり、FF122のクロック端子での信号の立ち上がりを示している。図6(a)は、チップ内バラツキを考慮しない場合の動作例を示している。これより、クロックパスの遅延にチップ内バラツキ成分が混じっていないため、FF121、122のクロック端子での信号の立ち上がりエッジが揃っていることがわかる。
図6(b)及び図6(c)は、チップ内バラツキを考慮した場合の動作例を示している。具体的には、図6(b)は、セットアップ制約についての解析時の動作例を示している。この場合、クロックパスの遅延にチップ内バラツキ成分が混じるため、セットアップ制約を満たすことが厳しくなる方向に、FF121、122のクロック端子での信号の立ち上がりエッジが揃わなくなる傾向にある。一方、図6(c)は、ホールド制約についての解析時の動作例を示している。この場合、クロックパスの遅延にチップ内バラツキ成分が混じるため、ホールド制約を満たすことが厳しくなる方向に、FF121、122のクロック端子での信号の立ち上がりエッジが揃わなくなる傾向にある。
次に、図7を参照して、一般的なチップ内バラツキへの対応策について説明する。図7に示す回路は、バッファ131をクロックルートセルとし、分岐点141において分割された階層132、133を有する。階層132、133は、それぞれ、FF群138、139にクロックを伝搬するクロックツリー136、137を有する。
一般的には、分岐点がFFに近いほどチップ内バラツキの影響を受けにくくなるため、これを考慮して、階層132、133のそれぞれのクロック入力端子にバッファ134、135が挿入される。これにより、クロックの分岐点142、143が末端のFF群138、139を構成するFFに近くになるため、チップ内バラツキに起因するタイミングエラーが発生しにくくなる。具体的には、例えば図7中の実線矢印で示すような同じ階層内での経路については、分岐点142、143がFFに近くなるため、このような効果が得られると言える。しかしながら、例えば図7中の破線矢印で示すような異なる階層を跨ぐ経路については、分岐点142、143がFFから遠いため、このような効果はほとんど得られないと言える。
[本実施形態に係るクロックツリー生成方法]
次に、本実施形態に係るクロックツリー生成方法について具体的に説明する。
本実施形態では、クロックツリー生成の対象となっている回路(具体的にはLSI。以下同様とする。)について、駆動しているFF数が少ないクロック(クロック周波数を意味する。以下同様とする。)により駆動されるFFを抽出し、抽出されたFFとデータの授受を行うFFに基づいてクロックツリーを分割する。つまり、抽出されたFFにデータを出力するFF(以下、適宜「始点側FF」と呼ぶ。)、及び抽出されたFFからデータが入力されるFF(以下、適宜「終点側FF」と呼ぶ。)に基づいて、CTSのルートを分割する。具体的には、始点側FF及び終点側FFのそれぞれから接続先のFFを走査することで、クロックツリーを分割する位置を決定する。このような本実施形態によれば、クロック遅延を調整し易くなるため、タイミングエラーを適切に収束させることが可能となる。
更に、本実施形態では、上記のようにクロックツリーを分割する位置にバッファを挿入する。言い換えると、バッファを挿入することで、CTSのルートを分割する。これにより、スキューを調整し易くなるため、タイミングエラーの収束性を効果的に向上させることが可能となる。
図8は、本実施形態に係るクロックツリー生成方法を適用した回路例を示す。図8に示す回路は、主に、5つのFF151〜155及び3つの組合回路156a〜156cを有する。FF152はクロック161で駆動され、FF151、153、154、155はクロック162に応じたクロックで駆動される。つまり、FF151、153、154、155は、同一のクロック系のFFである。
この場合、クロック161は、駆動しているFF数が少ないクロックに相当し、FF152は、駆動しているFF数が少ないクロック161により駆動されるFFに相当する。なお、駆動しているFF数が少ないクロック161としては、例えば高速クロックや、かなり低い周波数のクロックなどが挙げられる。また、FF151、153は、駆動しているFF数が少ないクロックにより駆動されるFF152とデータの授受を行っているFFに相当する。具体的には、FF151は始点側FFに相当し、FF153は終点側FFに相当する。一方、FF154、155は、駆動しているFF数が少ないクロックにより駆動されるFF152とデータの授受を行っていないFFに相当する。
このような回路に本実施形態を適用した場合、FF152とデータの授受を行っているFF151、153の前にバッファ157が挿入される。つまり、FF151及びFF153のクロック端子の前にバッファ157が個別に挿入される。この場合、バッファ157はクロックルートセルとなる。一方、バッファ157の挿入に伴って、FF152とデータの授受を行っていないFF154、155の前にもバッファ158が挿入される。具体的には、バッファ157を挿入した位置と同様の位置に、つまりFF154及びFF155のクロック端子の前に、バッファ158が個別に挿入される。この場合、バッファ158はクロックルートセルとなる。このようにFF152とデータの授受を行っていないFF154、155の前にもバッファ158を挿入しているのは、新たにクロックルートセルとなるバッファ157と同じレベルのクロックルートセルを設けることが望ましいからである。
図9は、本実施形態に係るクロックツリー生成方法を適用した他の回路例を示す。具体的には、図4に示した回路に、本実施形態に係るクロックツリー生成方法を適用した例を示す。なお、図3及び図4と同一の符号を付した構成要素については同一の意味を有するものとして、その説明を省略する。
図9に示す回路では、FF115aは、駆動しているFF数が少ないクロックにより駆動されるFFに相当する。また、FF116aは、駆動しているFF数が少ないクロックにより駆動されるFF115aとデータの授受を行っているFFに相当する。具体的には、FF116aは、終点側FFに相当する。一方、FF116bは、駆動しているFF数が少ないクロックにより駆動されるFF115aとデータの授受を行っていないFFに相当する。
このような回路に本実施形態を適用した場合、FF115aとデータの授受を行っているFF116aの前にバッファ171が挿入される。一方、バッファ171の挿入に伴って、FF115aとデータの授受を行っていないFF116bの前にもバッファ172が挿入される(その理由は、前述した通りである。)。この場合、バッファ171、172は、それぞれクロックルートセルとなる。このようにバッファ171、172を挿入することで、前述したクロックツリー114(図3及び図4参照)は、クロックツリー174、175に分割される。クロックツリー174、175は、それぞれFF116a、116bを含む。
図10は、図9に示した回路を別の表現により示した図である。なお、図9と同一の符号を付した構成要素については同一の意味を有するものとして、その説明を省略する。図10に示すように、バッファ171、172を挿入することで、クロックツリー114がクロックツリー174、175に分割される、つまりCTSのルートが分割される。具体的には、前述したFF群116が、クロックツリー174、175によってクロックがそれぞれ伝搬されるFF群116x、116yに分割される。上記したFF116a、116bは、それぞれFF群116x、116yに含まれる。
図9及び図10に示したようにバッファ171、172を挿入することで、例えば、FF115aとデータの授受を行うFF116aは、同一クロック系のFF116bから独立してスキュー調整を行うことができる。したがって、クロックツリー113のクロックルートセルであるバッファ118と、挿入したバッファ171、172とのスキュー調整を容易に行うことができる。言い換えると、第2比較例と比較して、クロックツリー113とクロックツリー174との間のスキューがより小さくなる。そのため、例えばFF115aとFF116aとの間のスキューに起因するタイミングエラーの収束性を効果的に向上させることが可能となる。つまり、例えばFF115aとFF116aとの間のスキューを容易に調整することができるため、この間のタイミングエラーが発生しにくくなるので、FF115aとFF116aとの間のタイミング調整を容易に行うことが可能となる。
更に、図9及び図10に示したように分周FF112の近傍にバッファ171、172を配置してCTSのルートを分割することで、バッファ171、172からクロックツリー174、175末端のFFまでの遅延時間を小さくすることができる。よって、第2比較例と比較して、クロックツリー174、175に関して、インサーションディレイをより小さくすることができる。
[本実施形態に係るクロックツリー生成処理]
次に、本実施形態に係るクロックツリー生成処理の具体例について説明する。
図11は、本実施形態に係るクロックツリー生成処理の全体処理を示すフローチャートである。このフローは、前述したコンピュータ910内のCPU911によって実行される。
まず、ステップS101では、CPU911は、クロックツリーの生成対象となっている回路(LSI)についてのネットリスト及びクロック定義を読み込む。ネットリストは、回路における端子間の接続情報のデータなどに相当し、少なくとも当該回路のクロックツリーに関する情報を含んでいる。クロック定義は、回路が用いている複数のクロックの情報、つまりクロックツリーを構成する複数のFFが用いている複数のクロックに関する情報を含んでいる。そして、処理はステップS102に進む。
ステップS102では、CPU911は、ステップS101で取得されたネットリスト及びクロック定義に基づいて、クロックツリーの生成対象となっている回路が用いている複数のクロックごとに、それぞれのクロックで駆動されるFFの数を特定する。言い換えると、CPU911は、回路で用いられているクロック周波数ごとにFF数を調べる。具体的には、CPU911は、クロックとFF数との関係を対応付けると共に、FF数が少ない順にクロックをソートする。そして、処理はステップS103に進む。
ステップS103では、CPU911は、ステップS102で特定されたFF数に基づいて、回路が用いている全てのクロックの中で、駆動しているFF数が少ないクロックを特定する。この場合、CPU911は、少なくとも、駆動しているFF数が最も少ないクロックを特定する。具体的には、CPU911は、上記のようにFF数が少ない順にソートされたクロックに基づいて、回路が用いている全てのクロックの中で、駆動しているFF数が少ない上位のクロックを特定する。つまり、CPU911は、FF数が少ないクロックを上から順に所定数(1以上の数)だけ特定する。なお、特定するクロックの数は、予め定めた定数を用いても良いし、回路が用いているクロックの数に応じた変数を用いても良い。1つの例では、CPU911は、駆動しているFF数が最も少ないクロック、駆動しているFF数が2番目に少ないクロック、及び駆動しているFF数が3番目に少ないクロックを特定する。以上のステップS103の処理が終了すると、処理はステップS104に進む。
ステップS104では、CPU911は、ステップS103で特定されたクロックで駆動されるFFを抽出する。つまり、CPU911は、駆動しているFF数が少ないクロックにより駆動されるFFを抽出する。そして、処理はステップS105に進む。
ステップS105では、CPU911は、ステップS104で抽出されたFFを始点とする終点側FFを抽出する。つまり、CPU911は、ステップS104で抽出されたFFからデータが入力される終点側FFを抽出する。そして、処理はステップS106に進む。
ステップS106では、CPU911は、ステップS104で抽出されたFFを終点とする始点側FFを抽出する。つまり、CPU911は、ステップS104で抽出されたFFにデータを出力する始点側FFを抽出する。そして、処理はステップS107に進む。
なお、終点側FF及び始点側FFを抽出する場合に、ステップS104で抽出されたFFと異なるクロックで駆動されていることを条件に用いても良い。具体的には、ステップS104で抽出されたFFとデータの授受を行うFFが、当該抽出されたFFと同一のクロックで駆動されている場合には、そのようなFFを終点側FF又は始点側FFとして抽出しなくても良い。
ステップS107では、CPU911は、ステップS105及びS106で抽出された終点側FF及び始点側FFのそれぞれのクロック分岐点を抽出する処理(以下、「分岐点抽出処理」と呼ぶ。)を行う。そして、処理はステップS108に進む。
ここで、図12乃至図15を参照して、ステップS107における分岐点抽出処理について具体的に説明する。
分岐点抽出処理の概要について、簡単に説明する。分岐点抽出処理は、2段階の処理によって行われる。以下では、最初に行われる処理を「第1分岐点抽出処理」と呼び、第1分岐点抽出処理の後に行われる処理を「第2分岐点抽出処理」と呼ぶ。
第1分岐点抽出処理では、まず、CPU911は、ステップS105及びS106で抽出された終点側FF及び始点側FFのそれぞれについて、終点側FF及び始点側FFのクロック端子を駆動するセル(以下、適宜「第1セル」と呼ぶ。)を抽出する。そして、CPU911は、抽出された第1セルが駆動するFFの中に終点側FF及び始点側FF以外のFFが存在する場合には、第1セルを複製して、複製されたセル(以下、適宜「第2セル」と呼ぶ。)によって終点側FF及び始点側FFが駆動されるように接続変更を行う。これに対して、CPU911は、第1セルが駆動するFFの中に終点側FF及び始点側FF以外のFFが存在しない場合には、第1セルを複製せずに、第1セルを分岐点として抽出する。CPU911は、このような第1分岐点抽出処理を、ステップS105及びS106で抽出された終点側FF及び始点側FFの全てに対して実行する。
次に、第2分岐点抽出処理では、CPU911は、第1分岐点抽出処理で複製された第2セルについて、当該第2セルを駆動するセル(以下、適宜「第3セル」と呼ぶ。)を抽出する。そして、CPU911は、抽出された第3セルが駆動するセル(以下、適宜「第4セル」と呼ぶ。)を更に抽出する。次に、CPU911は、第4セルの中に第1分岐点抽出処理で複製された第2セル以外のセルが存在する場合には、第3セルを複製して、複製されたセル(以下、適宜「第5セル」と呼ぶ。)によって第2セルが駆動されるように接続変更を行う。これに対して、CPU911は、第4セルの中に第2セル以外のセルが存在しない場合には、第3セルを複製せずに、当該第3セルを分岐点として抽出する。CPU911は、このような第2分岐点抽出処理を、第1分岐点抽出処理で複製された第2セルの全てに対して実行する。
なお、CPU911は、抽出された第3セルがクロックルートセルであった場合には、第2分岐点抽出処理を終了する。つまり、CPU911は、第2分岐点抽出処理を行っている際にクロックルートセルに到達した場合には、第2分岐点抽出処理を終了する。
なお、上記したセル(第1セル〜第5セルなど)としては、例えばゲーティッドクロックバッファや組合回路やセレクタやFFや分周FFなどが挙げられる。
図12は、第1分岐点抽出処理の具体例を示す図である。図12(a)に示す例では、FF201は終点側FF又は始点側FFであり、FF202は終点側FF及び始点側FFでないFFである。この例では、FF201、202のそれぞれのクロック端子は、セル203に接続されている。よって、セル203は、終点側FF又は始点側FFであるFF201のクロック端子を駆動する第1セルに相当する。この場合、セル203が駆動するFFの中に終点側FF及び始点側FF以外のFF202が存在する。そのため、図12(b)に示すように、セル203が複製されてセル203a(第2セル)が生成されると共に、当該セル203aによってFF201が駆動されるようにFF201の接続変更が行われる。具体的には、FF201のクロック端子が、セル203からセル203aへ接続変更される。
図13は、第2分岐点抽出処理の具体例を示す図である。図13において、図12と同一の符号を付した構成要素については同一の意味を有するものとして、その説明を省略する。
図13(a)に示す例では、セル203は第1セルであり、セル203aは第1分岐点抽出処理で複製された第2セルである。この例では、セル203、203aのそれぞれのクロック端子は、セル204に接続されている。よって、セル204は、複製された第2セルを駆動する第3セルに相当する。この場合、セル204が駆動するセルの中に第2セル以外のセル203が存在する。そのため、図13(b)に示すように、セル204が複製されてセル204a(第5セル)が生成されると共に、当該セル204aによってセル203aが駆動されるようにセル203aの接続変更が行われる。具体的には、セル203aのクロック端子が、セル204からセル204aへ接続変更される。
一方で、図13(c)に示す例では、セル203、203aのそれぞれのクロック端子は、クロックルートセルであるセル205(FF)に接続されている。この例では、抽出された第3セルがクロックルートセルである場合に相当する。そのため、クロックルートセルに到達したとして、第2分岐点抽出処理が終了される。つまり、分岐点抽出処理が終了される。
次に、第1分岐点抽出処理及び第2分岐点抽出処理の具体的なフローチャートについて説明する。
図14は、第1分岐点抽出処理を示すフローチャートである。このフローも、CPU911によって実行される。
まず、ステップS201では、CPU911は、上記のステップS105、S106で抽出された終点側FF又は始点側FFのクロック端子を駆動する第1セルを抽出する。そして、処理はステップS202に進む。ステップS202では、CPU911は、ステップS201で抽出された第1セルが駆動するFFを抽出する。そして、処理はステップS203に進む。
ステップS203では、CPU911は、第1セルが駆動するFFの中に終点側FF及び始点側FF以外のFFが存在するか否かを判定する。
終点側FF及び始点側FF以外のFFが存在する場合(ステップS203;Yes)、処理はステップS204に進む。ステップS204では、CPU911は、第1セルを複製し、第2セルを生成する。そして、処理はステップS205に進む。ステップS205では、CPU911は、複製された第2セルで終点側FF又は始点側FFを駆動する。つまり、CPU911は、第2セルによって終点側FF又は始点側FFが駆動されるように、終点側FF又は始点側FFの接続変更を行う。そして、処理はステップS206に進む。ステップS206では、CPU911は、ステップS205で接続変更された終点側FF又は始点側FFを処理対象から除外する。つまり、当該終点側FF又は当該始点側FFに対する第1分岐点抽出処理が終了したものとして、当該終点側FF又は当該始点側FFを第1分岐点抽出処理の処理対象から除外する。そして、処理はステップS208に進む。
一方、第1セルが駆動するFFの中に終点側FF及び始点側FF以外のFFが存在しない場合(ステップS203;No)、処理はステップS207に進む。ステップS207では、CPU911は、第1セルを複製せずに、第1セルを分岐点として抽出する。そして、処理はステップS208に進む。
ステップS208では、CPU911は、ステップS105及びS106で抽出された終点側FF及び始点側FFの全てに対する処理が終了したか否かを判定する。終点側FF及び始点側FFの全てに対する処理が終了している場合(ステップS208;Yes)、処理は終了する。これに対して、終点側FF及び始点側FFの全てに対する処理が終了していない場合(ステップS208;No)、処理はステップS201に戻る。こうすることで、CPU911は、終点側FF及び始点側FFの全てに対する処理が終了するまで、上記したステップS201〜S207の処理を繰り返し行う。
図15は、第2分岐点抽出処理を示すフローチャートである。このフローも、CPU911によって実行される。
まず、ステップS301では、CPU911は、第1分岐点抽出処理で複製された第2セルを駆動する第3セルを抽出する。そして、処理はステップS302に進む。ステップS302では、CPU911は、クロックルートセルに到達したか否かを判定する。言い換えると、CPU911は、ステップS301で抽出された第3セルがクロックルートセルであるか否かを判定する。クロックルートセルに到達した場合(ステップS302;Yes)、処理は終了する。これに対して、クロックルートセルに到達していない場合(ステップS302;No)、処理はステップS303に進む。
ステップS303では、CPU911は、ステップS301で抽出された第3セルが駆動する第4セルを更に抽出する。そして、処理はステップS304に進む。ステップS304では、CPU911は、第4セルの中に第2セル以外のセルが存在するか否かを判定する。
第4セルの中に第2セル以外のセルが存在する場合(ステップS304;Yes)、処理はステップS305に進む。ステップS305では、CPU911は、第3セルを複製して第5セルを生成し、当該第5セルによって第2セルが駆動されるように当該第2セルの接続変更を行う。そして、処理はステップS307に進む。
一方、第4セルの中に第2セル以外のセルが存在しない場合(ステップS304;No)、処理はステップS306に進む。ステップS306では、CPU911は、第3セルを複製せずに、当該第3セルを分岐点として抽出する。そして、処理はステップS307に進む。
ステップS307では、CPU911は、第1分岐点抽出処理で複製された第2セルの全てに対する処理が終了したか否かを判定する。第2セルの全てに対する処理が終了している場合(ステップS307;Yes)、処理は終了する。これに対して、第2セルの全てに対する処理が終了していない場合(ステップS307;No)、処理はステップS301に戻る。こうすることで、CPU911は、第2セルの全てに対する処理が終了するまで、上記したステップS301〜S306の処理を繰り返し行う。
次に、図11に戻って、ステップS108以降の処理の説明を行う。
ステップS108では、CPU911は、上記した分岐点抽出処理で抽出された分岐点に基づいてクロックツリーを分割する。具体的には、CPU911は、分岐点にセルが存在しない場合、当該分岐点にバッファを挿入する。これと同時に、CPU911は、挿入したバッファの固有名を記憶させる。一方で、CPU911は、分岐点にセルが存在する場合には、当該セルをクロックルートセルとして指定すると共に、当該セルの固有名を記憶させる。そして、処理はステップS109に進む。
ステップS109では、CPU911は、分岐点ごとにCTSを実行する。そして、処理はステップS110に進む。ステップS110では、CPU911は、回路全体のCTSを実行する。この場合、CPU911は、分岐点として抽出されたセルについてはスキュー調整の対象外として、CTSを実行する。そして、処理は終了する。
ここで、ステップS109及びS110の処理を、図10に示した回路に適用した場合を例に挙げる。この場合、CPU911は、クロックツリー113、174、175ごとにCTSを実行する。例えば、CPU911は、クロックツリー113→クロックツリー174→クロックツリー175といった順にCTSを実行する。具体的には、CPU911は、クロックツリー113、174、175のうちの1つについてCTSを実行している際には、クロックツリー113、174、175のうちの残りの2つについてはスキュー調整の対象外とする。つまり、CPU911は、クロックツリー113、174、175のうちの残りの2つについてはスキュー調整を行わない。但し、CPU911は、例えばクロックネットの属性追加などのスキュー調整以外の処理については実行する。つまり、CPU911は、クロックツリー113、174、175のうちの残りの2つについても、スキュー調整以外の処理は実行する。CPU911は、このような処理をクロックツリー113、174、175ごとに実行していくことで、クロックツリー113、174、175の全てに対するCTSを完了させる。
また、CPU911は、セットアップエラー及びホールドエラーの状況に基づいて、クロックツリー113、174、175間の遅延調整を行う。CPU911は、タイミングエラーが発生している場合、タイミングエラーの発生箇所から、クロックツリー113、174、175内のFFを抽出し、当該FFに対してタイミングエラーの発生分に応じたバッファを挿入する。
[変形例]
上記では、クロックツリーを分割すると共にバッファを挿入する実施形態を示したが、この代わりに、バッファを挿入せずに、クロックツリーの分割のみを行うこととしても良い。これによっても、クロック遅延などを容易に調整することができるため、タイミングエラーを適切に収束させることが可能となる。