"コンピュータ可読コードによって記述されるカスタム集積回路ICのためのプロセッサアーキテクチャを自動的に生成する方法であって、少なくとも前記ICが1つまたは複数のタイミングおよびハードウエアの制約を有し、a.前記プロセッサアーキテクチャを定義するパラメータを前記コンピュータ可読コードの静的プロファイルおよび動的プロファイルから抽出する工程と、b.コスト関数として表現されるタイミングおよびハードウエアの制約がすべて満たされるまで1つまたは複数のパラメータを変更することによって前記プロセッサアーキテクチャを反復的に最適化する工程と、c.生成された前記プロセッサアーキテクチャを半導体製造のためにカスタム集積回路のコンピュータ可読記述に合成する工程と、を有する方法。プロセッサのスカラ度およびインストラクションのグループ化規則を最適化する工程を有する請求項1に記載の方法。必要とされるプロセッサコアの数を最適化する工程と、前記プロセッサコアを効果的に使用するべくインストラクションストリームを自動的に分割する工程と、を有する請求項1に記載の方法。前記プロセッサアーキテクチャの最適化の工程は、インストラクションセットを変更する工程を含み、当該工程には、必要とされるインストラクションの数を低減させる工程と、前記インストラクションをエンコードしてインストラクションのアクセスおよびデコード速度を向上させ、かつインストラクションのメモリサイズ要件を向上させる工程とが含まれる請求項1に記載の方法。前記プロセッサアーキテクチャの最適化の工程は、レジスタファイルポート、ポート幅、およびデータメモリへのポートの数のうちの1つを変更する工程、を含む請求項1に記載の方法。前記プロセッサアーキテクチャの最適化の工程は、データメモリサイズ、データキャッシュのプリフェッチポリシー、データキャッシュポリシーのインストラクションメモリサイズ、インストラクションキャッシュのプリフェッチポリシー、およびインストラクションキャッシュポリシーのうちの1つを変更する工程、を含む請求項1に記載の方法。前記プロセッサアーキテクチャの最適化の工程は、コプロセッサを追加する工程、を含む請求項1に記載の方法。前記コンピュータ可読コードを、a.各ポインタ変数のためのメモリロケーションを決定する工程と、b.各行のためのインストルメンテーションを挿入する工程と、によって前処理する請求項1に記載の方法。前記プロセッサアーキテクチャのパフォーマンスを向上させるべく前記コンピュータ可読コードに対して固有のカスタマイズがなされた新しいインストラクションを自動的に生成することによってプロセッサのインストラクションセットを変更する工程を有し、さらに、a.ダミー代入を除去する工程と、b.冗長なループ演算を除去する工程と、c.必要とされるメモリ帯域幅を識別する工程と、d.1つまたは複数のハードウエアフラグとして1つまたは複数のソフトウエア実装されたフラグを置換する工程と、e.期限切れの変数を再使用する工程と、有する請求項1に記載の方法。パラメータを抽出する工程は、さらに、a.各行のための実行サイクル時間を決定する工程と、b.各行のための実行クロックサイクルカウントを決定する工程と、c.1つまたは複数のビンのためのクロックサイクルカウントを決定する工程と、d.演算子統計テーブルを生成する工程と、e.各関数のための統計を生成する工程と、f.実行カウントの降順により行をソートする工程と、を有する請求項1に記載の方法。共通使用されるインストラクションを1つまたは複数のグループにモールドし、各グループのためのカスタムインストラクションを生成してパフォーマンスを向上させるインストラクションモールディング工程を有する請求項1に記載の方法。新しいインストラクション候補内におけるモールディング違反をチェックする工程を有する請求項11に記載の方法。コスト関数を適用してインストラクションモールディングの候補IMCを選択する工程を有する請求項11に記載の方法。統計的依存に基づいてインストラクションモールディングの候補IMCをグループ化する工程を有する請求項11に記載の方法。前記アーキテクチャパラメータの変更のためのタイミングおよび面積のコストを決定する工程を有する請求項1に記載の方法。1つまたは複数のインストラクションモールディングの候補IMCによって置換されることになるプログラム内のシーケンスを識別する工程と、シーケンス内のインストラクションをアレンジし直し、コードの機能を保持しつつIMCの利用度を最大化する工程と、を有する請求項1に記載の方法。新しく合成されるインストラクションに使用する候補コードに関係する情報をコンパイラに渡す工程を有する請求項1に記載の方法。ポインタの進行を追跡し、ストライドおよびメモリアクセスパターンおよびメモリ依存度に関する統計を構築してキャッシュのプリフェッチおよびキャッシュポリシーを最適化する工程を有する請求項1に記載の方法。コンピュータ可読コードまたはモデルによって記述されるカスタム集積回路ICを自動的に生成するシステムであって、少なくとも前記ICが浮動小数点パラメータ、パフォーマンス制約、および入力信号のためのスタティックレンジならびにダイナミックレンジを有し、a.前記プロセッサアーキテクチャを定義するパラメータを前記コンピュータ可読コードの静的プロファイルおよび動的プロファイルから抽出するための手段と、b.タイミングおよびハードウエアの制約がすべて満たされるべく1つまたは複数のパラメータを変更することによって前記プロセッサアーキテクチャを反復的に最適化するための手段と、c.前記生成されたプロセッサアーキテクチャを、半導体製造のために、前記カスタム集積回路のコンピュータ可読記述に合成するための手段と、を備えるシステム。a.共通使用されるインストラクションを1つまたは複数のグループにモールドし、各グループのためのカスタムインストラクションを生成してパフォーマンスを向上させるインストラクションモールディングための手段と、b.新しいインストラクション候補内におけるモールディング違反をチェックするための手段と、c.コスト関数を適用してインストラクションモールディングの候補IMCを選択するための手段と統計的依存に基づいてIMCをグループ化するための手段と、を備える請求項19に記載のシステム。ますます複雑になる設計による別の効果は、設計の成功を達成するために必要となり得る、追加される製造ターンの数に影響を及ぼす。さらに別の問題としては、有能な労働者を利用できるかどうかの点にある。ASIC回路設計における急速な成長は、有能なIC技術者の不足を同時に伴って生じている。1つの態様においては、コンピュータ可読コードまたはモデルによって記述されるカスタム集積回路ICを自動的に生成するシステムおよび方法が開示される。ICは、1つまたは複数のタイミングおよびハードウエアの制約を有する。システムは、プロセッサアーキテクチャを定義するパラメータをコンピュータ可読コードの静的プロファイルおよび動的プロファイルから抽出する工程と、コスト関数として表現されるタイミングおよびハードウエアの制約がすべて満たされるまで1つまたは複数のパラメータを変更することによってプロセッサアーキテクチャを反復的に最適化する工程と、生成された前記プロセッサアーキテクチャを、半導体製造のためにカスタム集積回路のコンピュータ可読記述に合成する工程と、を有する。上記の態様の実装には、次に示す内容のうちの1つまたは複数を含めることができる。システムは、プロセッサのスカラ度およびインストラクションのグループ化規則を最適化することが可能である。システムはまた、必要とされるコアの数を最適化し、それらのコアを効果的に使用するべくインストラクションストリームを自動的に分割することも可能である。プロセッサアーキテクチャの最適化は、インストラクションセットの変更を含む。システムが行なうインストラクションセットの変更には、必要とされるインストラクションの数を低減させること、およびインストラクションをエンコードしてインストラクションのアクセス、デコード速度およびインストラクションのメモリサイズ要件を向上させることを含む。プロセッサアーキテクチャの最適化は、レジスタファイルポート、ポート幅、およびデータメモリへのポートの数のうちの1つの変更を含む。プロセッサアーキテクチャの最適化は、データメモリサイズ、データキャッシュのプリフェッチポリシー、データキャッシュポリシーのインストラクションメモリサイズ、インストラクションキャッシュのプリフェッチポリシー、およびインストラクションキャッシュポリシーのうちの1つの変更を含む。プロセッサアーキテクチャ最適化は、コプロセッサの追加を含む。システムは、プロセッサアーキテクチャのパフォーマンスを向上させるべくコンピュータ可読コードに対して独特のカスタマイズがなされた新しいインストラクションを自動的に生成することが可能である。システムは、各ポインタ変数のためのメモリロケーションを決定すること、および各行のためのインストルメンテーションを挿入することによるコンピュータ可読コードの前処理を含む。システムは、コンピュータ可読コードのパースを含み、さらにダミー代入の除去、冗長なループ演算の除去、必要とされるメモリ帯域幅の識別、1つまたは複数のハードウエアフラグとしての1つまたは複数のソフトウエア実装されたフラグの置換、および期限切れの変数の再使用を含む。抽出するパラメータは、さらに、各行のための実行サイクル時間の決定、各行のための実行クロックサイクルカウントの決定、1つまたは複数のビンのためのクロックサイクルカウントの決定、演算子統計テーブルの生成、各関数のための統計の生成、および実行カウントの降順による行のソートを含む。システムは、共通使用されるインストラクションを1つまたは複数のグループにモールドし、各グループのためのカスタムインストラクションを生成してパフォーマンスを向上させることが可能であるインストラクションモールディング。システムは、新しいインストラクション候補内におけるモールディング違反のチェックを含む。コスト関数を使用してインストラクションモールディングの候補IMCを選択することが可能である。IMCは、統計的な依存に基づくことが可能である。システムは、アーキテクチャパラメータの変更のためのタイミングおよび面積のコストを決定することが可能である。IMCとの置換が可能なプログラム内のシーケンスが識別される。これは、シーケンス内のインストラクションをアレンジし直し、コードの機能を損なうことなく適合性を最大化する能力を含む。システムは、ポインタの進行を追跡し、ストライドおよびメモリアクセスパターンおよびメモリ依存度に関する統計を構築してキャッシュのプリフェッチおよびキャッシュポリシーを最適化することができる。またシステムは、コンピュータ可読コードの静的プロファイリングおよび/またはコンピュータ可読コードの動的プロファイリングの実行も含む。システムのチップ仕様は、コンピュータ可読コードのプロファイルに基づいて設計される。さらにチップ仕様は、コンピュータ可読コードの静的および動的プロファイリングに基づいて漸進的に最適化することが可能である。コンピュータ可読コードは、最適アッセンブリコードにコンパイルされることが可能であり、それが選択されたアーキテクチャのためのファームウエアを生成するべくリンクされる。シミュレータが、ファームウエアのサイクル精度のシミュレーションを実行することが可能である。システムは、ファームウエアの動的プロファイリングを実行することができる。方法は、さらに、プロファイリングが行なわれたファームウエアに基づいて、またはアッセンブリコードに基づいてチップ仕様の最適化を行なうことを含む。システムは、設計されたチップ仕様のために、レジスタトランスファレベルRTLコードを自動的に生成することが可能である。またシステムは、RTLコードの合成を行なってシリコンを製造することも可能である。好ましい実施態様の利点には、次に示す内容のうちの1つまたは複数を含めることができる。システムは、すべてのコストが考慮に入れられ、かつシステム設計者が評価するべき最良な数表現およびビット幅の候補を獲得するように評価プロセスを自動化する。方法は、与えられたアーキテクチャの面積、タイミング、および電力のコストを迅速かつ自動化された態様で評価することができる。この方法は、コスト計算エンジンとして使用される。方法は、最適態様でアルゴリズムに基づいてDSPを自動的に合成することを可能にする。システム設計者が、別のものではなくこの特定の表現を選ぶことに関連付けされるハードウエア面積、遅延、および電力のコストを意識する必要はない。システムは、ハードウエア面積、遅延、および電力が、アルゴリズム評価段階において可能な限り正確にモデリングされることを可能にする。システムの好ましい実施態様のこのほかの利点には、次に示す内容のうちの1つまたは複数を含めることができる。このシステムは、チップ設計の問題を軽減し、それを単純なプロセスにする。これらの実施態様は、プロダクト開発プロセスの焦点を、ハードウエア実装プロセスからプロダクト仕様およびコンピュータ可読コードまたはアルゴリズム設計に戻すようにシフトさせる。特定のハードウエアを選択することに束縛される代わりに、コンピュータ可読コードまたはアルゴリズムが、それの適用のために特に最適化されたプロセッサ上において実装されることが可能となる。好ましい実施態様は、最適化されたプロセッサを自動的に、すべての関連付けされたソフトウエアツールおよびファームウエアアプリケーションとともに生成する。このプロセスは、これまで数年の問題として対処されていた事項を、数日の問題として対処することを可能とする。このシステムは、ハードウエアチップソリューションが設計される方法におけるパラダイムを完全にシフトするものである。ここで述べている自動システムは、システムへのプライマリ入力が、ローレベルのプリミティブではなく、コンピュータ可読コード、モデル、またはアルゴリズム仕様であることから、チップ設計の知識をまったく伴うことなく、アルゴリズム設計者自身が直接ハードウエアチップを作ることが可能となるように、リスクを取り除き、チップ設計を自動的なプロセスにする。このシステムを使用するこのほかの恩典として、さらに次に示す内容を含めることができる。1スピード:チップ設計サイクルが数年単位ではなく数週単位に落ち着くことになる場合には、このシステムを使用している会社が、自社の製品をすばやく市場に持ち込むことによって急速に変化する市場に浸透することが可能になる。2コスト:一般にチップの実装に必要とされる多数の技術者が不要となる。このことは、このシステムを使用している会社に夥しいコストの節約をもたらす。3最適性:このシステムプロダクトを使用して設計されたチップは、優れたパフォーマンス、面積、および電力消費を有している。このシステムは、デジタルチップ構成要素に向けた、それを有するシステムの設計で使用される方法におけるパラダイムを完全にシフトするものである。このシステムは、C/MATLABマトラボで記述されたアルゴリズムからデジタルハードウエアを生成する完全に自動化されたソフトウエアプロダクトである。このシステムは、CまたはMATLABマトラボ等の高水準言語を採用してハードウエアチップを実現するプロセスへの独特のアプローチを使用する。要約して言えば、これは、チップ設計を完全に自動化されたソフトウエアプロセスにする。図1は、プログラム、コード、またはコンピュータモデルによって機能が仕様に規定されるカスタムICまたはASICデバイスのための最良のアーキテクチャを自動的に決定する一例のシステムを示している。入力として提供される所定のコンピュータ可読コードまたはプログラム1のためのアーキテクチャ定義を得るにあたっては、種々の段階が関与する。1つの実施態様においては、プログラムがC言語で記述されるが、MATLABマトラボ、パイソンPython、またはジャバJava登録商標といったそのほかの言語も同様に使用可能である。プリ‐プロセッサ2においては、入力されるプログラム1が、パーサー3によってその種のプログラムが解析される前にフォーマットされる。フォーマットプロセスにおいては、プログラム1の機能面が保存される。パーサー3は、最初に、基本アーキテクチャを使用してすべての情報を抽出し、データベースを作成する。その後システムは、プログラムの静的および動的プロファイルを収集する。パーサー3の出力からアーキテクチャ定義5に必要なパラメータがパラメータ抽出4によって抽出される。システムは、これらのパラメータ、およびプログラム1によって満たされるべきリアルタイムとハードウエア制約を入力として用いて、与えられたCプログラムのための所定の段階においてもっとも適するアーキテクチャを反復的に決定する。このアーキテクチャが、Cプログラムおよびパラメータ抽出のためのパースに使用される。新しいアーキテクチャが再び定義される。このループは、最良の時間、面積、および電力のパフォーマンスを与える最良のアーキテクチャが定義されるまで継続される。図2は、図1の中で使用されている一例のプリ‐プロセッサをより詳細に示している。プリ‐プロセッサ2は、プログラム1を受け取り、そのプログラムを1行当たり演算子を1つだけ伴うコードに変換する10。プログラム内のループのif..goto..elsegoto..形式への変換も行なわれる11。次にシステムは、ディレクティブdefinevariableの出現を、それらそれぞれの定数値で置き換える12。システムは、各ポインタ変数のためのメモリロケーションを決定し13、各行のためのインストルメンテーションを挿入する14。次に、例示的なCプログラムに対する図2の動作の実例を考察する。10においては、Cプログラム内の演算子が複数ある行が1行当たり1つの演算子を有する形にフォーマットされる10。したがって、例示的なコードは、次のようになる。inta,b,c,d;d=dab/c;は、次のように変更される。intD1182;intD1183;inta;intb;intcintd;D1182=ab;D1183=D1182/c;d=D1183d;11においては、ifgotoelsegoto変換によって例示的なコードnti,a;fori=1;i<10;ia=10;が、次のとおりに変換される。inti;inta;i=1;gotoD1181;D1180:;a=a10;i=i1;D1181:;ifi<=9{gotoD1180;}else{gotoD1182;}D1182:;それぞれの定数値へのdefine変数の置換12においては、例示的なコードdefinedata10main{inti,a;ifi<datai=idata;elsei=0;}が、次のとおりに変換される。main{inti;inta;ifi<=9{i=i10;}else{i=0;}}13においては、各ポインタ変数のための、それのデータ型に応じた正確なメモリロケーションが計算される。したがって、次に示す例示的なコードinta;chard;a=10;a;d=a;d=’c’;d;d=’b’;が、次のとおりに変換される。inta;chard;a=10;a=a4;d=chara;d=99;d=d1;=98;14において、プロセスは行毎にインストルメンテーションを挿入してCプログラムの動的プロファイルを獲得する。たとえば、コードD1458=sig_out;D1459=intD1458;は、次に示すようにprintf関数挿入を用いてインストルメントされる。D1458=sig_out;printf0\t;printf0xx\n,unsignedintD1458;D1459=intD1458;printf1\t;printf0xx\n,unsignedintD1459;図3は、図1の中で使用されている一例のパーサーをより詳細に示している。1つの実施態様においては、プリ‐プロセッサ2からのフォーマット済みCプログラムが実行され、実行結果がログされる。この実行は、多様な使用ケースシナリオをカバーする、完全なテストスートである。不完全なテストスートは、不適切なアーキテクチャ定義を導く可能性がある。フォーマット済みCプログラムおよびログされた結果が入力としてパーサー3に供給される。1つの実装においては、パーサー3が次に示す動作を実行する。20においては、プロセスによって、プログラム1内で使用されるすべての変数のリストが構築される。各変数は、変数を一意的に識別する関連付けされたプロパティを有する。プロパティのうちのいくつかは、データ型、その変数が配列であるか否か、またはポインタであるか否かに関係する情報である。22においては、プロセスによって、プログラム内で使用されるすべての演算子のリストが構築される。演算子の機能を記述するプロパティのセットも各演算子に与えられる。これらのプロパティは、基本アーキテクチャ7の中に定義されている単純な演算子の組み合わせとして複雑な演算子の定義が可能となるように定義される。24においては、プログラム内の実行可能コードのそれぞれの行がデータ構造内にマップされる。それらの行についてのすべての情報がこのデータ構造内において利用できる。この構造は、変数リストおよび演算子リスト内へのリンクを有する。任意の行は、その行内で使用されている変数および演算子によって一意的に識別される。26においては、関数が識別されて関数のリストが維持される。28においては、ログされたCプログラムの実行からの結果がパースされ、関連のあるすべての動的情報が収集される。これは、コードの行のデータ構造および変数リストの更新に使用される。30におけるCプログラムは、コンパイラによって最適化される可能性のある多くの行を含んでいることがあり得る。たとえば、不必要な代入は、コンパイラによって取り除かれることになる。その種のコンパイラによって潜在的に取り除かれる可能性のある行が識別されてダミー行としてマークされる。これを実行するアルゴリズムについては、後述する別の段落の中で説明する。32においては、システムが、2の累乗による乗算を左シフトによって最適化し、2の累乗による除算を右シフトによって最適化する正の累乗のみ考慮している。2の累乗による乗算または除算の演算子を有するすべての行が、右または左シフトと置き換えられる。この処理によって、プログラムの実行に関連付けされる、収集された統計値が正しく識別される。34においては、ループ内の冗長な演算をプロセスによって最適化される。ループに関する何らかのほかの形式の最適化がコンパイラによって実装されることは可能である。その種のコードの行の追跡にアルゴリズムが使用されて、作成済みの行データ構造内において同一の最適化が繰り返される。このアルゴリズムについても後述の別の段落の中で説明する。36においては、実行される行がこのとき、アーキテクチャ分類、すなわちデータ操作およびアドレス操作のための2つのプライマリビンに分けられる。これは、それがいくつかの有意なアーキテクチャの決定を推し進めることから、達せられるべき非常に重要な区別である。多くのアドレス操作演算を有するプログラムは、独立したアドレス操作ユニットから恩典を受けることになるが、その一方でその種のハードウエアがほかのアプリケーションにとって過剰となることがある。これを行なうアルゴリズムは、後述する別の段落の中に定義されている。38においては、必要なデータメモリ帯域幅がプロセスによって識別される。1つの重要なアーキテクチャの決定は、プログラムを走らせるために必要なデータメモリ帯域幅に関係する。メモリからロードされるデータに依存するすべての行は、この目的のための異なるビンの下にマークされる。メモリからロードされるデータ以外のデータに対して作用したすべての行たとえば、メモリからロードされるデータに対して作用を及ぼした行の結果に対して作用を及ぼすことが可能であるが個別にマークされる。アルゴリズムが、このデータに適用され、最小限のストールを伴うCプログラムの行の実行を容易にするために必要とされるデータメモリに対するポートの数およびポートの幅が計算される。40においては、ハードウエアフラグが識別されて処理される。ネイティブのCプログラムは、ハードウエアフラグのコンセプトを有していない。フラグは、通常、グローバル変数としてコードされる。しかしながらパフォーマンスの見地からは、プログラムに必要とされるすべてのハードウエアフラグを識別することが必須である。これは、現在のところ一般に手作業で行なわれている。ハードウエアフラグを利用するかつ、結果としてもたらされるパフォーマンスを得るべくCコードがアッセンブリ内で再び手作業でコードされるか、またはプラグマを伴ういくつかのタイプのコーディング構造が使用されてフラグを表わすことが可能となるようにコンパイラがマニュアル調整されるか、のいずれかである。これらのオプションは、いずれも容易ではなく、また拡張性のあるものでもない。発明者らのアプリケーションは、ネイティブのCコード内の潜在的ハードウエアフラグを識別し、これらのグローバル変数をフラグとしてマークするアルゴリズムを有する。アーキテクチャ定義の一部として、これらのフラグを表現することを必要とするハードウエアもまた、自動的に記述され、合成される。フラグを識別するアルゴリズムについては、より詳細を後述する。42においては、プロセスが再使用可能な期限切れ変数を探す。忠実なパラメータを抽出するためには、各行のために使用される変数の数およびレジスタファイル内において利用可能な読み出しおよび書き込みポートの数を考慮することが重要である。整合しない場合には、ペナルティサイクルが追加されなければならない。しかしながらネイティブのCプログラムは、使用される変数の数を最適化するためには記述されない。そのためプログラムをそのまま使用することは、結果として非現実的な多数のペナルティサイクルがもたらされる可能性がある。したがって、行のデータ構造がパースされ、新しい変数の使用を最小化するべく修正されなければならない。このアルゴリズムについては後述の別の段落の中で説明する。次にダミー行の識別を詳細に説明する。ダミー代入のチェックが、コンパイラによって最適化されて除かれそうな代入を含むCプログラム内の行を識別する。1つの実施態様においては、プロセスが次に示す内容を実行するコードを含む。1代入ステートメントを伴う行を探しながら行のデータ構造を通って進む。2代入ステートメントがヒットしたとき、左辺の変数および右辺の変数をマークする。3さらに下の行を調査して、この代入は必要であるか否か、または代わりに右辺の変数を直接使用することが可能であったか否かを検証する。左辺の変数の参照が行なわれる最後の行に先行する任意の行内の右辺の変数の再代入は、この要件を直接破ることになる。4しかしながら、要件3が充足される場合であっても代入がなおも必要となる場合条件付きチェック等が存在し得る。この決定には、分岐の条件および分岐の深度を理解しているロジックが使用される。5これらのチェックがすべて行なわれた後、代入が行なわれる必要がなかったことが認定された場合には、その代入演算を含む行がダミー行としてマークされる。次に、ダミー変数の再代入について説明する。代入行がダミーとしてマークされた後は、その行内における変数の代入が冗長になっている。そこで行のデータ構造との一貫性を確保するために次に示す擬似コードが変数の再代入を行なう。1ダミー代入行の右辺の変数を識別する。2これより以前にあり、左辺にこの変数が出現した行を識別する。3その左辺の変数をダミー行の左辺の変数に置き換える。分岐の深度のチェックは、ダミー代入チェックセクションの中ですでに実行済みである。したがって、この置換は一貫することになる。次に、ループ最適化を説明する。プロセスは、コンパイラがループ内の配列アクセスおよび配列指数に対して実行しそうな可能性のある最適化を追跡する。一例を次に示す。Cコードの行を考えるbaseはint。b=basei;このCコードの行がプリ‐プロセッサに通されると、結果の行が生成される:temp1=i4;temp2=basetemp1;b=temp2;この演算が詰まったループの内側で実行されるとき、第1行が冗長である。任意のループにおいて、直前のアドレスに4を加えることによってそれの次のアドレスが容易に計算可能である。プログラム内のその種の行は、追跡され、ダミーとしてマークされる。これが行なわれない場合には、実際にコードがマシンのためにコンパイルされるときには決して存在しない演算の理由を与えるためにアーキテクチャ定義が不当に歪められることになる。そのため、その種の冗長な演算をすべてアーキテクチャ定義段階へ進む前に識別できることが必要不可欠である。ループ最適化のための擬似コードを次に示す。1実行の反復を通じてすべての変数値を追跡する。この情報は、14に挿入されるインストルメンテーションに起因してログされたCプログラムの結果のパースから利用可能である。2変数の現在の値とその変数の以前の値を比較し、それを差の値としてストアする。3実行の反復のすべてを通じてこの差の値が不変のまま残り、かつそのコードの行が実際は偶発的にループ内ループは、すでに識別済みに存在している場合には、これが最適化の候補になる。行内の演算子が乗算である場合には、この行がダミーとしてマークされる。次に、データとアドレスの操作の識別について説明する。プロセスは、Cプログラムで実行される行をデータとアドレスの操作用のビンに分割する。プログラムの観点からは、これらは変数に対する演算に過ぎず、これらの演算の間にまったく相違が存在しないが、プロセッサアーキテクチャの観点からは有意の違いがある。データ操作演算は、メモリからデータをフェッチする以前のアドレス操作演算に頼りがちである。多様な理由から、この区別は非常に重要である。アドレスとデータの操作の演算を識別するために、システムは、次に示す擬似コードを実行する。1ポインタCプログラム内においてポインタまたは配列のいずれかとして宣言されるに対する演算を行なうすべての行を識別するコードの各行を検証する。2アドレス操作演算として行をマークする。3結果がメモリからデータをフェッチするためだけであることを確保する。演算3は、マークされた行がコードの他の行に導く可能性があること、またはそれに依存する可能性があるため、行なわれる。これらの行は、メモリからデータをフェッチする目的だけがこれらの行の結果によって意味されることを確保するために、追跡される。これを実装するためにこれらの行内に含まれる変数が追跡され、プロセスは、これらの変数の値別の独立した再代入を伴うことなくがほかの目的のために使用されないことを確かめる。これが当て嵌まる場合には、これらの行もまたアドレス操作演算としてマークされる。アドレスおよびデータの操作の演算両方にデータを供給する行は、データ操作演算として分類される。次に、フラグ識別について説明する。フラグ検出アルゴリズムは、次に示す擬似コードを使用してCプログラム内において宣言されているすべてのグローバル変数の検証を行なう。1各グローバル変数が、実行の途中に取得される可能性のある値についてチェックされる。2取得される値が0および1だけであれば、次のステップへ進む。3それらの値がセットされるすべての行をチェックする。これらの値は、即時演算言い換えると、x=1等の明示的な代入を通じてのみセットされて次の段階に進むことが可能である。別の変数の代入の結果としてそれが導出される場合x=y等、右辺の変数がバックトラックされてその変数がこの規則を確立するか否かが調べられる。永続的なロックアップ状況を防止するために適切なところにロジックが存在する。ほかの演算算術、論理、またはメモリフェッチ等が存在しなければ、その変数はフラグであり得ない。4実際の代入行をチェックする。この代入は、全体のフローの中で値0または1のうちの1つだけにしかなり得ない。他方の値の代入は、条件付きチェックフロー内においてのみ起こり得る。5上記の規則に適合する変数をフラグとしてマークする。6この定義に対応するハードウエアフラグがプロセッサアーキテクチャの中で指定され、自動的に合成されることになる。7この変数の値をセットするすべての行は、フラグ操作行としてマークされる。8アーキテクチャ定義はまた、これらの演算を可能にするインストラクションも作成する。9フラグ操作行としてマークされたこれらすべての行は、標準的なインストラクションではなく、これらの新しく定義されたインストラクションを使用し、特定のハードウエアフラグを参照する。次に、変数の再使用について説明する。各行内において使用される変数の数を最小化するプロセスは以下のとおりである。1各行ダミーとしてマークされていないにおいて、左辺の変数および右辺の変数をマークする。2右辺の変数が、その後に続く行のいずれにおいても参照されていない場合には、その変数は、既存の左辺の変数の置換に使用される。3それより下にある行内の左辺の変数を参照するすべての行は、それを置換した変数を参照するべく変更される。4上記のプロセスのすべてにおいて、アルゴリズムは、左辺の変数が再代入されないゾーンにサーチ範囲を制限する。パーサー段階が完了すると、パラメータ抽出モジュールまたはパラメータ抽出4が行のデータ構造を再訪する。図4は、一例のパラメータ抽出モジュール4をより詳細に示している。このデータ構造の検証によって多様な関連パラメータが抽出される。たとえば、所定のテストケースのためにプログラムの実行に必要とされる合計サイクルが計算される。これは、任意の所定の行の実行に必要とされるクロックサイクル数その行内に使用される演算子のプロパティから導出される値に注目し、それにデータの依存度またはそのほかの理由に起因してその行によって被るクロックサイクルペナルティを加算し、この値にその行が実行された回数ログされたCプログラムの実行の結果のパースによって明らかになる値を乗ずることによって実行される。この演算がすべての行について反復されて、テストケース全体の実行のために必要となる合計クロックサイクルに到達する。同様に、アドレス計算、メモリロード、メモリストア、条件分岐、ループ、およびデータ操作に関連付けされるクロックサイクルの数に到達する。上記の計算のすべてについての演算子の分布にタグを付けるリストが構築される。たとえば、合計サイクルの場合においては、それらのうちのいくつがどの演算子と関連付けされるかが計算される。それに加えて、各演算子について異なるデータ幅にわたる利用度の分布もまた計算される。このプロセスの終了時には、次に一例を示したテーブルが生成される。同様に、関数呼び出しについての統計値も構築される。各関数呼び出しについて、それが呼び出される回数およびその関数の実行に費やされるクロックサイクルが計算される。その後、コードの行が実行カウントの降順でソートされる。Cプログラムのニーズにもっともよく適応するアーキテクチャの定義が、反復プロセスの入力として与えられる。初回のパラメータ抽出が実行され、7において定義されたベースアーキテクチャを使用してプロセスが統計値を計算する。パラメータ抽出の出力に加えて、Cプログラムに関連付けされるリアルタイム制約およびプロダクトに関連付けされるハードウエア制約もまたアーキテクチャ定義ブロックに対する入力として供給される。当該ブロックは、指定されたパフォーマンス要件を満たすことになるアーキテクチャを自動的に生成する。その後、最適アーキテクチャに到達するべくアーキテクチャオプティマイザを使用してこのアーキテクチャを精緻化することができる。この段階における最初のステップは、リアルタイム制約を満たすことである。このステップの目標は、合計の実行時間を低減し、プロセッサがリアルタイム制約を満たすことを可能にする新しいインストラクションおよび対応するプロセッサアーキテクチャを定義することである。1つの例示的な実装においては、次に示す演算が実行される。1.手前のセクションから利用可能な実行カウントによってソートされた行のリストをプロセスが検索する。これらの行に沿って進行し、順に生じる行のグループを識別する。たとえば、ソートされたリストは、651、652、659、802、803、....といった形で現われるとすることができる。この場合において、行651から659までが、最初のグループのために識別される。単一グループの部分として行をマークする際は、それらが同一の実行カウント数を有している必要がある。この例においては、651、652、および659が同一の実行カウント数ログされたCプログラムの実行の結果のパースにおいてこれらの行がカウントされた回数を有していることが重要である。その後、このリストの最初から最後の行までの間のすべての行がグループとしてマークされる。2.これらの行のグループは、高い実行カウントを有しており、したがって実行時間のかなりの量を消費する。これらの行が単一のインストラクションでならすことが可能であれば、実行時間の短縮に帰することができる。新しいインストラクションが、これらのインストラクションを1つにモールドすることによって作成される。その種のモールドのための候補は、インストラクションモールディング候補IMCと呼ばれる。3.インストラクションの各グループが、モールディング違反についてチェックされる。たとえば、このグループの最中の無条件GOTOジャンプまたは関数呼び出しは、シーケンスを無効にする。そのほかにも、レジスタファイルからアクセス可能であるより多くのデータ変数を必要とする行のグループといった制約がある。たとえば、現在のアーキテクチャが2リードポートレジスタファイルを前提とし、インストラクションのグループが新しいインストラクションの形成に3つの変数を必要とする場合に、このグループを使用するIMCを形成することはできない。レジスタファイルへの書き込みポートが1つしかなく、インストラクションのグループが2つの変数を書き込む場合にもこのグループからIMCを形成することができない。そのためシステムは、ハードウエア関連のアーキテクチャ制約をチェックし、これらの条件に従うサブグループ存在する場合として位置付ける。4.このサブグループ内においては、複数のIMCを形成することが可能である。たとえば、下にリストしたサブグループを形成する行のシーケンスを有することができる。a=bc;d=a2;e=dANDb;この場合、3つの演算すべてからなる1つのIMC、最初の2つのインストラクションだけを含む別の1つ、および最後の2つのインストラクションを含む別の1つを有する。その種の可能性のあるすべてのIMCが形成される。5.IMCが定義された行のグループは、これらのインストラクションが順に生じるプログラム内の1つの場所にある。その種のシーケンスがCプログラム内の別の場所に存在し得る。ここで、その状態が調べられる。注意すべき重要なことは、満たされる必要のある条件にインストラクションのシーケンスだけでなく相対的な演算子の依存度も含まれることである。ポイント4に記述した例を採用する。シーケンスx=yz;r=x2;f=rANDx;が見つかるコード内の別の場所に来たとしても、これをIMCが使用可能な場所としてカウントすることは可能でない。そこでアルゴリズムは、同一のインストラクションのシーケンスだけでなく、同一の変数依存度構造もチェックする。可能性としてIMCの使用が可能なその種のすべての場所が、IMCとともにタグ付けされる。6.ポイント5の結果は、このIMCが新しいインストラクションとして実際に使用されることになったとしたら、プログラムの実行サイクルカウントをる潜在的に低減するための計算に使用される。7.この時点において、アルゴリズムがハードウエアシンセサイザブロックに対してクエリを行ない、インストラクションとしてこのIMCを実装するためのタイミングおよび面積を得る。8.このプロセスがすべての行について反復される。9.これらのIMCのうちのいくつかは、完全な関数を潜在的に置換する。その場合には、これらのIMCがインストラクションとして実装されるときにプログラムフローが有意に変化する。そのためそれらが、特殊IMCとしてマークされる。10.この時点において、現在の段階にとって可能なすべてのIMCのリストが達せられる。最適化コスト関数が使用されて、インストラクションとして実装される必要のあるIMCを拾い出す。アルゴリズムは、特定のコスト関数と結びつけられないが、コスト関数は、新しいインストラクションのタイミングおよびそれがCプログラムの実行時間にどのような影響を及ぼすかについて考慮に入れたものになることになり得る。実行時間への影響の計算は、瑣末なものではない。現在のクロックサイクル時間より小さいタイミングを有するIMCは、アーキテクチャに対して有意な影響を与えない。しかしながら、現在のクロックサイクルより大きいタイミングを有するIMCと遭遇することはありがちである。これらのIMCが受け入れられた場合には、クロックサイクル時間がすべてのインストラクションについて増加することになり、クロックサイクル数をより少なくできたとしても、可能性として実行時間が増加することがあり得る。したがって、この計算および決定は、瑣末なものでない。11.この計算を実行するためにIMCが従属グループにまとめられてグループ化される。このグループ化を実行するために、完全に統計的に独立した原理が適用される。完全に統計的に独立していないIMCがまとめられてグループ化される。どちらかと言うとこれは保守的なアプローチであるが、それにもかかわらず必要とされる。グループ化は、二重カウントの防止を補助する。サイクル時間の増加に関係する決定が行なわれなければならないときは、常に、すべてのAMCグループが調査されて、このサイクル時間における増加から恩典を受けると見られるIMCが捜し出される言い換えるとそれらはまた、現在のサイクル時間より大きいが、新しいサイクル時間より小さいサイクル時間を有する。最良IMCサイクルカウントの低減を最大にするものが恩典を受ける各グループから抽出される。この情報を使用して新しい実行時間が計算され、これが現在の実行時間より小さい場合には、サイクル時間が増加される。12.コスト関数がIMCを識別する都度、対応するインストラクションが定義され、この新しいインストラクションを含めるべくアーキテクチャ定義が変更される。ほかのIMCに対するこの新しいインストラクションの効果が調査され、そのIMCが合理化される。13.コスト関数が、要件に適合するIMCを見つけ出すことが不可能になると、このプロセスが停止される。14.このアーキテクチャが入力としてパーサーに渡される。パラメータが再び抽出されてアーキテクチャ定義が再考される。このループが、要件に適合する新しいIMCをコスト関数が見つけ出すことができなくなるまで走る。15.リアルタイム制約がまだ満たされていない場合には、ほかのいくつかのアーキテクチャ変数が考察される。たとえば、レジスタファイルに対する読み出しおよび書き込みポートの数、メモリに対する読み出しおよび書き込みポートの数、これらのポートの幅、プロセッサのスカラ度、ハードウエアを最適使用するインストラクションのグループ化規則などがある。これらは厳密に言えばインストラクションと関係しない変数であるが、実行時間の短縮をさらに補助し得る新しいIMCを見つけ出すには欠かせない。ループが再び反復される。例として述べるが、ここでスカラ度を考察する。アルゴリズムは、行のデータ構造を通って進み、そのコード内に内在するインストラクションレベルのパラレリズムの量を識別する。これが使用されて、プロセッサの実行ユニットに利用可能なハードウエアリソースが最適化され、プロセッサのスカラ度が定義される。実行ユニットのために利用可能なハードウエアは、インストラクションのグループ化規則の定義にも同じく使用される。注意すべき重要なことは、この場合に達せられるグループ化規則は、提示されたコードにとって最適であって、それが恣意的に選択されたものではないということである。アイドルスロットを最小化するコスト関数が使用されてこれを定義する。16.リアルタイム制約が、上記のアーキテクチャ変数のいずれかを増加することによってもまだ満たされていない場合には、アルゴリズムがマクロパラレリズムを識別し、識別済みパラレリズムに必要なコアの数を最適化する。アルゴリズムはまた、コアのそれぞれにおいて実行されるべくインストラクションストリームを分割する。17.任意の時点において、リアルタイムパフォーマンス制約が満たされると、アルゴリズムがループを出る。18.すべての変数が調べられた後においてもなおパフォーマンス制約が満たされない場合には、アルゴリズムが、このアプリケーションはプログラマブルソリューションに適さないと認定し、機能のうちのいくつかがデータパス専用ハードウエアとして実装されるコプロセッサアーキテクチャを推奨する。合成されるIMCおよび現在のサイクル時間よりタイミングが大きかったことから除かれるIMCのリストが使用されて、このコプロセッサアーキテクチャが定義される。別のアルゴリズムが、ポインタの進行を追跡し、ストライドおよびメモリアクセスパターンに関する統計を構築する。これらの統計は、メモリ依存について獲得された情報に加えて、キャッシュのプリフェッチメカニズムおよびキャッシュポリシーの最適化に使用される。リアルタイムパフォーマンス制約が満たされた後は、そのほかのハードウエア制約が考察される。ハードウエア制約は、面積、電力、および何らかのそのほかのパラメータにおいて表現することが可能である。その後アルゴリズムは、これらの制約を満たすべく、アーキテクチャを微調整して冗長なパスおよび重要でないセクションを減少させる。別のアルゴリズムが採用されて、利用可能なすべてのインストラクションをチェックし、これらのインストラクションによって提供される恩典を検証する。コスト関数が使用されてこのチェックが実行される。インストラクションデコーディング時間が最小限のレベルまで低減されるように、リアルタイムパフォーマンス制約に影響を及ぼさずに安全に取り除くことが可能なすべてのインストラクションがセットから取り除かれる。これらの制約が満たされることもあれば、満たされないこともある。これらは、与えられたアプリケーションにとって定義されたアーキテクチャが大きな過剰とならず、かつアーキテクチャの複雑性を低減する任意の範囲が調べられるように使用される。図5は、アーキテクチャ定義を自動的に生成する例示的なシステムを示している。このプロセスにおいては、前述したとおり、パーサー3からの出力がパラメータ抽出モジュール4に提供される。次にプロセスは、あらかじめ決定済みの規則に基づいてプログラム行のセットを伴うグループを形成する60。続いて、モールディング規則のセットが検索される61。プロセスは、モールディング規則違反をチェックし、プログラム行をサブグループに分割する62。プロセスは、IMCを見つけ出し63、IMCの利用のための場所を識別する64。次にプロセスは、各IMCに関連付けされるサイクルを決定する65。IMCのためのタイミングおよび面積の決定もまた実行される66。その情報は、演算60および63にフィードバックされるとともに、完全な関数を置換することが可能なIMCの識別にも提供される67。次に、統計的依存に基づいてIMCがグループ化される68。プロセスは、コスト関数を使用して最良IMCを抽出し69、その最良IMCのための新しいインストラクションを実装する70。ほかのIMCに対する新しいインストラクションの効果の反復決定が行なわれ71、決定が最良IMCを抽出する演算69へ、そこから新しいインストラクションを実装する演算70へと提供される。スレッショルドに到達するまでこれが行なわれ、新しいインストラクションがアーキテクチャ定義に追加される5。プロセスは、ほかのアーキテクチャ変数に対するこの新しいインストラクションの影響をチェックし72、この新しいインストラクションを受け入れるか、または拒否する。プロセスは、その後、カスタムICに課せられた制約を満たすあらかじめ決定済みのスレッショルドに到達するまで反復される。図6は、カスタムICを自動的に生成するシステムの一例を示している。図6のシステムは、選択された目標とするアプリケーションに対するカスタムハードウェアソリューションアーキテクチャを自動的に生成することをサポートする。目標とするアプリケーションの仕様は、一般に、C、MATLABマトラボ、SystemCシステムC、フォートラン、エイダ等の高水準言語またはそのほかのいずれかの言語によるコンピュータ可読コードとして表現されたアルゴリズムを通じてなされる。仕様は、目標とするアプリケーションの記述を含み、またそれには、望ましいコスト、面積、電力、速度、パフォーマンス、およびそのほかのハードウエアソリューションの属性といった1つまたは複数の制約も含まれる。図6においては、ICカスタマがプロダクト仕様102を生成する。通常は、所望のプロダクトのすべての主要機能を取り込んだ初期プロダクト仕様が存在する。そのプロダクトから、アルゴリズムの専門家がそのプロダクトに必要とされるコンピュータ可読コードまたはアルゴリズムを識別する。それらのアルゴリズムのうちのいくつかは、サードパーティから、または標準開発委員会からのIPとして利用可能となることがある。それらのうちのいくつかは、製品開発の一部として開発されなければならない。この態様においては、さらにプロダクト仕様102が、とりわけCプログラム等のプログラムまたはMATLABマトラボモデル等の数学モデルとして表現することが可能なコンピュータ可読コードまたはアルゴリズム104で詳述される。プロダクト仕様102は、また、とりわけコスト、面積、電力、プロセスタイプ、ライブラリ、およびメモリタイプ等の要件106も含んでいる。コンピュータ可読コードまたはアルゴリズム104および要件106は、自動化されたICジェネレータ110に提供される。コードまたはアルゴリズム104およびチップ設計に課せられた制約だけに基づいて、ICジェネレータ110は、人間の掛かり合いを殆ど、またはまったく伴うことなく、GDSファイル112、ICを実行させるファームウエア114、ソフトウエア開発キットSDK116、および/またはテストスート118を含む出力を自動的に生成する。GDSファイル112およびファームウエア114は、カスタムチップ121の製造に使用される。このシステムは、チップ設計の問題を緩和し、それを単純なプロセスにする。このシステムは、プロダクト開発プロセスの焦点を、ハードウエア実装プロセスからプロダクト仕様およびアルゴリズム設計に戻すようにシフトさせる。特定のハードウエアを選択することに束縛される代わり、アルゴリズムが、そのアプリケーションのために特に最適化されたプロセッサ上において実装されることが常に可能となる。システムは、この最適化されたプロセッサを自動的に、すべての関連付けされたソフトウエアツールおよびファームウエアアプリケーションとともに生成する。この全体的なプロセスは、現在数年の問題として対処されていた事項を、数日の問題として対処することを可能とする。要約して言えば、このシステムは、プロダクト開発のデジタルチップ設計部分をブラックボックス化する。1つの実施態様においては、このシステムプロダクトが、次に示すものを入力として取ることが可能である。C/MATLABマトラボで定義されたコンピュータ可読コードまたはアルゴリズム、必要とされる周辺機器、面積目標、電力目標、マージン目標将来的なファームウエア更新のためにどの程度のオーバーヘッドを組み込むべきか、またどの程度複雑性が増加するか、プロセスの選択肢、標準セルライブラリの選択肢、テスト可能性スキャンシステムの出力は、関連付けされるファームウエアすべてを伴ったデジタルハードマクロとすることができる。このデジタルハードマクロのために最適化されたソフトウエア開発キットSDKもまた自動的に生成されて、ファームウエアに対する将来的なアップグレードがプロセッサの交換を強いることなく実装されるようにすることが可能である。このシステムは、選択された目標とするアプリケーションに対して完全かつ最適なハードウエアソリューションを自動的に生成する。共通の目標とするアプリケーションは埋め込みアプリケーション空間内にあるが、それらは、必ずしもそれに限定されない。次に、例として、自動化されたチップ設計システムをサポートするコンピュータについて考察する。コンピュータは、好ましくは、プロセッサ、ランダムアクセスメモリRAM、プログラムメモリ好ましくは、フラッシュROM等の書き込み可能な読み出し専用メモリROM、および入力/出力I/OコントローラをCPUバスによって結合された形で含んでいる。このコンピュータは、ハードディスクおよびCPUバスに結合されるハードドライブコントローラをオプションとして含むことができる。ハードディスクは、本発明等のアプリケーションプログラムおよびデータを記憶するために使用することができる。それに代えて、アプリケーションプログラムをRAMまたはROM内に記憶することができる。I/Oコントローラは、I/Oバスを経由してI/Oインターフェースに結合される。I/Oインターフェースは、シリアルリンク、ローカルエリアネットワーク、無線リンク、およびパラレルリンク等の通信リンクを介してアナログまたはデジタル形式でデータの受信および送信を行なう。オプションとして、表示器、キーボード、およびポインティングデバイスマウスがI/Oバスに接続されることもある。それに代えて、I/Oインターフェース、表示器、キーボード、およびポインティングデバイスのために別々の接続別々のバスが使用されることもある。プログラマブル処理システムは、あらかじめプログラムすること、または別のソースたとえば、フロッピー登録商標ディスク、CD‐ROM、または別のコンピュータからプログラムをダウンロードすることによってそれをプログラムすることおよび再プログラムすることができる。各コンピュータプログラムは、目に見える形として、コンピュータによってストレージ媒体またはデバイスが読み出されたときに、ここで説明している手順を実行するべくそのコンピュータの構成および動作のコントロールを行なうために、汎用または専用プログラマブルコンピュータによって読み出されることが可能なマシン可読ストレージ媒体またはデバイスたとえば、プログラムメモリまたは磁気ディスク内に記憶される。また本発明のシステムは、コンピュータプログラムを用いて構成されるコンピュータ可読ストレージ媒体内において具体化されると考えてもよく、それにおいてストレージ媒体は、ここで述べている機能を実行するべく特定の、あらかじめ定義済みの態様でコンピュータを動作させるように構成される。以上、ここでは、特許法に従うため、および当業者に、新しい原理の適用および必要とされる専用の構成要素の組み立ておよび使用に必要となる情報を提供するために、相当に詳細に本発明を説明してきた。しかしながら、本発明が明確に異なる装置およびデバイスによって実行可能であること、および装置の詳細および動作手順の両方に対する多様な修正が本発明自体の範囲からの逸脱なしに達成可能であることは理解されるものとする。"