(57)【特許請求の範囲】
【請求項１】
命令がその上に格納されたメモリと、
前記メモリに通信的に結合され、対象装置をプログラムするためにソースコードを機械コードに変換するプロセッサであって、前記命令が、前記プロセッサによって実行される際に、前記プロセッサに：
前記ソースコードを、状態および前記状態間の遷移を含むオートマトンに変換することであって、前記オートマトン内の前記状態が、専用ハードウェア要素に対応する専用状態を含む、ソースコードをオートマトンに変換することと、
前記オートマトンをネットリストに変換することと、
前記機械コードを提供するために、前記ネットリストを位置付けて、ルーティングすることとを
させる、プロセッサと
を備えるコンピュータ。
【請求項２】
前記ソースコードが数量化を含み、かつ
前記数量化が前記専用ハードウェア要素にマッピングされるための条件を満足する場合、ソースコードを変換することが、前記数量化を、前記専用状態を含む、複数の状態に変換することを前記プロセッサに実行させることを含む、
請求項１に記載のコンピュータ。
【請求項３】
前記数量化が専用ハードウェア要素にマッピングされるための前記条件を満足しない場合、ソースコードを変換することが、前記数量化を、複数の汎用状態に展開することを前記プロセッサに実行させることを含む、請求項２に記載のコンピュータ。
【請求項４】
展開することが、前記オートマトンの入次数を制御するように前記数量化を展開することを含む、請求項３に記載のコンピュータ。
【請求項５】
前記オートマトンを最適化することをさらに含み、最適化することが、特定の状態の推定された入次数が前記対象装置の制約よりも多い場合に、前記オートマトンの前記特定の状態を複数の状態に分割することを前記プロセッサに実行させる命令を含む、請求項１に記載のコンピュータ。
【請求項６】
前記特定の状態を分割することが、前記複数の状態の各々の入次数が前記制約を満足するように、前記特定の状態の駆動状態を前記複数の状態に分散することを含む、請求項５に記載のコンピュータ。
【請求項７】
前記オートマトンを前記ネットリストに変換することが、前記状態を前記ネットリストのインスタンスにマッピングすることを含み、マッピングすることが、前記専用状態を、専用要素に対応する専用インスタンスにマッピングすることを前記プロセッサに実行させることを含む、請求項１に記載のコンピュータ。
【請求項８】
前記オートマトンをネットリストに変換することが、前記対象装置の物理的設計に基づいて、状態をともにグループ化することを前記プロセッサに実行させることを含む、請求項７に記載のコンピュータ。
【請求項９】
インスタンスが、状態機械要素（ＳＭＥ）ハードウェア要素に対応するＳＭＥインスタンスおよびＳＭＥのグループを含むハードウェア要素に対応するＳＭＥグループインスタンスを含み、かつ、グループ化することが、状態をＳＭＥグループインスタンスにグループ化することを含む、請求項１に記載のコンピュータ。
【請求項１０】
対象ハードウェア装置をプログラムするためにソースコードからプログラミングデータを作成するコンピュータ実装方法であって、
１つまたは複数のプロセッサを使用して、前記ソースコードを構文木に解析することと、
前記１つまたは複数のプロセッサを使用して、前記構文木をオートマトンに変換することであって、前記オートマトンが、複数の状態および前記複数の状態間の遷移を有する動作のモデルを定義し、かつ、前記オートマトンの構造が、前記対象ハードウェア装置によって決定される、前記構文木をオートマトンに変換することと、
前記１つまたは複数のプロセッサを使用して、前記オートマトンをネットリストに変換することであって、前記ネットリストが複数のインスタンスを含み、各インスタンスが対象ハードウェア装置のハードウェア要素に対応する、前記オートマトンをネットリストに変換することと、
前記１つまたは複数のプロセッサを使用して、前記インスタンスの各々を位置付けることであって、位置付けることが、前記ネットリスト内の各インスタンスを前記対象ハードウェア装置のハードウェア要素に割り当てることを含む、前記インスタンスの各々を位置付けることと、
前記１つまたは複数のプロセッサを使用し、前記ネットリストに応じて前記ハードウェア要素間の接続をルーティングすることと、
位置付けおよびルーティングに基づいて前記プログラミングデータを作成することと
を含む、コンピュータ実装方法。
【請求項１１】
前記構文木をオートマトンに変換することが、前記ソースコード内の数量化を、前記対象ハードウェア装置のカウンタ要素に対応する専用状態を含む、複数の状態に変換することを含む、請求項１０に記載のコンピュータ実装方法。
【請求項１２】
ＳＭＥに対応する複数の汎用状態が、Group of Two(ＧＯＴ)ハードウェア要素の出力制約に基づいてＧＯＴインスタンスを形成するために、ともにグループ化される、請求項１０に記載のコンピュータ実装方法。
【請求項１３】
前記オートマトンの入次数を制限することを含み、前記入次数を制限することが、前記オートマトンの状態への遷移数を制限することを含む、請求項１０に記載のコンピュータ実装方法。
【請求項１４】
前記入次数を制限することが、特定の状態を複数の状態に分割すること、および前記複数の状態の各々の入次数が制約を満足するように、前記特定の状態の駆動状態を前記複数の状態に分散することを含む、請求項１３に記載のコンピュータ実装方法。
【請求項１５】
前記入次数を制限することが、数量化を複数の展開された状態に展開すること、および任意の前記展開された状態に対する入遷移の前記数を制限することを含む、請求項１３に記載のコンピュータ実装方法。
【請求項１６】
プログラム可能装置であって、
１つまたは複数の入力および１つまたは複数の出力を含む、複数のプログラム可能要素と、
前記複数のプログラム可能要素の部分の外部回路に対するインタフェースのための入力ブロックおよび出力ブロックと、
前記複数のプログラム可能要素と、前記入力ブロックおよび前記出力ブロックを通信的に接続する複数のプログラム可能スイッチであって、１つまたは複数のプログラム可能スイッチの設定が、前記複数のプログラム可能要素および前記複数のプログラム可能スイッチのうちの任意の２つ以上の間をルーティングする信号を選択的に制御する、複数のプログラム可能スイッチと、
前記複数のプログラム可能要素および前記複数のプログラム可能スイッチを構成するためにソースコードから変換されるプログラミングデータを格納するように構成された複数のレジスタであって、前記プログラミングデータが：
１つまたは複数のプロセッサを使用して、前記ソースコードを構文木に解析することと；
前記１つまたは複数のプロセッサを使用して、前記構文木をオートマトンに変換することであって、前記オートマトンが、複数の状態および前記複数の状態間の遷移を有する動作のモデルを定義し、かつ、前記オートマトンの構造が、前記プログラム可能装置によって決定される、前記構文木をオートマトンに変換することと；
前記１つまたは複数のプロセッサを使用して、前記オートマトンをネットリストに変換することであって、前記ネットリストが複数のインスタンスを含み、各インスタンスが前記プログラム可能装置のハードウェア要素に対応する、前記オートマトンをネットリストに変換することと；
前記１つまたは複数のプロセッサを使用して、前記インスタンスの各々を位置付けることであって、位置付けることが、前記ネットリスト内の各インスタンスを前記プログラム可能装置のハードウェア要素に割り当てることを含む、前記インスタンスの各々を位置付けることと；
前記１つまたは複数のプロセッサを使用し、前記ネットリストに応じて前記ハードウェア要素間の接続をルーティングすることと；
位置付けおよびルーティングに基づいて、前記プログラミングデータを作成することと
によって作成される、複数のレジスタと
を含む、プログラム可能装置。
【請求項１７】
一時的な伝送信号ではない、命令を含むコンピュータ可読媒体であって、
前記命令が、１つまたは複数のプロセッサによって実装され、対象装置をプログラムするためにソースコードからプログラミングデータを作成するときに：
前記ソースコードを構文木に解析することと；
前記構文木をオートマトンに変換することであって、前記オートマトンが、複数の状態および前記複数の状態間の遷移を有する動作のモデルを定義し、かつ、前記オートマトンの構造が、対象装置によって決定される、前記構文木をオートマトンに変換することと；
前記オートマトンをネットリストに変換することであって、前記ネットリストが、前記対象装置に関連した、複数のハードウェア要素を含み、かつ、前記ネットリストが前記ハードウェア要素間の接続を定義する、前記オートマトンをネットリストに変換することと；
前記ハードウェア要素の各々を位置付けることであって、位置付けることが、前記ネットリスト内の各ハードウェア要素を前記対象装置内の位置に割り当てることを含む、前記ハードウェア要素の各々を位置付けることと；
前記ネットリストに応じて前記ハードウェア要素間の前記接続をルーティングすることと；
位置付けおよびルーティングを反映するように前記プログラミングデータを作成することと
を含む動作を実行する、
コンピュータ可読媒体。
【請求項１８】
前記構文木をオートマトンに変換することが、前記ソースコード内の数量化が、前記対象装置のカウンタにマッピングされるための条件を満足するかどうかを判断することを含み；
前記数量化が前記条件を満足する場合に、前記数量化を、カウンタ状態を含む複数の状態に変換し；かつ
前記数量化が前記条件を満足しない場合に、前記数量化を展開することにより、前記数量化を、複数のＳＭＥ状態に変換する、
請求項１７に記載のコンピュータ可読媒体。
【請求項１９】
前記数量化が前記条件を満足するかどうかを判断することが、前記数量化に対する駆動式が、前記数量化が処理されている間に一致できるかどうかを判断することを含む、請求項１８に記載のコンピュータ可読媒体。
【請求項２０】
前記数量化が前記条件を満足するかどうかを判断することが、前記数量化の繰返し式が前記数量化の別の繰返し式のプレフィックスであるかどうかを判断することを含む、請求項１９に記載のコンピュータ可読媒体。
【請求項２１】
前記数量化を、カウンタ状態を含む複数の状態に変換することが、前記複数の状態を、前記数量化の繰返し式および前記カウンタ状態を含むループとして実装することを含み、前記カウンタ状態が、前記繰返し式が一致する回数をカウントするように構成されていて、かつ、前記繰返し式が、前記数量化によって指定された回数一致する場合に、前記カウンタ状態が、下流の状態をアクティブにする、請求項２０に記載のコンピュータ可読媒体。
【請求項２２】
展開することが、前記対象装置の入次数制約に基づいて、前記オートマトンの入次数を制御するように前記数量化を展開することを含む、請求項２０に記載のコンピュータ可読媒体。
【請求項２３】
請求項１７のプロセスによって生成されたプログラミングデータを使用してプログラムされたプログラム可能装置。
【請求項２４】
対象ハードウェア装置をプログラムするためにソースコードからプログラミングデータを作成するコンピュータ実装方法であって、
１つまたは複数のプロセッサを使用して、前記ソースコードを構文木に解析することと；
前記１つまたは複数のプロセッサを使用して、前記構文木をオートマトンに変換することであって、前記変換することが：
前記対象ハードウェア装置に基づいて前記オートマトンの構造を制限することであって、前記対象ハードウェア装置が、２つのグループにペア形成された状態機械要素を含む、前記オートマトンの構造を制限すること
を含む、前記構文木をオートマトンに変換することと、
前記１つまたは複数のプロセッサを使用して、前記オートマトンをネットリストに変換することであって、前記ネットリストが、前記対象ハードウェア装置に関連付けられた複数のハードウェア要素を含み、かつ、前記ネットリストが前記ハードウェア要素間の接続を定義する、前記オートマトンをネットリストに変換することと；
前記１つまたは複数のプロセッサを使用して、前記ハードウェア要素の各々を位置付けることであって、位置付けることが、前記ネットリスト内の各ハードウェア要素を前記対象装置内の位置に割り当てることを含む、前記ハードウェア要素の各々を位置付けることと；
前記１つまたは複数のプロセッサを使用し、前記ネットリストに応じて前記ハードウェア要素間の前記接続をルーティングすることと；
位置付けおよびルーティングを反映するように前記プログラミングデータを作成することと
を含む、コンピュータ実装方法。
【請求項２５】
前記構文木をオートマトンに変換することが、共通の出力を共有する前記２つのグループに基づいて、前記オートマトンの構造を制限することを含む、請求項２４に記載の方法。
【請求項２６】
前記オートマトンの構造を制限することが、前記対象装置のカウンタ要素に基づいて、前記オートマトンの構造を制限することを含む、請求項２４に記載の方法。
【請求項２７】
前記プログラミングデータを公開することをさらに含む、
請求項２４に記載の方法。
【請求項２８】
複数の重複する状態を削減するために前記オートマトンを最適化することをさらに含む、請求項２４に記載の方法。
【請求項２９】
請求項２４のプロセスによって生成されたプログラミングデータを使用してプログラムされたプログラム可能装置。
【発明の詳細な説明】
【技術分野】
【０００１】
〔優先権主張〕
本特許出願は、２０１１年１月２５日に出願された、「ＭＥＴＨＯＤ  ＡＮＤ  ＡＰＰＡＲＡＴＵＳ  ＦＯＲ  ＣＯＭＰＩＬＩＮＧ  ＲＥＧＵＬＡＲ  ＥＸＰＲＥＳＳＩＯＮＳ」という名称の米国仮特許出願整理番号６１／４３６，０１３に対する優先権の利益を主張し、これによって、参照によりその全体として本明細書に組み込まれる。
【背景技術】
【０００２】
有限状態機械（ＦＳＭ）（有限状態オートマトン、オートマトン、または単に状態機械とも呼ばれる）は、状態、状態と動作との間の遷移の表現である。有限状態機械は、並列マシン用のデジタル論理、コンピュータプログラム、またはイメージを設計するために使用できる。有限状態機械は、有限数の状態、それら状態間の遷移、および出力から成る挙動のモデルである。有限状態機械は、グラフとして表すことができ、グラフのバーテックスが有限状態機械の状態に対応し、グラフのエッジが、有限状態機械に対する１つまたは複数の入力に起因して生じる状態間の遷移に対応する。有限状態機械は、確率的遷移、ファジー状態、または他の奇妙な事柄（ｏｄｄｉｔｙ）も持つことができる。有限状態機械は、有限の内部メモリ、入力特徴、および随意の出力特徴を有する。出力を有する有限状態機械は、有限状態トランスデューサと呼ぶことができる。
【０００３】
有限状態機械の用途には、コンピュータによる電子設計の自動化、通信プロトコル設計、生物学および人工知能研究、ならびに自然言語の文法を説明する言語学を含む。
【図面の簡単な説明】
【０００４】
【図１】本発明の様々な実施形態に従った、並列マシンの一例を示す。
【図２】本発明の様々な実施形態に従って、有限状態機械エンジンとして実装された図１の並列マシンの一例を示す。
【図３】本発明の様々な実施形態に従って、図２の有限状態機械エンジンのブロックの一例を示す。
【図４】本発明の様々な実施形態に従って、図３のブロックの行（ｒｏｗ）の一例を示す。
【図５】本発明の様々な実施形態に従って、図４の行の２つのグループの一例を示す。
【図６】本発明の様々な実施形態に従って、コンパイラがソースコードを、図１の並列マシンをプログラムするように構成されたイメージに変換するための方法の一例を示す。
【図７】本発明の様々な実施形態に従って、構文木をオートマトンに変換するための方法例に含まれ得る様々な動作を含む。
【図８】本発明の様々な実施形態に従って、構文木をオートマトンに変換するための方法を示す。
【図９】本発明の様々な実施形態に従って、専用カウンタ状態を有するオートマトンの一例を示す。
【図１０】本発明の様々な実施形態に従って、専用カウンタ状態を有するオートマトンの別の例を示す。
【図１１Ａ】本発明の様々な実施形態に従った、オートマトン例を示す。
【図１１Ｂ】本発明の様々な実施形態に従った、オートマトン例を示す。
【図１２】本発明の様々な実施形態に従って、プレフィックスなし条件を満足しない数量化を有する正規表現のためのオートマトンの一例を示す。
【図１３Ａ】本発明の様々な実施形態に従って、数量化を展開するためのオートマトンの例を示す。
【図１３Ｂ】本発明の様々な実施形態に従って、数量化を展開するためのオートマトンの例を示す。
【図１３Ｃ】本発明の様々な実施形態に従って、数量化を展開するためのオートマトンの例を示す。
【図１４Ａ】本発明の様々な実施形態に従って、オートマトンの入次数制限の一部としての状態分割を示す。
【図１４Ｂ】本発明の様々な実施形態に従って、オートマトンの入次数制限の一部としての状態分割を示す。
【図１５Ａ】本発明の様々な実施形態に従った、ネットリストの例を示す。
【図１５Ｂ】本発明の様々な実施形態に従った、ネットリストの例を示す。
【図１６】本発明の様々な実施形態に従って、フォンノイマン型アーキテクチャを有するコンピュータの例を示す。
【発明を実施するための形態】
【０００５】
以下の説明および図は、特定の実施形態を当業者が実施できるように十分に説明する。他の実施形態は、構造的、論理的、電気的、プロセス、および他の変更を包含し得る。いくつかの実施形態の部分および特徴は、他の実施形態に含まれ得るか、または他の実施形態のそれらと置き換えられ得る。請求項に規定される実施形態は、それらの請求項の全ての利用可能な均等物を包含する。
【０００６】
本文書では、特に、並列マシンを構成する（例えば、プログラム化する）ために、ソースコード（例えば、正規表現）を機械コード（例えば、イメージ）に変換するためのコンパイラを説明する。コンパイラによって生成されたイメージ（出力ファイル）は、ある機能を実行するために並列マシンをプログラムできる。ある例では、並列マシンは、有限状態機械（ＦＳＭ）エンジン、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、およびそれらの変形形態を含み得る。
【０００７】
図１は、対象装置（例えば、並列マシン１００）の一例を示す。並列マシン１００は、入力データを受信し、その入力データに基づいて出力を提供できる。並列マシン１００は、入力データを受信するためのデータ入力ポート１１０および出力を別の装置に提供するための出力ポート１１４を含むことができる。データ入力ポート１１０は、並列マシン１００に入力されるデータ用のインタフェースを提供する。
【０００８】
並列マシン１００は、汎用要素１０２および専用要素１１２を含む、複数のプログラム可能要素を含む。汎用要素１０２は、１つまたは複数の入力１０４および１つまたは複数の出力１０６を含み得る。汎用要素１０２は、複数の状態のうちの１つにプログラムされ得る。汎用要素１０２の状態は、汎用要素１０２が、所与の入力に基づいて、何の出力を提供するかを決定する。すなわち、汎用要素１０２の状態は、プログラム可能要素が所与の入力に対してどのように反応する（例えば、応答する）かを決定する。データ入力ポート１１０に対するデータ入力は、汎用要素１０２にそれに対する処置を取らせるため、複数の汎用要素１０２に提供され得る。汎用要素１０２の例には、例えば、他のプログラム可能要素の中で、状態機械要素（ＳＭＥ）、以下で詳細に説明するように、カウンタ、および／または構成可能論理ブロックを含むことができる。一例では、ＳＭＥは、所与の入力がデータ入力ポート１１０で受信される場合に、特定の出力（例えば、高信号つまり「１」信号）を提供するようにプログラム（例えば、設定）され得る。所与の入力以外の入力がデータ入力ポート１１０で受信される場合、ＳＭＥは異なる出力（例えば、低信号つまり「０」信号）を提供し得る。一例では、構成可能論理ブロックは、データ入力ポート１１０で受信された入力に基づいて、ブール論理関数（例えば、ＡＮＤ、ＯＲ、ＮＯＲなど）を実行するように設定できる。カウンタの例については、本明細書において後で説明する。専用要素１１２は、メモリ（例えば、ＲＡＭ）、論理ゲート、カウンタ、ルックアップテーブル、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、および他のハードウェア要素を含むことができる。専用要素１１２は、汎用要素１０２とやりとりすることができ、専用機能を実行する。
【０００９】
並列マシン１００は、プログラム（例えば、イメージ）を並列マシン１００上にロードするためのプログラミングインタフェース１１１も含むことができる。イメージは、汎用要素１０２の状態をプログラム（例えば、設定）できる。すなわち、イメージは、所与の入力に対して特定の方法で反応するように汎用要素１０２を構成できる。例えば、汎用要素１０２は、文字‘ａ’がデータ入力ポート１１０で受信される場合、高信号を出力するように設定できる。いくつかの例では、並列マシン１００は、汎用要素１０２の動作のタイミングを制御するためのクロック信号を使用できる。いくつかの実施形態では、データ入力ポート１１０で受信されるデータは、長い時間をかけて、もしくは一度にそろって受信されたデータの一定のセット、または長い時間をかけて受信されたデータのストリームを含むことができる。データは、並列マシン１００に結合された、データベース、センサー、ネットワークなどの任意のソースから受信され得るか、またはそれらによって生成され得る。
【００１０】
並列マシン１００は、並列マシン１００の異なる要素（例えば、汎用要素１０２、データ入力ポート１１０、出力ポート１１４、プログラミングインタフェース１１１、および専用要素１１２）を選択的に共に結合するための複数のプログラム可能スイッチ１０８も含む。その結果、並列マシン１００は、要素間で形成されたプログラム可能マトリックス（ｐｒｏｇｒａｍｍａｂｌｅ  ｍａｔｒｉｘ）を含む。一例では、汎用要素１０２の入力１０４、データ入力ポート１１０、プログラミングインタフェース１１１、または専用要素１１２が、１つまたは複数のプログラム可能スイッチ１０８を通して、汎用要素１０２の出力１０６、出力ポート１１４、プログラミングインタフェース１１１、または専用要素１１２に結合できるように、プログラム可能スイッチ１０８が、２つ以上の要素を選択的に互いに結合できる。従って、要素間の信号のルーティングが、プログラム可能スイッチ１０８を設定することによって制御できる。図１は、所与の要素とプログラム可能スイッチ１０８との間の特定数の導体（例えば、ワイヤー）を示しているが、他の例では、異なる数の導体が使用できることが理解されるはずである。また、図１は、個別にプログラム可能スイッチ１０８に結合された各汎用要素１０２を示しているが、他の例では、複数の汎用要素１０２がグループ（例えば、図２に示すような、ブロック２０２）としてプログラム可能スイッチ１０８に結合できる。一例では、データ入力ポート１１０、データ出力ポート１１４、および／またはプログラミングインタフェース１１１はレジスタとして実装でき、レジスタへの書込みが、それぞれの要素にデータを提供するか、またはそれぞれの要素からデータを提供するようにする。
【００１１】
一例では、単一の並列マシン１００が物理デバイス上に実装されるが、他の例では、２つ以上の並列マシン１００が単一の物理デバイス（例えば、物理チップ）上に実装できる。一例では、複数の並列マシン１００の各々が、別個のデータ入力ポート１１０、別個の出力ポート１１４、別個のプログラミングインタフェース１１１、および汎用要素１０２の別個のセットを含むことができる。さらに、汎用要素１０２の各セットは、それらの対応する入力データポート１１０でデータに反応（例えば、高信号または低信号を出力）できる。例えば、第１の並列マシン１００に対応する汎用要素１０２の第１のセットは、第１の並列マシン１００に対応する第１のデータ入力ポート１１０でデータに反応できる。第２の並列マシン１００に対応する汎用要素１０２の第２のセットは、第２の並列マシン１００に対応する第２のデータ入力ポート１１０に反応できる。その結果、各並列マシン１００は、１セットの汎用要素１０２を含み、異なるセットの汎用要素１０２は、異なる入力データに反応できる。同様に、各並列マシン１００、および汎用要素１０２の各対応するセットは、別個の出力を提供できる。いくつかの例では、第２の並列マシン１００に対する入力データが、第１の並列マシン１００からの出力データを含むことができるように、第１の並列マシン１００からの出力ポート１１４が、第２の並列マシン１００の入力ポート１１０に結合できる。
【００１２】
一例では、並列マシン１００上にロードするためのイメージは、汎用要素１０２の状態を設定するため、プログラム可能スイッチ１０８をプログラミングするため、および並列マシン１００内で専用要素１１２を構成するための複数のビットの情報を含む。一例では、ある入力に基づいて所望の出力を提供するように並列マシン１００をプログラムするために、イメージが並列マシン１００上にロードできる。出力ポート１１４は、入力ポート１１０で受信されたデータに対する汎用要素１０２の反応に基づいて、並列マシン１００からの出力を提供できる。出力ポート１１４からの出力は、所与のパターンの一致を示す単一ビット、複数のパターンに対する一致および不一致を示す複数のビットを含むワード（ｗｏｒｄ）、ならびに所与の時に全てまたは特定の汎用要素１０２の状態に対応する出力ベクトルを含むことができる。
【００１３】
並列マシン１００に関する使用例には、パターン認識（例えば、音声認識、画像認識など）、信号処理、画像処理、コンピュータビジョン、暗号化、およびその他を含む。ある例では、並列マシン１００は、有限状態機械（ＦＳＭ）エンジン、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、およびそれらの変形を含むことができる。さらに、並列マシン１００は、コンピュータ、ポケットベル、携帯電話、電子手帳、携帯音楽プレーヤ、ネットワーク装置（例えば、ルータ、ファイアウォール、スイッチ、またはそれらの任意の組合せ）、制御回路、カメラなどの、大きな装置内のコンポーネントであり得る。
【００１４】
図２〜図５は、有限状態機械（ＦＳＭ）エンジン２００として実装された別の並列マシンを示す。一例では、ＦＳＭエンジン２００は、有限状態機械のハードウェア実装を含む。その結果、ＦＳＭエンジン２００は、ＦＳＭ内の複数の状態に対応する、複数の選択的に結合可能なハードウェア要素（例えば、プログラム可能要素）を実装する。ＦＳＭ内の状態と同様に、ハードウェア要素は、入力ストリームを分析し、その入力ストリームに基づいて下流のハードウェア要素をアクティブにできる。
【００１５】
ＦＳＭエンジン２００は、汎用要素および専用要素を含む、複数のプログラム可能要素を含む。汎用要素は、多数の異なる機能を実装するようにプログラムされ得る。これらの汎用要素は、行（ｒｏｗ）２０６（図３および図４に示す）およびブロック２０２（図２および図３に示す）に階層的に編成されているＳＭＥ  ２０４、２０５（図５に示す）を含む。階層的に編成されたＳＭＥ  ２０４、２０５間で信号をルーティングするために、ブロック間スイッチ２０３（図２および図３に示す）、ブロック内スイッチ２０８（図３および図４に示す）、ならびに行内（ｉｎｔｒａ−ｒｏｗ）スイッチ２１２（図４に示す）を含む、プログラム可能スイッチの階層が使用される。ＳＭＥ  ２０４、２０５は、ＦＳＭエンジン２００によって実装されたＦＳＭの状態に対応できる。ＳＭＥ  ２０４、２０５は、以下で説明するように、プログラム可能スイッチの使用によって共に結合できる。その結果、ＦＳＭは、状態の機能に対応するようにＳＭＥ  ２０４、２０５をプログラミングすることにより、また、ＦＳＭ内の状態間の遷移に対応するため、ＳＭＥ  ２０４、２０５を選択的に共に結合することにより、ＦＳＭエンジン２００上に実装できる。
【００１６】
図２は、ＦＳＭエンジン例２００の全体図を示す。ＦＳＭエンジン２００は、プログラム可能ブロック間スイッチ２０３と選択的に共に結合できる複数のブロック２０２を含む。さらに、ブロック２０２は、信号（例えば、データ）を受信するため、およびデータをブロック２０２に提供するために、入力ブロック２０９（例えば、データ入力ポート）に選択的に結合できる。ブロック２０２は、ブロック２０２から外部デバイス（例えば、別のＦＳＭエンジン２００）に信号を提供するために、出力ブロック２１３（例えば、出力ポート）にも選択的に結合できる。ＦＳＭエンジン２００は、プログラム（例えば、イメージ）をＦＳＭエンジン２００上にロードするために、プログラミングインタフェース２１１も含み得る。イメージは、ＳＭＥ  ２０４、２０５の状態をプログラム（設定）できる。すなわち、イメージは、入力ブロック２０９で所与の入力に対して特定の方法で反応するように、ＳＭＥ  ２０４、２０５を構成できる。例えば、ＳＭＥ  ２０４は、入力ブロック２０９で文字「ａ」が受信される場合、高信号を出力するように設定できる。
【００１７】
一例では、入力ブロック２０９、出力ブロック２１３、および／またはプログラミングインタフェース２１１はレジスタとして実装でき、そのレジスタへの書込みがそれぞれの要素に対して、またはそれぞれの要素から、データを提供できるようにする。その結果、プログラミングインタフェース２１１に対応するレジスタ内に格納されているイメージからのビットが、ＳＭＥ  ２０４、２０５上にロードできる。図２は、ブロック２０２、入力ブロック２０９、出力ブロック２１３、およびブロック間スイッチ２０３の間に特定数の導体（例えば、ワイヤ、線）を示しているが、他の例では、もっと少ないかまたは多い導体が使用できることが理解されるはずである。
【００１８】
図３は、ブロック２０２の一例を示す。ブロック２０２は、プログラム可能ブロック内スイッチ２０８と選択的に共に結合できる複数の行２０６を含むことができる。その結果、行２０６は、ブロック間スイッチ２０３で、別のブロック２０２内の別の行２０６と選択的に結合できる。一例では、バッファ２０１は、ブロック間スイッチ２０３への／ブロック間スイッチ２０３からの信号のタイミングを制御するために含まれる。行２０６は、本明細書で２つのグループ（ＧＯＴ：ｇｒｏｕｐ  ｏｆ  ｔｗｏ）２１０として参照される要素のペアに編成された複数のＳＭＥ  ２０４、２０５を含む。一例では、ブロック２０２は、１６個の行２０６を含む。
【００１９】
図４は、行２０６の一例を示す。ＧＯＴ  ２１０は、プログラム可能行内スイッチ２１２によって、行２０６内の他のＧＯＴ  ２１０および任意の他の要素２２４と選択的に結合できる。また、ＧＯＴ  ２１０は、ブロック内スイッチ２０８で他の行２０６内の他のＧＯＴ  ２１０と、またはブロック間スイッチ２０３で他のブロック２０２内の他のＧＯＴ  ２１０とも結合できる。一例では、ＧＯＴ  ２１０は、第１および第２の入力２１４、２１６ならびに出力２１８を有する。第１の入力２１４は、ＧＯＴ  ２１０の第１のＳＭＥ  ２０４と結合され、第２の入力２１４は、ＧＯＴ  ２１０の第２のＳＭＥ  ２０４と結合される。
【００２０】
一例では、行２０６は、第１および第２の複数の行相互接続導体２２０、２２２を含む。一例では、ＧＯＴ  ２１０の入力２１４、２１６は、１つまたは複数の行相互接続導体２２０、２２２に結合でき、出力２１８は、１つの行相互接続導体２２０、２２２に結合できる。一例では、第１の複数の行相互接続導体２２０は、行２０６内の各ＧＯＴ  ２１０の各ＳＭＥ  ２０４に結合できる。第２の複数の行相互接続導体２２２は、行２０６内の各ＧＯＴ  ２１０の１つのＳＭＥ  ２０４に結合できるが、そのＧＯＴ  ２１０の他のＳＭＥ  ２０４には結合できない。一例では、第２の複数の行相互接続導体２２２の半分の第１の方が、行２０６内のＳＭＥ  ２０４の半分の第１の方（各ＧＯＴ  ２１０からの１つのＳＭＥ  ２０４）と結合でき、第２の複数の行相互接続導体２２２の半分の第２の方が、行２０６内のＳＭＥ  ２０４の半分の第２の方（各ＧＯＴ  ２１０からのその他のＳＭＥ  ２０４）と結合できる。第２の複数の行相互接続導体２２２とＳＭＥ  ２０４、２０５との間の制限された接続性は、本明細書では「パリティ」と呼ばれる。
【００２１】
一例では、行２０６は、カウンタ、プログラム可能ブール論理要素、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、特定用途向け集積回路（ＡＳＩＣ）、プログラム可能プロセッサ（例えば、マイクロプロセッサ）、および他の要素などの、専用要素２２４も含むことができる。追加として、一例では、専用要素２２４は、異なる行２０６内では異なる。例えば、ブロック２０２内の４つの行２０６が、専用要素２２４としてブール論理を含むことができ、ブロック２０２内の他の８つの行２０６が、専用要素２２４としてカウンタを含むことができる。
【００２２】
一例では、専用要素２２４は、カウンタ（本明細書ではカウンタ２２４とも呼ばれる）を含む。一例では、カウンタ２２４は、１２ビットのプログラマブル減算カウンタを含む。１２ビットのプログラマブルカウンタ２２４は、カウント入力、リセット入力、およびゼロカウント出力を有する。カウント入力は、アサート時に、カウンタ２２４の値を１だけ減算する。リセット入力は、アサート時に、カウンタ２２４に、関連したレジスタから初期値をロードさせる。１２ビットのカウンタ２２４に対して、最大で１２ビット数が初期値としてロードできる。カウンタ２２４の値がゼロ（０）に減算されると、ゼロカウント出力がアサートされる。カウンタ２２４は、少なくとも２つのモード、パルスおよび保留（ｈｏｌｄ）を有する。カウンタ２２４がパルスモードに設定されている場合、カウンタ２２４がゼロに減算されると、第１のクロック周期中にゼロカウント出力がアサートされ、また、次のクロック周期では、たとえカウント入力がアサートされても、ゼロカウント出力はもはやアサートされない。この状態は、カウンタ２２４が、アサートされているリセット入力によってリセットされるまで、継続する。カウンタ２２４が保留モードに設定されている場合、カウンタ２２４がゼロに減算されると、第１のクロック周期中にゼロカウント出力がアサートされ、また、カウント入力がアサートされる場合、カウンタ２２４が、アサートされているリセット入力によってリセットされるまで、アサートされたままである。
【００２３】
図５は、ＧＯＴ  ２１０の一例を示す。ＧＯＴ  ２１０は、入力２１４、２１６を有し、かつＯＲゲート２３０および３対１マルチプレクサ２４２に結合されたそれらの出力２２６、２２８を有する、第１のＳＭＥ  ２０４および第２のＳＭＥ  ２０５を含む。３入力マルチプレクサ２４２は、ＧＯＴ  ２１０の出力２１８を、第１のＳＭＥ  ２０４、第２のＳＭＥ  ２０５、またはＯＲゲート２３０のいずれかに結合するように設定できる。ＯＲゲート２３０は、ＧＯＴ  ２１０の共通の出力２１８を形成するため、出力２２６、２２８の両方を共に結合するために使用できる。一例では、前述したように、第１および第２のＳＭＥ  ２０４、２０５はパリティを示し、そこで、第１のＳＭＥ  ２０４の入力２１４は、行相互接続導体２２２のいくつかに結合でき、第２のＳＭＥ  ２０５の入力２１６は、他の行相互接続導体２２２に結合できる。一例では、ＧＯＴ  ２１０内の２つのＳＭＥ  ２０４、２０５は、スイッチ２４０の一方または両方を設定することにより、カスケード接続できるか、かつ／またはそれら自身にループバックできる。ＳＭＥ  ２０４、２０５は、ＳＭＥ  ２０４、２０５の出力２２６、２２８を他のＳＭＥ  ２０４、２０５の入力２１４、２１６に結合することにより、カスケード接続できる。ＳＭＥ  ２０４、２０５は、出力２２６、２２８をそれら自身の入力２１４、２１６に結合することにより、自身にループバックできる。その結果、第１のＳＭＥ  ２０４の出力２２６は、第１のＳＭＥ  ２０４の入力２１４および第２のＳＭＥ  ２０５の入力２１６のどちらとも結合できないか、一方または両方と結合できる。
【００２４】
一例では、状態機械要素２０４、２０５は、検出線２３４と平行に結合された、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）でしばしば使用されるような、複数のメモリセル２３２を含む。１つのかかるメモリセル２３２は、高値または低値（例えば、１または０）のいずれかに対応するものなどの、データ状態に設定できるメモリセルを含む。メモリセル２３２の出力は、検出線２３４に結合され、メモリセル２３２への入力は、データストリーム線２３６上のデータに基づいて、信号を受信する。一例では、データストリーム線２３６上の入力が、メモリセル２３２の１つを選択するために復号される。選択されたメモリセル２３２は、その格納されたデータ状態を出力として検出線２３４上に提供する。例えば、データ入力ポート２０９で受信されたデータがデコーダ（図示せず）に提供でき、デコーダは、データストリーム線２３６のうちの１本を選択できる。一例では、デコーダは、ＡＳＣＩＩ文字を２５６ビットのうちの１つに変換できる。
【００２５】
メモリセル２３２は、それ故、メモリセル２３２が高値に設定され、かつ、データストリーム線２３６上のデータがメモリセル２３２に対応する場合、高信号を検出線２３４に出力する。データストリーム線２３６上のデータがメモリセル２３２に対応し、メモリセル２３２が低値に設定されている場合、メモリセル２３２は、低信号を検出線２３４に出力する。メモリセル２３２からの検出線２３４上への出力は、検出回路２３８によって検知される。一例では、入力線２１４、２１６上の信号は、それぞれの検出回路２３８をアクティブ状態または非アクティブ状態のいずれかに設定する。非アクティブ状態に設定されると、検出回路２３８は、それぞれの検出線２３４上の信号にかかわらず、低信号をそれぞれの出力２２６、２２８上に出力する。アクティブ状態に設定されると、高信号がそれぞれのＳＭＥ  ２０４、２０５のメモリセル２３４の１つから検出される場合、検出回路２３８は、高信号をそれぞれの出力線２２６、２２８上に出力する。アクティブ状態にある場合、それぞれのＳＭＥ  ２０４、２０５のメモリセル２３４の全てからの信号が低ければ、検出回路２３８は、低信号をそれぞれの出力線２２６、２２８上に出力する。
【００２６】
一例では、ＳＭＥ  ２０４、２０５は、２５６のメモリセル２３２を含み、各メモリセル２３２は、異なるデータストリーム線２３６に結合される。それ故、ＳＭＥ  ２０４、２０５は、選択された１つまたは複数のデータストリーム線２３６がその上に高信号を有する場合、高信号を出力するようにプログラムされ得る。例えば、ＳＭＥ  ２０４は、第１のメモリセル２３２（例えば、ビット０）を高に設定し、他の全てのメモリセル２３２（例えば、ビット１〜２５５）を低に設定できる。それぞれの検出回路２３８がアクティブ状態にあるとき、ＳＭＥ  ２０４は、ビット０に対応するデータストリーム線２３６がその上に高信号を有する場合、高信号を出力２２６上に出力する。他の例では、複数のデータストリーム線２３６のうちの１本が、適切なメモリセル２３２を高値に設定することにより、その上に高信号を有する場合、ＳＭＥ  ２０４は、高信号を出力するように設定できる。
【００２７】
一例では、メモリセル２３２は、関連したレジスタからビットを読み取ることにより、高値または低値に設定できる。その結果、ＳＭＥ  ２０４は、コンパイラによって作成されたイメージをレジスタ内に格納し、レジスタ内のビットを関連したメモリセル２３２にロードすることにより、プログラムされ得る。一例では、コンパイラによって作成されたイメージは、高および低（例えば、１および０）ビットのバイナリイメージを含む。イメージは、ＳＭＥ  ２０４、２０５をカスケード接続することにより、ＦＳＭエンジン２００をＦＳＭとして動作するようにプログラムできる。例えば、第１のＳＭＥ  ２０４は、検出回路２３８をアクティブ状態に設定することにより、アクティブ状態に設定できる。第１のＳＭＥ  ２０４は、ビット０に対応するデータストリーム線２３６がその上に高信号を有する場合、高信号を出力するように設定できる。第２のＳＭＥ  ２０５は、最初は非アクティブ状態に設定できるが、アクティブなとき、ビット１に対応するデータストリーム線２３６がその上に高信号を有する場合、高信号を出力するように設定できる。第１のＳＭＥ  ２０４および第２のＳＭＥ  ２０５は、第１のＳＭＥ  ２０４の出力２２６を第２のＳＭＥ  ２０５の入力２１６に結合するように設定することにより、カスケード接続できる。従って、高信号が、ビット０に対応するデータストリーム線２３６上で検知される場合、第１のＳＭＥ  ２０４は、高信号を出力２２６上に出力し、第２のＳＭＥ  ２０５の検出回路２３８をアクティブ状態に設定する。高信号が、ビット１に対応するデータストリーム線２３６上で検知される場合、第２のＳＭＥ  ２０５は、別のＳＭＥ  ２０５をアクティブにするため、またはＦＳＭエンジン２００からの出力のため、高信号を出力２２８上に出力する。
【００２８】
図６は、コンパイラがソースコードを、並列マシンをプログラムするように構成されたイメージに変換するための方法６００の一例を示す。方法６００は、ソースコードを構文木に解析すること（ブロック６０２）、構文木をオートマトンに変換すること（ブロック６０４）、オートマトンを最適化すること（ブロック６０６）、オートマトンをネットリストに変換すること（ブロック６０８）、ネットリストをハードウェア上に配置すること（ブロック６１０）、ネットリストをルーティングすること（ブロック６１２）、および結果として生じるイメージを公開すること（ブロック６１４）を含む。
【００２９】
一例では、コンパイラは、ソフトウェア開発者がＦＳＭエンジン６００上でＦＳＭを実装するために、イメージを作成できるようにする、アプリケーションプログラミングインタフェース（ＡＰＩ）を含む。コンパイラは、ソースコード内の正規表現の入力セットを、ＦＳＭエンジン６００をプログラムするように構成されているイメージに変換するための方法を提供する。コンパイラは、フォンノイマン型アーキテクチャを有するコンピュータ用の命令によって実装できる。これらの命令は、コンピュータ上のプロセッサにコンパイラの機能を実装させることができる。例えば、命令は、プロセッサによって実行される場合、プロセッサがアクセス可能なソースコード上のブロック６０２、６０４、６０６、６０８、６１０、６１２、および６１４に記載する動作をプロセッサに実行させることができる。フォンノイマン型アーキテクチャを有するコンピュータ例が図１６に示され、以下で説明される。
【００３０】
一例では、ソースコードは、シンボルグループ内のシンボルのパターンを識別するための検索文字列を記述する。検索文字列を記述するため、ソースコードは、複数の正規表現（ｒｅｇｅｘ）を含むことができる。正規表現は、シンボル検索パターンを記述するための文字列であり得る。正規表現は、プログラミング言語、テキストエディタ、ネットワークセキュリティ、およびその他などの、様々なコンピュータドメインで幅広く使用されている。一例では、コンパイラによってサポートされる正規表現は、非構造化データを検索するための検索基準を含む。非構造化データは、自由形式のデータを含み得、データ内のワード（ｗｏｒｄ）に適用された指標付けがない。ワードは、データ内に、印刷可能および印字不能な、バイトの任意の組合せを含み得る。一例では、コンパイラは、Ｐｅｒｌ（例えば、Ｐｅｒｌ互換正規表現（ＰＣＲＥ））、ＰＨＰ、Ｊａｖａ（登録商標）、および、ＮＥＴ言語を含む、正規表現を実装するための、複数の異なるソースコード言語をサポートできる。
【００３１】
図６を再度参照すると、ブロック６０２で、コンパイラは、ソースコードを解析して、関係的に結合された演算子の配置を形成でき、そこでは、異なるタイプの演算子は、ソースコードによって実装された異なる機能（例えば、ソースコード内の正規表現によって実装された異なる機能）に対応する。ソースコードの解析により、ソースコードの一般的表現を作成できる。一例では、一般的表現は、ソースコード内の正規表現の、構文木として知られているツリーグラフの形でコード化された表現を含む。本明細書で説明する例は、その配列を構文木（「抽象構文木」としても知られている）と呼ぶが、しかし、他の例では、具象構文木または他の配列も使用できる。
【００３２】
前述したように、コンパイラは、複数言語のソースコードをサポートできるので、解析は、その言語にかかわらず、ソースコードを、例えば、構文木などの、言語固有でない表現に変換する。従って、コンパイラによるさらなる処理（ブロック６０４、６０６、６０８、６１０）は、ソースコードの言語にかかわらず、共通の入力構造から動作できる。
【００３３】
前述したように、構文木は、関係的に結合されている複数の演算子を含む。構文木は、複数の異なるタイプの演算子を含むことができる。すなわち、異なる演算子は、ソースコード内の正規表現によって実装された異なる機能に対応できる。
【００３４】
ブロック６０４で、構文木はオートマトンに変換される（例えば、変形される）。一例では、オートマトンは、ＦＳＭのソフトウェアモデルを含み、それに応じて、決定性または非決定性として分類できる。決定性オートマトンは、一時に、単一経路の実行を有するが、他方、非決定性オートマトンは、複数の並列経路の実行を有する。オートマトンは、ノードによって表すことができる複数の状態を含む。構文木をオートマトンに変換するために、構文木内の演算子および演算子間の関係が、オートマトン内の状態間の遷移（有向エッジによって表される）をもつ状態（ノードによって表される）に変換される。一例では、オートマトンは、ＦＳＭエンジン２００のハードウェアに一部基づいて変換され得る。
【００３５】
一例では、オートマトンに対する入力シンボルは、アルファベット、０〜９の数字、および他の印刷可能な文字のシンボルを含む。一例では、入力シンボルは、バイト値０〜２５５で表される。一例では、オートマトンは、グラフのノードが状態の集合に対応する有向グラフとして表され得る。一例では、オートマトンによって受け入れられた（例えば、一致した）データは、オートマトンに連続して入力される場合に、最終状態に達し得る全ての可能な文字データの集合である。オートマトンによって受け入れられたデータ内の各シンボルは、開始状態から１つまたは複数の最終状態への経路を辿る。
【００３６】
一例では、オートマトンは、汎用状態ならびに専用状態を含む。汎用状態および専用状態は、コンパイラがそれに対して機械コードを生成している対象装置によってサポートされる汎用要素および専用要素に対応する。異なるタイプの対象装置は、異なるタイプの汎用要素ならびに１つまたは複数の異なるタイプの専用要素をサポートできる。汎用要素は、通常、幅広い範囲の機能を実装するために使用でき、他方、専用要素は、通常、もっと狭い範囲の機能を実装するために使用できる。しかし、一例では、専用要素は、例えば、その狭い範囲の機能内でより大きな効果を得ることができる。その結果、専用要素は、例えば、対象装置において特定の機能を実装するために必要なマシンサイクルまたはマシンリソースを削減するために使用できる。いくつかの例では、対象装置は、単に専用要素をサポートし、そこで、複数の異なるタイプの専用要素がサポートされる。
【００３７】
コンパイラがＦＳＭエンジン２００に対して機械コードを生成している例では、汎用状態はＳＭＥ  ２０４、２０５に対応でき、汎用状態はそれに応じて本明細書では「ＳＭＥ状態」と呼ばれる。さらに、コンパイラがＦＳＭエンジン６００に対して機械コードを生成している場合、専用状態は、カウンタ２２４に対応でき、それに応じて本明細書では「カウンタ状態」と呼ばれる。一例では、オートマトン内のＳＭＥ状態は、ＳＭＥにマッピングしないオートマトンの開始状態を除いて、ＦＳＭエンジン２００内のＳＭＥ（例えば、ＳＭＥ  ２０４、２０５）に１：１でマッピングする。カウンタ２２４は、カウンタ状態に１：１でマッピングすることもあれば、しないこともある。
【００３８】
一例では、入力シンボル範囲外の特別な遷移シンボルが、オートマトン内で使用され得る。これらの特別な遷移シンボルは、例えば、専用要素２２４の使用を可能にするために使用できる。さらに、特別な遷移シンボルは、入力シンボル以外の何かを受けて起こる遷移を提供するために使用できる。例えば、特別な遷移シンボルは、第２の状態および第３の状態の両方が有効な場合に、第１の状態が有効にされる（例えば、遷移される）ことを示し得る。その結果、第１の状態は、第２の状態および第３の状態の両方がアクティブにされる場合にアクティブにされ、また、第１の状態への遷移は、入力シンボルに直接依存しない。特に、第２の状態および第３の状態の両方が有効な場合に、第１の状態が有効にされることを示す特別な遷移シンボルは、例えば、専用要素２２４としてのブール論理によって実行されるブールＡＮＤ関数を表すために使用できる。一例では、特別な遷移シンボルは、カウンタ状態がゼロに達したこと、従って下流の状態への遷移を示すために使用できる。
【００３９】
一例では、構文木から作成されたオートマトンは、均質な（ｈｏｍｏｇｅｎｏｕｓ）オートマトンである。均質なオートマトンは、一般的なオートマトン定義に関する制限である。その制限は、１つの状態に入る全ての遷移が同じ入力シンボルに関して起こらなければならないことを必要とする。均質なオートマトンは、以下の条件を満足する：任意の２つの状態、ｑ１およびｑ２に対して、ｒ∈δ（ｑ１）∩δ（ｑ２）であれば、Ｓ１＝｛ａ｜ａ∈Σ，ｒ∈δ（ｑ１，ａ）｝、Ｓ２＝｛ａ｜ａ∈Σ，ｒ∈δ（ｑ２，ａ）｝を示す。Ｓ１は、ｑ１がｒに遷移できるようにするシンボルの集合であり、Ｓ２は、ｑ２がｒに遷移できるようにするシンボルの集合である。ここで、Ｓ１＝Ｓ２、すなわち、状態ｑ１および状態ｑ２が両方とも状態ｒに遷移する場合、均質な制限は、遷移が同じシンボルを受けて起こらなければならないことである。
【００４０】
構文木のオートマトンへの変換についてのさらなる詳細は、図７に関連する以下の説明を参照されたい。
【００４１】
ブロック６０６で、オートマトンが構築された後、オートマトンは、とりわけ、その複雑性およびサイズを縮小するように最適化される。オートマトンは、重複する状態を結合することにより最適化できる。
【００４２】
ブロック６０８で、オートマトンがネットリストに変換される。オートマトンのネットリストへの変換は、オートマトンの状態をＦＳＭエンジン２００のハードウェア要素（例えば、ＳＭＥ  ２０４、２０５、ＧＯＴ  ２１０、専用要素２２４）のインスタンスにマッピングし、インスタンス間の関係を決定する。一例では、ネットリストは、複数のインスタンスを含み、各インスタンスは、ＦＳＭエンジン２００のハードウェア要素に対応する（例えば、表す）。各インスタンスは、別のインスタンスへの接続のための１つまたは複数の接続点（本明細書では「ポート」とも呼ばれる）を持つことができる。ネットリストは、インスタンスに対応するハードウェア要素を結合する導体に対応する（例えば、表す）インスタンスのポート間の複数の接続も含む。一例では、ネットリストは、異なるタイプのハードウェア要素に対応する異なるタイプのインスタンスを含む。例えば、ネットリストは、汎用ハードウェア要素に対応する汎用インスタンスおよび専用ハードウェア要素に対応する専用インスタンスを含むことができる。一例として、汎用状態は汎用インスタンスに変換することができ、専用状態は、専用インスタンスに変換することができる。一例では、汎用インスタンスは、ＳＭＥ  ２０４、２０５に対するＳＭＥインスタンス、およびＳＭＥのグループを含むハードウェア要素に対するＳＭＥグループインスタンスを含むことができる。一例では、ＳＭＥグループインスタンスは、ＧＯＴ  ２１０に対応するＧＯＴインスタンスを含むが、他の例では、ＳＭＥグループインスタンスは、３つ以上のＳＭＥのグループを含むハードウェア要素に対応できる。専用インスタンスは、カウンタ２２４に対するカウンタインスタンス、および論理要素２２４に対する論理インスタンスを含み得る。ＧＯＴ  ２１０は２つのＳＭＥ  ２０４、２０５を含むので、ＧＯＴインスタンスは、２つのＳＭＥインスタンスを含む。
【００４３】
ネットリストを作成するために、オートマトン内の状態が、ネットリスト内のインスタンスに変換されるが、開始状態が対応するインスタンスを持たないことを除く。ＳＭＥ状態は、ＧＯＴインスタンスに変換され、カウンタ状態はカウンタインスタンスに変換される。その上、第１のインスタンスから第２のインスタンスへの対応する接続が、第１のインスタンスに対応する状態から第２のインスタンスに対応する状態への遷移に対して作成される。ＦＳＭエンジン２００内のＳＭＥ  ２０４、２０５が、ＧＯＴ  ２１０と呼ばれるペアにグループ化されるので、コンパイラは、ＳＭＥ状態を、ＧＯＴインスタンス内のペアにグループ化できる。ＧＯＴ  ２１０の物理的設計に起因して、ＳＭＥインスタンスの全てがＧＯＴ  ２１０を形成するために共にペア形成できるわけではない。その結果、コンパイラは、どのＳＭＥ状態がＧＯＴ  ２１０内で共にマッピングできるかを判断し、次いで、その判断に基づいてＳＭＥ状態をＧＯＴインスタンスにペア形成する。オートマトンをネットリストに変換する方法例についてのさらなる詳細は、図１５Ａおよび図１５Ｂに関連して以下で説明される。
【００４４】
ブロック６１０で、ネットリストが生成されると、ネットリストの各ハードウェア要素インスタンスに対して、対象装置の特定のハードウェア要素（例えば、ＳＭＥ  ２０４、２０５、他の要素２２４）を選択するために、ネットリストが位置付けられる。本発明の一実施形態によれば、位置付けると、そのハードウェア要素に対する一般的な入力および出力制約に基づいて各特定のハードウェア要素を選択する。
【００４５】
位置付けは厄介な問題であり得、通常、ヒューリスティックスを使用して解決される。それは、力指向法（ｆｏｒｃｅ  ｄｉｒｅｃｔｅｄ  ｔｅｃｈｎｉｑｕｅ）、分割技法、焼き鈍し法（ｓｉｍｕｌｔｅｄ  ａｎｎｅａｌｉｎｇ）、または前述した技法の組合せなどの方法を使用して実行できる。
【００４６】
一例では、大規模な組合せ最適化問題を解決するために２つの方法が使用できるが；これらは、焼き鈍し法およびマルチレベルハイパーグラフ分割である。これら方法の間でのトレードオフは、正確性対速度である。焼き鈍し法は、超高品質の位置付けを生成できるが、中央処理装置（ＣＰＵ）時間に関して極めて高コストである。その一方、ハイパーグラフ分割は、何桁か高速であり得るが、最善ではない位置付けを生成する傾向がある。一例では、対象ハードウェア装置の要求を満足する高品質の位置付けを確実するために、焼き鈍し法が使用できる。別の例では、ハイパーグラフ分割が第１段階として使用でき、ハイパーグラフ分割段階で作成された位置付けを精緻化するために、焼き鈍し法がその後に続く。いくつかの例では、各ヒューリスティックスの長所を十分に利用するために、焼き鈍し法およびマルチレベルハイパーグラフ分割の両方の組合せが使用される。
【００４７】
ブロック６１２で、ネットリストによって記述された接続を達成するために、選択されたハードウェア要素を共に結合するため、位置付けられたネットリストが、プログラム可能スイッチ（例えば、ブロック間スイッチ２０３、ブロック内スイッチ２０８、および行内スイッチ２１２）に対する設定を決定するようにルーティングされる。一例では、プログラム可能スイッチに対する設定が、選択されたハードウェア要素を接続するために使用されるＦＳＭエンジン２００の特定の導体を決定することにより決定される。ルーティングは、ブロック６１０で位置付けられたハードウェア要素間の接続のさらに具体的な制限を考慮に入れることができる。その結果、ルーティングは、ＦＳＭエンジン２００上の導体の実際の制限を前提として、適切な接続を行うために、グローバルな位置付けによって決定されたように、いくつかのハードウェア要素の位置付けを調整し得る。
【００４８】
ネットリストが位置付けられルーティングされると、位置付けられルーティングされたネットリストは、ＦＳＭエンジン２００のプログラム化のために複数のビットに変換できる。複数のビットはここではイメージと呼ばれる。
【００４９】
いくつかの例では、ブロック６０８で、オートマトンをネットリストに変換する前に、オートマトンは、複数のさらに小さいオートマトンに分割され、各小さいオートマトンは、ブロック６０８で、個々にネットリストに変換される。ブロック６１０で、位置付けの複雑性が、インスタンス数の増加につれて増加するので、オートマトンを、複数のさらに小さいオートマトンに分割し、小さいオートマトンを個々のネットリストに変換すると、ブロック６１０およびブロック６１２で、位置付けおよびルーティングのために小さいネットリストが提供できる。その結果、小さいネットリストの位置付けは、許容可能な構成を決定するために必要な時間を削減できる。一例では、オートマトンは、グラフ理論を使用して、複数のさらに小さいオートマトンに分割される。各小さいオートマトンは、次いで、個々にネットリストに変換され（ブロック６０８）、割り当てられた領域内で位置付けられ（ブロック６１０）得る。その結果、利用可能な領域は、分割され、異なるネットリストに割り当てられ得、各ネットリストは、その割り当てられた部分内に個々に位置付けられている。前述したように、利用可能な領域のいくつかの部分は、割り当てられていないままであり得、従って、他のネットリストの位置付け用に利用可能である。一例では、小さいオートマトンから形成された各ネットリストは、全体の処理時間を削減するために、同時に判断される構成をもつことができる。
【００５０】
ブロック６１４で、イメージがコンパイラによって公開される。イメージは、ＦＳＭエンジン２００の特定のハードウェア要素および／またはプログラム可能スイッチをプログラミングするための複数のビットを含む。イメージが複数のビット（例えば、０および１）を含む実施形態では、イメージは、バイナリイメージと呼ぶことができる。ビットは、プログラム化されたＦＳＭエンジン２００が、ソースコードによって記述された機能を有するＦＳＭを実装するように、ＳＭＥ  ２０４、２０５の状態、専用要素２２４、およびプログラム可能スイッチをプログラムするためにＦＳＭエンジン２００上にロードできる。位置付け（ブロック６１０）およびルーティング（ブロック６１２）は、特定のハードウェア要素をＦＳＭエンジン２００内の特定の位置で、オートマトン内の特定の状態にマッピングできる。その結果、イメージ内のビットは、特定のハードウェア要素および／またはプログラム可能スイッチを所望の機能を実装するようにプログラムできる。一例では、イメージは、機械コードをコンピュータ可読媒体に保存することにより公開できる。別の例では、イメージは、イメージをディスプレイ装置上に表示することにより公開できる。さらに別の例では、イメージは、イメージをＦＳＭエンジン２００上にロードするためのプログラミング装置などの、別の装置にイメージを送信することにより、公開できる。さらにまた別の例では、イメージは、イメージを並列マシン（例えば、ＦＳＭエンジン２００）上にロードすることにより、公開できる。
【００５１】
一例では、イメージは、イメージからのビット値をＳＭＥ  ２０４、２０５、および他のハードウェア要素２２４に直接ロードするか、またはイメージを１つまたは複数のレジスタにロードし、次いで、レジスタからのビット値をＳＭＥ  ２０４、２０５、および他のハードウェア要素２２４に書き込むかのいずれかにより、ＦＳＭエンジン２００上にロードできる。一例では、ＦＳＭエンジン２００のハードウェア要素（例えば、ＳＭＥ  ２０４、２０５、他の要素２２４、プログラム可能スイッチ２０３、２０８、２１２）が、コンピュータ（例えば、そのコンピュータに結合されているか、またはそのコンピュータと一体になっているプログラミング装置）が、イメージを１つまたは複数のメモリアドレスに書き込むことにより、イメージをＦＳＭエンジン２００上にロードできるように、メモリマップされる。
【００５２】
図７は、コンパイラが構文木をオートマトンに変換するための方法例６０４に含めることができる様々な追加の動作を示す。方法６０４は、シンボルの挿入（７１０）、対象装置内で動作するための構文木の処理（７２０）、構文木要素の分類（７３０）、および非決定性演算子の位置付け（７４０）のための動作を含むことができる。図７に示される方法６０４は、１つまたは複数の構文木を１つまたは複数のオートマトンに変換している間に実行できる様々な動作を示す。図７に示された動作の順序は、例示に過ぎず、動作は様々な順番で実行できる。さらに、ある例では、動作の異なる組合せが使用できる。
【００５３】
一例では、方法７００は、構文木をオートマトンに変換している間に、特別な遷移シンボルをオートマトンに挿入する。１つのかかる例では、特別な遷移シンボルが、オートマトン状態に１：１でマッピングしない演算子に対応する。前述したように、特別な遷移シンボルは、特に、ブール演算子、カウンタ、およびデータ終了機能に対して確保され得る。
【００５４】
７２０で、方法７００は、対象ハードウェア装置の制約を考慮して、構文木を調整するための動作を含むことができる。一例では、対象ハードウェア装置（例えば、ＦＳＭエンジン２００）の制約は、オートマトンの構造に制限を課すことができる。かかる制約が制限を課す状況では、コンパイラは、ハードウェア制約に従うために、変換段階で、オートマトン内に作成された状態および／または遷移を調整するための動作を含むことができる。
【００５５】
７３０で、方法７００は、属性のセットを使用して、各構文木を分類するための動作を含むことができる。一例では、動作は、グルシコフの方法などの、標準的技法の１つを使用して分類できる。
【００５６】
７４０で、方法７００は、構文木の非決定性演算子を同等な決定性演算子と置き換えるための動作を含むことができる。一例では、ループなど、あるタイプの非決定性演算子は、標準的なプログラム可能要素とともにカウンタを使用して実装できる。一例では、非決定性演算子が、カウンタなどの専用ハードウェア要素での実装に適していない場合、非決定性演算子は展開できる。演算子の展開は、非決定性演算子に対応する状態の全ての可能な組合せを順番に並べることにより達成できる。
【００５７】
ある正規表現は、オートマトンに変換される場合、多数の状態という結果になり得る。多数の状態は、実装するために多数の汎用要素１０２を使用し得る。状態の数、従って、使用される汎用要素１０２の数を減らすために、専用ハードウェア要素１１２が、ある正規表現を実装するために使用できる。例えば、標準的な汎用要素１０２に変換される場合に多数の状態を必要とし得る一正規表現は、数量化表現である。数量化表現は、１つまたは複数の式を何回も繰り返すループ構造に対応する。数量化表現は、展開され、多数の汎用状態で順番に実装できる。しかし、一例では、カウンタなどの専用ハードウェア要素（例えば、他の要素１１２）が、数量化表現内の繰返し式を活用するために使用でき、数量化表現を実装するために使用される状態数を削減する。
【００５８】
数量化は、当技術分野で周知であり、繰返しパターンを記述するために使用される。一例として、“Ａ（Ｂ）｛ｎ１，ｎ２｝Ｃ”は、一般的な正規表現であり、ここで、Ａ、ＢおよびＣは部分式であり、また、“（Ｂ）｛ｎ１，ｎ２｝”は数量化を含む。本明細書では、大文字は、正規表現または正規表現の一部（例えば、部分式）を表すために使用される。混乱を避けるために、二重引用符が、正規表現または部分式の前後に追加され得る。その結果、式を記述する大文字は、複数の入力シンボルに対する検索文字列に対応できる。例えば、式“Ａ”は、入力文字列‘ａｂｂｃ’に対応できる。
【００５９】
さらに、本明細書では、式および部分式という用語が関係記述（例えば、部分式は式の一部である）のみのために使用されること、ならびに式および部分式という用語は、いかなる特定の長さ、構文、または文字数に限定されるべきではないことが理解されるはずである。特に、ソースコードは、文字セット全体またはその任意の個々の部分が「式」と考えられる多数の文字（メタ文字および検索文字を含む）を含むことができる。例えば、以下の各々は、式と見なされ得る：“ａ（ｂｂ｜ｄ？）｛５，２０｝ｃ”、“（ｂ）｛０，１０｝”、“（ｂ｜ｄ）”、および“ｂ”。
【００６０】
数量化は、“（Ｂ）｛ｎ１，ｎ２｝”のような正規表現で表され、ここで、Ｂは、部分式であり、ｎ１およびｎ２は、先行する部分式が何回出現できるかを指定する整数である。Ｂは、ｎ１およびｎ２によって指定された回数だけ繰り返される部分式なので、Ｂは、本明細書では、繰返し部分式と呼ばれる。数量化“（Ｂ）｛ｎ１，ｎ２｝”と一致するには、繰返し部分式Ｂは、ｎ１〜ｎ２回、一致しなければならない。例えば、正規表現“（Ｂ）｛５，７｝”は、部分式Ｂが５、６、または７回、一致することを必要とするであろう。正規表現“Ａ（Ｂ）｛ｎ１，ｎ２｝Ｃ”では、部分式Ａは、一致する場合、数量化に遷移するので、部分式Ａは本明細書では、駆動式（ｄｒｉｖｅ  ｅｘｐｒｅｓｓｉｏｎ）と呼ばれる。さらに、数量化に対する繰返しおよびカウントの増分を継続するため、数量化の繰返し部分式が連続して一致しなければならない。つまり、数量化の所与のループ中、繰返し部分式が一致しない場合、数量化が終了する。一例では、シンボル‘？’も数量化に対応し、ここで、‘？’に先行するシンボルは、１回またはゼロ回のどちらかに識別できる。
【００６１】
対象装置がＦＳＭエンジン２００である場合、方法８００は、ある数量化を識別し、ＦＳＭエンジン２００上のカウンタ２２４にマッピングできる。ある数量化をカウンタ２２４で実装すると、状態機械要素２０４、２０５での数量化の実装よりも効率化をもたらし得る。その結果、オートマトンおよびＦＳＭエンジン２００に対して結果として得られるイメージが単純化される。例えば、数量化を実装する構文木の部分は、実装するために大量のＳＭＥ  ２０４、２０５を必要とし得る。しかし、一例では、これらの数量化のいくつかは、ＳＭＥ  ２０４、２０５によって必要とされ得るよりも少ない状態で、カウンタ２２４を使用して実装できる。
【００６２】
ブロック８０２で、コンパイラは、ＦＳＭエンジン２００内のカウンタ２２４を用いて可能な実装のため、数量化に対応する構文木の部分を識別する。構文木の部分が数量化に対応しない場合、方法８００はブロック８０３に進み、そこで、部分が、ＳＭＥ  ２０４、２０５での実装のために汎用状態に変換される。構文木の部分が数量化に対応する場合には、識別された部分がカウンタ２２４で実装できるかどうかを判断するため、数量化がさらに解析される。
【００６３】
数量化がおそらくカウンタ２２４で実装できるかどうかを判断する前に、£（Ｂ）と書かれる、パターン‘Ｂ’の言語（すなわち、‘Ｂ’が一致する全ての文字列）が空文字列を含む場合、“Ｂ｛ｎ１，ｎ２｝”の数量化が“Ｂ´｛０，ｎ２｝”として書き換えられ、ここで、Ｂ´は、Ｂの非空文字列バージョンであり、£（Ｂ´）＝£（Ｂ）−Φである。例えば、“（ｂｃ｜）｛１０，２０｝”は“（ｂｃ）｛０，２０｝”と書き換えられるが、これは、これらの正規表現が全く同じデータを受け付けるからである。次いで、所与の数量化Ｂ｛ｎ１，ｎ２｝に対して、以下の条件に従って、数量化がカウンタでおそらく実装できる（方法はブロック８０４に進む）か、あるいは、ＳＭＥで、カウンタを使用せずに実装できる（方法はブロック８０８に進む）：
１）  （ｎ１＝０，ｎ２＝−１）の場合、数量化は、ＳＭＥ  ２０４、２０５で、かつカウンタ２２４なしで展開される（ブロック８０８）。ここで、カウンタ２２４は必要ない。
２）  （ｎ１＝１，ｎ２＝−１）の場合、数量化は、ＳＭＥ  ２０４、２０５で、かつカウンタ２２４なしで展開される（ブロック８０８）。ここで、カウンタ２２４は必要ない。
３）  （ｎ１＞１，ｎ２＝−１）の場合、Ｂ｛ｎ，−１｝がＢ｛ｎ１−１｝Ｂ＋と等しいので、数量化は２つの正規表現Ｂ｛ｎ１−１｝およびＢ＋に分割される。数量化Ｂ｛ｎ１−１｝は、次いで、カウンタでおそらく実装でき（ブロック８０４）、他方Ｂ＋は、ＳＭＥ  ２０４、２０５で、かつカウンタ２２４なしで実装される（ブロック８０８）。Ｂ＋に対して、カウンタ２２４は必要ない。
４）  （ｎ１＝０，ｎ２＞０）の場合、（Ｂ｛１，ｎ２｝）？がＢ｛０，ｎ２｝と等しいので、数量化は（Ｂ｛１，ｎ２｝）？に修正される。空値不能なＢ｛１，ｎ２｝が、次いで、おそらくはカウンタ２２４で実装できる（ブロック８０４）。
５）  （ｎ１＞０，ｎ２＞０）の場合、数量化は、カウンタ２２４でＢ｛ｎ１，ｎ２｝としておそらく実装され得る（ブロック８０４）。
要約として、修正することなく、カウンタ２２４でおそらく実装できる（ブロック８０４）数量化は、Ｂ｛ｎ１，ｎ２｝として記述でき、ここで、Ｂは空値可能でなく、ｎ１＞０、ｎ２＞０、およびｎ１≦ｎ２である。
【００６４】
ブロック８０４で、コンパイラが、カウンタ２２４でおそらく実装できる数量化を識別すると、コンパイラは、その識別された部分に対応する構文木の部分が決定性であるかどうかを判断する。識別された部分が決定性である場合、識別された部分は１つまたは複数のカウンタ２２４で実装でき、方法８００はブロック８０６およびブロック８０７に進み、そこで、識別された部分が、１つまたは複数のＳＭＥ状態とともに、１つまたは複数のカウンタ状態に変換される。識別された部分が非決定性である場合、識別された部分はカウンタ２２４を使用して実装されず、方法８００はブロック８０８に進み、そこで、識別された部分が、図１３に関連して以下で説明するように、１つまたは複数のＳＭＥ状態を使用して展開される。
【００６５】
一般に、ブロック８０６およびブロック８０８、８１０は、数量化をオートマトンに変換する２つの方法に対応する。ブロック８０６では、数量化をループとして実装するため、おそらくは１つまたは複数のＳＭＥ状態とともに、数量化が１つまたは複数のカウンタ状態を使用して変換される。ブロック８０８、８１０では、数量化は、ＳＭＥ状態の使用を含むがカウンタ状態のない数量化を「展開する」ことによって変換される。展開することは、数量化を非数量化構文で書き換えることを含む。例えば、正規表現“（ｂ｜ｃ）｛１，２｝”は、“（ｂ｜ｃ）（ｂ｜ｃ）？”と展開できる。展開の利点は、（１）結果として得られるオートマトンが有向非巡回グラフ（ＤＡＧ）であり、解析および実装が容易であり得ること、ならびに（２）結果として得られるオートマトンが、専用要素の代わりに、汎用要素、特に、状態機械要素で実装できることを含む。しかし、展開された数量化を実装するために使用される汎用状態の数、従って状態機械要素は、ｎ１およびｎ２に対して線形である。従って、状態の数は、ｎ１またはｎ２が多数である場合、多数であり得る。特に、実際のリソースには制限があり、それ故、いくつかの例では、この展開技法は、数量化の限られたカテゴリに対してのみ使用される。数量化の展開に関するさらなる詳細が、ブロック８０８、８１０および図１３Ａ〜図１３Ｃに関連して以下で提供される。
【００６６】
しかし、対象装置が、カウンタ２２４などの、カウント機能を実装するように設計された専用要素を有する場合、展開は、ある状況において回避できる。この方法の利点は、オートマトン内で必要とされる繰返し式のコピーが少ないことであり、また、コピーの数は、ｎ１およびｎ２とは無関係である。従って、かなりのリソースが節約できる。例えば、繰返し式および１つまたは複数のカウンタ２２４をもつループを作成することにより、１つまたは複数のカウンタ２２４が、数量化を実装するために使用できる。繰返し式が一致するたびに、カウンタ２２４が増分できる（または減分できる）。繰返し式は、次いで、別の一致を探すために再度アクティブにされる。カウンタ２２４が、数量化によって提示された回数に等しい回数増分される（または減分される）と、カウンタ２２４は、数量化に続く状態をアクティブにできる。その結果、繰返し式を実装するために使用されたＳＭＥが再度使用されるので、数量化は、より少ないＳＭＥ  ２０４、２０５で実装できる。しかし、オートマトン全体（例えば、構文木全体に対応する）の並行性、すなわち、同時にアクティブにできる複数の状態、に起因して、いくつかの例では、カウンタ２２４のみが、オートマトン全体の決定性部分に対応する数量化で使用できる。
【００６７】
図９は、数量化を実装するために、専用カウンタ状態９０２を使用して、オートマトン９００に変換された正規表現の一例を示す。オートマトン９００は、正規表現“Ａ（Ｂ）｛ｎ１，ｎ１｝Ｃ”に対応し、ここで、数量化の両方のカウント値（例えば、ｎ１、ｎ２）は等しい。両方のカウント値が等しいので、数量化を実装するために単一のカウンタ２２４が使用される。図９に示すように、オートマトン９００は、グラフのノードが状態の集合に対応する、有向グラフとして表すことができる。
【００６８】
正規表現“Ａ（Ｂ）｛ｎ１，ｎ１｝Ｃ”は、いくつかのＳＭＥ状態９０４、９０６、９１０、９０８、およびカウンタ状態９０２に変換される。ＳＭＥ状態９０４、９０６、９０８、９１０は、部分式“Ａ”、“Ｂ”、および“Ｃ”に対応する。ＳＭＥ状態９０４、９０６、９１０、９０８は、ＳＭＥ  ２０４、２０５で実装できるが、他方、カウンタ状態９０２は、カウンタ２２４で実装できる。オートマトン９１０が、ＦＳＭエンジン２００上で実装される場合、カウンタ状態９０２に対応するカウンタ２２４は、最初は値ｎ１でロードされ、カウンタ２２４内の値がゼロに達すると、ゼロカウント出力をアサートするように設定される。ｎ１がｎ２に等しい場合、カウンタ２２４は、ストップ０およびパルス出力モードに設定できるが、これは、カウンタ２２４は、その値がゼロに達すると、その出力をアサートすることを意味し、また、カウンタ２２４がリセットされるまで、カウンタ２２４はゼロのままで、いかなる信号も出さない。
【００６９】
オートマトン９００は、状態９０４から始まり、部分式“Ａ”に一致すると、状態９０６に遷移する。状態９０６での間、部分式“Ｂ”が一致するたびに、カウンタ状態９０２のＩＮポートがアクティブにされ、カウンタ状態９０２が１だけ減分される。さらに、部分式“Ｂ”が一致するたびに、状態９０６は、状態９１０をアクティブにするだけでなく、自分自身をアクティブにする。カウンタ状態９０２がゼロに達すると、出力がアクティブにされ、オートマトン９００は、次いで、部分式“Ｃ”を探す。次のサイクルでは、２つのシナリオが生じるであろう：第１のシナリオは、“〜Ｂ”が一致する場合に生じる。〜Ｂ”が一致すると、カウンタ状態９０２がリセットされ、その値がｎ１に再度設定される。その結果、部分式“Ａ”が次に一致するとき、プロセスは状態９０４からやり直す。第２のシナリオでは、状態９０６の自己ループが依然としてアクティブであり、部分式“Ｂ”が一致すると、カウンタ９０２のＩＮポートが、継続してトリガーされる。カウンタ状態９０２はパルスモードで構成されているので、状態９０６の自己ループはアクティブなままであるが、カウンタ状態９０２は、その出力を再度アクティブにしないであろう。
【００７０】
部分式“Ｂ”の否定バージョンは、本明細書では“〜Ｂ”としても参照される。一例では、部分式“Ｂ”の否定バージョンは、カウンタ状態９０２のリセットポートをアクティブにするために使用される。これは、“Ｂ”が、数量化“（Ｂ）｛ｎ１，ｎ1｝”の繰返し式であるからであり、Ｂ以外の何か（例えば、“Ｂ”の否定バージョン）が入力で受信される場合（状態９０６がアクティブにされていると）、数量化が終了し、カウンタがそれに応じてリセットされる。その結果、状態９１０がアクティブにされると、部分式“Ｂ”の否定バージョンが一致する場合、カウンタ状態９０２がリセットされ、数量化は一致しない。一例では、繰返し式は、標準的なオートマトン理論を使用して否定される。
【００７１】
ｎ１がｎ２に等しい場合、単一のカウンタ状態２２４が示されて、数量化を実装するように説明されているが、単一のカウンタ２２４によってサポートされるよりも多くの数をカウントするように、複数のカウンタ２２４がカスケード接続できることが認識されるはずである。
【００７２】
図１０は、数量化のある正規表現を実装するために、複数の専用カウンタ状態１００２、１００４を使用して、オートマトン１０００に変換された正規表現の別の例を示す。オートマトン１０００は、正規表現“Ａ（Ｂ）｛ｎ１，ｎ２｝Ｃ”に対応し、ここで、ｎ１はｎ２より小さい。数量化“（Ｂ）｛ｎ１，ｎ２｝”においてｎ１はｎ２より小さいので、２つのカウンタ状態１００２、１００４が使用される。カウンタ状態１００２、１００４は、ストップ０および保留（Ｈｏｌｄ）モードに構成されており、それは、カウンタ状態１００２、１００４がゼロに達すると、カウンタ状態１００２、１００４がそれらの出力をアクティブにすることを意味し、また、カウンタ状態１００２、１００４がリセットされる前、カウンタ状態１００２、１００４はゼロのままに維持され、ＩＮポートがアクティブにされるたびにそれらの出力をアクティブに保つ。この例では、カウンタ状態１００２からカウンタ状態１００４への待ち時間は、２サイクルかかる。
【００７３】
カウンタ状態１００２は、最初はｎ１に設定され、また、カウンタ状態１００４は、最初はｎ２に設定される。オートマトンは、部分式“Ａ”が一致する場合に、状態１００６から状態１００８に遷移する。状態１００８がアクティブにされると、部分式“Ｂ”が一致するたびに、カウンタ状態１００２およびカウンタ状態１００４の両方のＩＮポートがアクティブにされる。その結果、カウンタ状態１００２およびカウンタ状態１００４の両方が１だけ減分される。カウンタ状態１００２がゼロに達すると、その出力がアクティブにされ、オートマトン１０００は、次いで、部分式“Ｃ”の一致を探し、状態１０１０をアクティブにする。部分式“Ｂ”がｎ１回一致していると、カウンタ状態１００４の値は、ｎ２−ｎ１である。その後、部分式“Ｂ”が一致するたびに、カウンタ状態１００２のＩＮポートがアクティブにされ、カウンタ状態１００２の値がゼロのままに維持され、その出力は依然としてアクティブにされている。その一方で、カウンタ状態１００４は継続して減分される。部分式“Ｂ”がｎ２回一致するとき、カウンタ状態１００４もゼロに達し、その出力がアクティブにされて、カウンタ状態１００２のリセットポートを駆動する。カウンタ状態１００４からカウンタ状態１００２への待ち時間は２サイクルであるので、カウンタ状態１００２は、状態１０１０へのその出力を継続してアクティブにする。次のサイクルで、カウンタ状態１００２が、カウンタ状態１００４の出力からリセットされ、カウンタ状態１００２からのどの出力もアサートされない。次のサイクルでは、２つのシナリオが生じるであろう。第１のシナリオでは、“〜Ｂ”が一致する。カウンタ状態１００２およびカウンタ状態１００４の両方が、状態１０１２によってリセットされ、それらの値が、それぞれｎ１およびｎ２に設定される。その結果、状態１００６が次にアクティブにされるとき、および部分式“Ａ”が次に一致するときに、状態１００８がアクティブにされ、カウンタ状態１００２、１００４が再度減分される。第２のシナリオでは、状態１００８の自己ループがアクティブのままに維持され、カウンタ状態１００２、１００４の両方のＩＮポートがアクティブにされる。カウンタ状態１００４は、その出力を継続してアクティブにするので、カウンタ状態１００２は継続してリセットされ、状態１００８の自己ループがアクティブである限り、その出力をアクティブにしない。
【００７４】
さらに、状態１００８がアクティブである間に部分式“Ｂ”が一致すると、状態１０１２をアクティブにする。状態１０１２がアクティブにされ、かつ、“〜Ｂ”が一致すると、カウンタ状態１００２、１００４がリセットされ、数量化は一致しない。“Ｂ”は、数量化“（Ｂ）｛ｎ１，ｎ２｝”の繰返し式であるため、部分式“Ｂ”の否定バージョンが使用される。その結果、状態１００８で、式‘Ｂ’が、ｎ１〜ｎ２回まで繰り返して一致できる。単一のカウンタが示され、それぞれ、下限（例えば、ｎ１）および上限（例えば、ｎ２）の閾値を実装するように説明されているが、単一のカウンタによってサポートされるよりも多くの数をカウントするために、当業者には知られているように、複数のカウンタがカスケード接続できることが認識されるはずである。
【００７５】
カウンタ状態を使用して数量化を変換する前に、コンパイラは、ブロック８０４で、数量化に対応するオートマトンが決定性であるかどうかを判断する。一例では、式が、以下で説明する、プレフィックスなし条件および再入なし（ｎｏ  ｒｅ−ｅｎｔｒａｎｃｅ）条件の両方を満足する場合、オートマトンは決定性である。すなわち、数量化がカウンタ２２４にマッピングされるために、数量化は、以下で説明するように、プレフィックスなし条件および再入なし条件を満足しなければならない。
【００７６】
図１０のオートマトン１０００を参照すると、再入なし条件は、カウンタ状態１００２がアクティブである間（例えば、カウンタ状態１００２がカウントしている間）、状態１００６から状態１００８へのエッジがアクティブにできないことを必要とする。すなわち、数量化が既に処理されている間に、数量化に対する駆動式が一致できるかどうかが判断される。駆動式に一致することは、数量化の直前の状態が、数量化に対応する状態に遷移することを意味する。その結果、カウンタ状態が繰返し式をまだ処理している間に、数量化が「再入」される。ＦＳＭエンジン２００のこの例では、カウンタ２２４は、いつでも単一ループしか実装できないので、ループが既に処理されている間に数量化に遷移することは、所与のループ中に、カウンタ２２４に間違ってカウントさせ得る。
【００７７】
図１１Ａおよび図１１Ｂは、再入なし条件をさらに説明するために使用できる、オートマトン１１００および１１１４を示す。図１１Ａは、構文木内の数量化に対応するオートマトン例１１００を示し、そこで、コンパイラは、数量化に対応するオートマトンが決定性であるかどうかを判断するために解析できる。
【００７８】
オートマトン１１００は、正規表現“ａｂｂ？（ｂ｜ｃ）｛１，２｝”に対応し、開始状態１１０２および最終状態１１１２、１１０４を含む。最終状態は、図１１Ａでは、二重丸で識別される。開始状態１１０２が最初にアクティブにされ、入力シンボル‘ａ’で、状態１１０６に遷移する。状態１１０６は、入力シンボル‘ｂ’で、状態１１０８および状態１１１０の両方に遷移する。状態１１０８は、入力シンボル‘ｂ’で状態１１１０に遷移し、状態１１１０は、入力シンボル‘ｂ’または‘ｃ’のどちらかで、状態１１１２に遷移する。オートマトン１１００は、入力シンボル‘ｂ’または‘ｃ’のどちらかで、状態１１１２から状態１１０４に遷移する。
【００７９】
オートマトン１１００は、正規表現“ａｂｂ？（ｂ｜ｃ）｛１，２｝”に対するオートマトンを含むが、それは、再入なし条件の順守をチェックされる。オートマトン１１１４は、オートマトン１１００の正規表現“ａｂｂ？（ｂ｜ｃ）｛１，２｝”から導出された正規表現ＳＳ（“ａｂｂ？”，“（ｂ｜ｃ）｛２｝”）のオートマトンを含む。ＳＳ（Ｍ，Ｎ）は、Ｍ，Ｎから導出された正規表現として定義される。導出ステップは次を含む：１）ＭおよびＮを連結し、結果が“ＭＮ”として示される。２）“ＭＮ”に対するオートマトンを構築し、Ａ（ＭＮ）として示される。３）Ａ（ＭＮ）を以下のように修正する：ａ）他の全ての状態を駆動するＡ（ＭＮ）の開始状態を作成し、そして、ｂ）“Ｎ”に対応する全ての状態を最終状態にする。最後に、４）修正されたオートマトンに対する正規表現をＳＳ（Ｍ，Ｎ）として示す。ＳＳ（Ｍ，Ｎ）の受け入れられたデータは、“ＭＮ”の任意の状態から始まり、Ｎの任意の状態で終了する、部分文字列から成る。
【００８０】
再入なし条件は、以下のように定義できる。数量化“ＡＢ｛ｎ１，ｎ２｝Ｃ”のある正規表現を仮定すると、再入なし条件は、£（ＳＳ（Ａ，Ｂ｛ｎ１，ｎ２｝）∩£（Ａ）＝φであることを必要とする。言い換えれば、部分式“Ａ”が一致し、カウンタ状態１００２がカウントを開始すると、再入なし条件を満足するために、“Ｂ｛ｎ１，ｎ２｝”が完了する（一致または失敗する）まで、状態１００６から状態１００８へのエッジは再度アクティブにされないであろう。例えば、“ａｂｂ”∈£（“ａｂｂ？”）∩£（ＳＳ（“ａｂｂ？”，“（ｂ｜ｃ）｛２｝”）、従って、“ａｂｂ？（ｂ｜ｃ）｛１，２｝”は、カウンタ２２４で正しく実装されないであろう。
【００８１】
ここで図１２を参照すると、プレフィックスなし条件が、オートマトン１２００に関連して説明される。プレフィックスなし条件は、£（Ｂ）の任意の文字列が、£（Ｂ）の別の文字列のプレフィックスであってはならないことを提示し、それは、Ｂがカウンタに２回以上カウントさせないことを保証する。言い換えれば、数量化の第１の繰返し部分式が、数量化の第２の繰返し部分式のプレフィックスである場合、数量化は、カウンタ２２４として実装されない（従って、それに変換されない）。正式なステートメントは、全てのｌｉ、ｌｊ∈£（Ｂ）、ｌｉ≠ｌｊに対して、｛ｌｉ．＊｝∩｛ｌｊ．＊｝＝Φであることを必要とする。
【００８２】
例えば、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、プレフィックスなし条件を満足しない。その結果、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、カウンタ状態を使用して変換されず、従って、カウンタ２２４で実装されないであろう。代わりに、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、カウンタ状態のない、汎用状態に変換されるであろう。
【００８３】
正規表現“ａ（ｂ｜ｂｃ）｛３｝”がカウンタ２２４で実装された場合、入力“ａｂｂｃ”は、誤って一致するであろう。例えば、オートマトン１２００は、カウンタ状態１２１２を使用して、正規表現“ａ（ｂ｜ｂｃ）｛３｝”を仮想的に変換した結果である。以下で説明するように、この変換は、カウンタ状態１２１２の誤動作という結果となる。状態１２０２が最初にアクティブにされ、入力‘“ａ”で、状態１２０２が状態１２０４をアクティブにする。状態１２０４をアクティブにして、入力シンボル“ｂ”で、状態１２０４が、状態１２０６、１２０８をアクティブにし、そして、それ自身、つまり、状態１２０４を再度アクティブにする。また、入力シンボル“ｂ”で、状態１２０４は、カウンタ１２１２のＩＮポートをアクティブにするが、そこで、カウンタ状態１２１２の初期値が３であり、次いで、２に減らされる。状態１２０４、１２０６、および１２０８をアクティブにして、別の入力“ｂ”で、カウンタ状態１２１２のＩＮポートが、状態１２０４によって再度アクティブにされ、カウンタ状態１２１２の値が１に減らされる。この時点で、状態１２０４、１４０６、および１２０８はアクティブにされている。次いで、入力値“ｃ”で、状態１２０８によってアクティブにされるカウンタ状態１２１２のＩＮポートが、カウンタ１２１２内の値を０に減らす。カウンタ１２１２内の値がゼロで、出力がアクティブにされ、状態１２１４がアクティブにされて、一致を示す。しかし、シーケンス“ａｂｂｃ”が正規表現“ａ（ｂ｜ｂｃ）｛３｝”を満足しない場合に、入力“ａｂｂｃ”が一致を引き起こしているので、この一致は誤判定である。その結果、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、プレフィックスなし条件を満足せず、カウンタ状態を使用して変換されるべきではなく、また、カウンタ２２４で実装されるべきではない。
【００８４】
ブロック８０４で、数量化が、プレフィックスなし条件および再入なし条件の両方を満足する場合、数量化は、ブロック８０６で、専用カウンタ状態を使用して変換される。数量化は、上で図１０および図１１に関連して説明したように、変換できる。しかし、数量化が、プレフィックスなし条件または再入なし条件のどちらかを満足しない場合、数量化は、ブロック８０８、８１０で、数量化を展開し、カウンタ状態２２４なしで、汎用状態に変換することにより、変換される。数量化は、その結果、カウンタ２２４ではなく、ＳＭＥ  ２０４、２０５で実装される。
【００８５】
ブロック８０８を再度参照すると、単一のある個数のループと一致し得る数量化は、連続的にリンクされた、複数の繰返し部分式を有するオートマトンを形成するように展開される。単一のある個数のループを有する数量化は、ｎ１がｎ２に等しい数量化に対応する。例えば、数量化“Ｂ｛ｎ１｝”は、Ｂのｎ１個のコピーを有する、“ＢＢ．．．Ｂ”として展開できる。
【００８６】
ブロック８１０で、ｎ１がｎ２と等しくない場合、およびｎ１が１と等しく、かつｎ２が１より大きい場合、複数のある個数のループと一致できる数量化が展開される。ｎ１が１より大きい場合、数量化は、ｎ１−１個のループと一致できる第１の数量化、および１〜ｎ２−ｎ１＋１個までのループと一致できる第２の数量化に分割される。例えば、数量化Ｂ｛ｎ１，ｎ２｝（ここで、ｎ１＞１、ｎ２＞１、およびｎ１＜ｎ２）は複数のある個数のループ、特に、ｎ１〜ｎ２個までのループと一致できる。この数量化、Ｂ｛ｎ１，ｎ２｝は、以下の数量化Ｂ｛ｎ１−１｝Ｂ｛１，ｎ２−ｎ１＋１｝に分割できる。第１の数量化は、ｎ１−１に等しい、いくつかのループに一致できる繰返し部分式Ｂである。この第１の数量化は、１〜ｎ２−ｎ１＋１までのいくつかのループによって一致できる繰返し部分式を有する第２の数量化と連結される。第１の数量化Ｂ｛ｎ１−１｝は、１３０２で提示されるように展開される。
【００８７】
第２の数量化Ｂ｛１，ｎ２−ｎ１＋１｝は、結果として生じるオートマトンの入次数（ｉｎ−ｄｅｇｒｅｅ）および／または出次数（ｏｕｔ−ｄｅｇｒｅｅ）に基づいて展開できる。数量化の展開では、多数の入次数または多数の出次数を有する状態を作成できる。一例では、入次数はオートマトンの状態への遷移数に対応し、出次数はオートマトンの状態からの遷移数に対応する。その結果、第２の数量化は、第２の数量化をオートマトンに変換する際に、状態への遷移（入次数）または状態からの遷移（出次数）を制御するように展開できる。例えば、数量化は、各展開された状態の入次数を閾値数未満に制限するように展開できる。入次数の制限は、例えば、対象装置内の要素の態様および／または制限を考慮に入れるように実行できる。さらに、展開中に入次数を制限すると、コンパイラのために、以降の処理を削減できる。
【００８８】
一例では、数量化Ｂ｛１，ｎ２−ｎ１＋１｝を展開する際に、入次数と出次数との間のトレードオフとしてオートマトンが生成される。その結果、入次数を減らすと出次数が増加し得、また、出次数を減らすと入次数が増加し得る。一例では、数量化Ｂ｛１，ｎ２−ｎ１＋１｝のループ構造を展開するため、展開された状態への、または展開された状態からのどちらかの、いくつかの遷移が作成されて、オートマトンがｋ（ここで、１＜＝ｋ＜＝ｎ２−ｎ１＋１）個の連結されたＢの任意の文字列を受け入れるようにする。展開された状態への遷移、または展開された状態からの遷移が作成されるかの制御は、オートマトンに対する入次数／出次数を制御するために使用できる。
【００８９】
方法８００は、単一の数量化に対応するものとして説明されているが、方法８００は、構文木内の複数の数量化に対して繰り返すことができ、結果として生じる別個のオートマトンが、次いで、さらに大きなオートマトンにリンクできる。
【００９０】
図１３Ａは、式ＡＢ｛１，４｝が入次数を最小限にするように展開されるオートマトン１３００の一例を示す。入次数を最小限にするように展開された数量化から生じたオートマトンは、本明細書では、散乱パターン（ｓｃａｔｔｅｒ  ｐａｔｔｅｒｎ）とも呼ばれる。式ＡＢ｛１，４｝の展開されたバージョンの散乱パターンは、式Ａ（（（（Ｂ？）Ｂ）？Ｂ）？Ｂ）に直接対応し、それにオートマトン１３００が対応する。オートマトン１３００は、数量化Ｂ｛１，４｝に対する駆動状態１３０２および、数量化の第１の状態１３０４および数量化の最終状態１３０８を含め、複数の展開された状態１３０４〜１３０８を含む。一例では、式ＡおよびＢの各々は、図示されていない、もっと小さいオートマトンに対する複数の状態に対応できる。オートマトン１３００の入次数を最小限にするために、数量化に対する遷移が、第１の状態１３０４から他の展開された状態１３０５〜１３０８への出遷移（ｏｕｔ−ｔｒａｎｓｉｔｉｏｎ）として割り当てられる。その結果、第１の状態１３０４は、多数の出次数（４つの出遷移）を有し、また、全ての数量化状態１３０４〜１３０８が少ない入次数（１つまたは２つの入遷移）を有する。
【００９１】
図１３Ｂは、式ＡＢ｛１，４｝が出次数を最小限にするように展開されるオートマトン１３１０の一例を示す。出次数を最小限にするように展開された数量化から生じたオートマトンは、本明細書では、マージパターン（ｍｅｒｇｅ  ｐａｔｔｅｒｎ）とも呼ばれる。式ＡＢ｛１，４｝の展開されたバージョンのマージパターンは、展開された式ＡＢ（Ｂ（Ｂ（Ｂ）？）？）？に直接対応する。オートマトン１３０８は、状態１３０２、１３０４〜１３０８の間で異なる遷移をもつオートマトン１３００と同じ状態１３０２、１３０４〜１３０８を含む。オートマトン１３１０の出次数を最小限にするために、数量化に対する遷移が、数量化の最終状態１３０８への入遷移（ｉｎ−ｔｒａｎｓｉｔｉｏｎ）として割り当てられる。入遷移は、展開された状態１３０４〜１３０７の各々から来る。その結果、数量化状態１３０４〜１３０８の全ては少ない出次数（１つまたは２つの出遷移）を有するが、数量化の最終状態１３０８は多数の入次数（４つの入遷移）を有する。
【００９２】
一例では、数量化を有する式は、出次数または入次数のうちの１つを閾値未満に制限するように展開される。一例では、式ＡＢ｛１，ｎ１｝を、入次数を閾値に制限するように展開するために、数量化Ｂ｛１，ｎ１｝に対する閾値までのいくつかの遷移を、入遷移として、数量化Ｂ｛１，ｎ１｝の最終状態に割り当てることができ、また、他の遷移を、出遷移として、数量化Ｂ｛１，ｎ１｝の第１の状態に対して割り当てることができる。逆に、式ＡＢ｛１，ｎ１｝を、出次数を閾値に制限するように展開するために、数量化Ｂ｛１，ｎ１｝に対する閾値までのいくつかの遷移を、出遷移として、数量化に対する第１の状態に割り当てることができ、また、他の遷移を、出遷移として、数量化Ｂ｛１，ｎ１｝の最終状態に対して割り当てることができる。
【００９３】
図１３Ｃは、式ＡＢ｛１，４｝が、任意の状態に対する入遷移を３以下に制限するように展開されるオートマトン１３１２の別の例を示す。オートマトン１３１２は、状態１３０２、１３０４〜１３０８の間で異なる遷移をもつオートマトン１３００および１３０８と同じ状態１３０２、１３０４〜１３０８を含む。一例では、オートマトン１３１２の入次数を３以下の入遷移に制限するために、数量化に対する遷移が、最初は、数量化Ｂ｛１，４｝の最終状態１３０８への入遷移として、制限の３に達するまで割り当てられ、また、他の遷移が、数量化状態１３０４〜１３０８からの出遷移として割り当てられる。従って、数量化の最終状態１３０８ならびに他の数量化状態１３０４〜１３０７が、制限の３つ以下の入次数を有し、また、第１の状態１３０４が３つの出次数を有する。
【００９４】
他の例では、式の入次数および出次数は、互いを特定の割合（例えば、１対１、２対１）に設定できる。さらに別の例では、式の入次数および出次数は、入遷移または出遷移のどちらかに対して閾値に達するまで、互いを特定の割合に設定でき、次いで、別の割合が使用できるか、または遷移の全てが、それぞれ入遷移または出遷移として割り当てられ得る。
【００９５】
ネットリストは、接続性インスタンスであり、そこで、インスタンスはハードウェア要素に対応し、有向エッジは、そのハードウェア要素を接続するネットである。状態が別の状態を駆動する場合、これら２つの状態が割り当てられるＳＭＥ間に電気的接続があるであろう。ほとんどの物理装置は、ハードウェアコンポーネント間の接続数に関して何らかの制限を有する。オートマトンから物理装置への実現可能なマッピングを得るために、オートマトンは、全ての状態の入次数がハードウェア接続制限を満足するように、変換される必要がある。
【００９６】
前述したように、コンパイラは、もしあれば、ＦＳＭエンジン２００の制限に基づいて、どのＳＭＥが共にグループ化できるかを判断する。それに応じて、コンパイラは、ＧＯＴ  ２１０に対して、ＧＯＴ  ２１０内のＳＭＥ  ２０４、２０５に対する出力制約に基づいて、どのＳＭＥが一緒にペアにできるかを判断する。
【００９７】
１つのかかる実施形態では、ＦＳＭエンジン２００は、全てのハードウェアコンポーネントに対して制限された接続を有する。オートマトンからＦＳＭエンジン２００への実現可能なマッピングを得るために、オートマトンは、全ての状態の入次数が接続制限を満足するように、変換される必要がある。
【００９８】
従って、一例では、オートマトンの入次数は、対象装置のハードウェア制約に基づいて制限され得る。一例では、ＳＭＥ  ２０４、２０５の駆動イン（ｄｒｉｖｅ−ｉｎ）を制限するために、２段階方式がＦＳＭエンジン２００とともに使用できる。第１に、ＧＯＴ  ２１０によって提供されたＯＲゲート２３０を利用できるが、それは、ＳＭＥ状態からの出力を単一の出力にペア形成することにより、入次数を最大で５０％削減するであろう。他のコンポーネントはブールであり、それは、複雑な論理関数を提供するように構成できる。この例では、それを単純なＯＲコンポーネントと見なすだけである。以下のアルゴリズムでは、ＧＯＴ  ２１０の使用を保守的な方法で推定する。アルゴリズムでは、推定された入次数が、ＦＳＭエンジン２００の制約より多い場合、いくつかの状態が複数の状態に分割されるか、または、必要に応じて、入次数を削減するためにブールＯＲが挿入される。
【００９９】
状態分割の根本概念は、状態を複数の状態に分割し、各分割状態の入次数が制約を満足するように、分割前状態（ｐｒｅ−ｓｐｌｉｔ  ｓｔａｔｅ）の駆動インを分割状態に分散する。オートマトンが有向非巡回グラフ（ＤＡＧ）である場合、オートマトンの単純な幅優先のたどりが問題を解決できる。しかし、ループ（例えば、数量化）が存在するとき、分割は、状態数を飛躍的に増加させ得るか、または実行可能な解決策が可能でない状況を作り出し得る。ブール論理は、増加した状態を減らすのに役立ち、従って、この状況を緩和できる。一実施形態では、ループ条件を処理するために、ブールＯＲ、またはその相当物が使用される。
【０１００】
状態分割の一例が図１４Ａおよび図１４Ｂに示されている。図９Ａに示す例では、８つの状態１４３０が、１つの状態１４３２に入力を与え、それは、次いで、２つの状態１４３４に入力を与える。図９Ｂに示すように、上で詳述したように分割された状態は、２つの新しい状態１４３６（Ｃ２およびＣ３）の追加という結果になる。ここでは、しかし、３つの状態が２つの状態１４３４に入力を与える。
【０１０１】
図５を再度参照すると、ＧＯＴ  ２１０は、ＳＭＥ  ２０４、２０５に関する出力制約を有する。特に、ＧＯＴ  ２１０は、２つのＳＭＥ  ２０４、２０５によって共有される単一の出力２１８を有する。その結果、ＧＯＴ  ２１０内の各ＳＭＥ  ２０４、２０５は、出力２１８を独立して駆動できない。この出力制約は、どのＳＭＥ状態がＧＯＴインスタンス内で共にペア形成できるかを制限する。特に、外部のＳＭＥ状態（例えば、ＧＯＴインスタンスの外部のＳＭＥに対応するＳＭＥ状態）の異なる集合を駆動する（例えば、遷移する、アクティブにする）２つのＳＭＥ状態は、ＧＯＴインスタンス内で共にペア形成できない。しかし、ＧＯＴ  ２１０は、この機能をスイッチ２４０で内部で提供できるので、この制約は、２つのＳＭＥ状態が互いに駆動するか、または自己ループを駆動するかを制限しない。ＦＳＭエンジン２００は、ＳＭＥ  ２０４、２０５に対応する特定の物理的設計を有するとして説明されているが、他の例では、ＳＭＥ  ２０４、２０５は、他の物理的設計を有し得る。例えば、ＳＭＥ  ２０４、２０５は、ＳＭＥ  ２０４、２０５の３つ以上のセットに共にグループ化され得る。さらに、いくつかの例では、ＳＭＥ  ２０４、２０５からの出力２２６、２２８に関する制限の有無にかかわらず、ＳＭＥ  ２０４、２０５に対する入力２１４、２１６に関する制限があり得る。
【０１０２】
しかし、いずれにせよ、コンパイラは、ＦＳＭエンジン２００の物理的設計に基づいてどのＳＭＥ状態が共にグループ化できるかを判断する。その結果、ＧＯＴインスタンスに対して、コンパイラは、ＧＯＴ  ２１０内のＳＭＥ  ２０４、２０５に対する出力制約に基づいて、どのＳＭＥ状態が共にペア形成できるかを判断する。一例では、ＧＯＴ  ２１０の物理的設計に基づいて、ＧＯＴ  ２１０を形成するために、２つのＳＭＥ状態が共にペア形成できる５つの状況がある。
【０１０３】
第１および第２のＳＭＥ状態がＧＯＴ  ２１０内に共にペア形成できる第１の状況は、第１または第２のＳＭＥ状態のどちらも最終状態でなく、かつ、第１および第２のＳＭＥ状態の一方が、第１または第２のＳＭＥ状態以外のどの状態も駆動しない場合に起こる。一例として、第１の状態が第２の状態に遷移する場合、第１の状態が第２の状態を駆動すると考えられる。この第１の状況が起こる場合、最大で、第１および第２のＳＭＥ状態のうちの１つが外部の状態を駆動している。その結果、第１および第２のＳＭＥ状態が、ＧＯＴ  ２１０の出力制約によって影響を受けることなく、共にペア形成できる。しかし、ＳＭＥ  ２０４、２０５を内部で互いに結合するＧＯＴ  ２１０の能力に起因して、第１および第２のＳＭＥ状態は、互いに駆動するか、または自身を駆動するために自己ループすることが可能にされる。オートマトンの用語では、第１のＳＭＥ状態（状態ｑ１に対応する）および第２のＳＭＥ状態（状態ｑ２に対応する）は、ｑ１およびｑ２のどちらも最終状態ではなく、かつδ（ｑ１）−｛ｑ１，ｑ２｝が空であるか、またはδ（ｑ２）−｛ｑ１，ｑ２｝が空である場合、共にペア形成できる。
【０１０４】
第１および第２のＳＭＥ状態がＧＯＴ  ２１０内に共にペア形成できる第２の状況は、第１または第２のＳＭＥ状態のどちらもオートマトン内の最終状態でない場合、ならびに、第１および第２のＳＭＥ状態の両方が同じ外部状態を駆動する場合に起こる。本明細書では、外部状態は、例えば、ＧＯＴ  インスタンス内の第１および第２のＳＭＥ状態が互いに駆動するか、または自己ループするかに関わらず、ＧＯＴインスタンスの外部の状態に対応する。ここで再度、第１および第２のＳＭＥ状態が同じ外部状態を駆動するので、ＧＯＴ  ２１０の出力制約は、第１および第２のＳＭＥ状態に影響を及ぼさない。また、ＳＭＥ  ２０４、２０５を内部で互いに結合するＧＯＴ  ２１０の能力に起因して、同じ状態の駆動に関する制限が、第１の状態および第２の状態が互いに駆動するか、または自己ループするかを含まない。オートマトンの用語を使用すると、第１のＳＭＥ状態（状態ｑ１に対応する）および第２のＳＭＥ状態（状態ｑ２に対応する）は、ｑ１およびｑ２のどちらも最終状態ではなく、かつδ（ｑ１）−｛ｑ１，ｑ２｝＝δ（ｑ２）−｛ｑ１，ｑ２｝である場合に、共にペア形成できる。
【０１０５】
第１および第２のＳＭＥ状態がＧＯＴ  ２１０内に共にペア形成できる第３および第４の状況は、第１および第２のＳＭＥ状態の一方が最終状態であり、かつ、第１および第２のＳＭＥ状態の他方がどの外部状態も駆動しない場合に起こる。すなわち、第１のＳＭＥ状態（状態ｑ１に対応する）および第２のＳＭＥ状態（状態ｑ２に対応する）は、ｑ１が最終状態であり、かつδ（ｑ２）−｛ｑ１，ｑ２｝が空であるか、またはｑ２が最終状態に対応し、かつδ（ｑ１）−｛ｑ１，ｑ２｝が空である場合、共にペア形成できる。最終状態は正規表現との一致の表示を出力するので、最終状態に対応するＳＭＥ状態は、一致を示すためにＧＯＴ  ２１０の出力２１８を独立して使用すべきである。その結果、ＧＯＴ  ２１０内の他のＳＭＥ状態は、出力２１８の使用を許可されない。
【０１０６】
第１および第２のＳＭＥ状態がＧＯＴ  ２１０内に共にペア形成できる第５の状況は、第１および第２のＳＭＥ状態の両方がオートマトン内の最終状態に対応し、かつ、第１および第２のＳＭＥ状態の両方が同じ外部状態を駆動する場合に起こる。オートマトンの用語を使用すると、第１の状態（状態ｑ１に対応する）および第２のＳＭＥ状態（状態ｑ２に対応する）は、ｑ１およびｑ２の両方が最終状態であり、かつδ（ｑ１）−｛ｑ１，ｑ２｝＝δ（ｑ２）−｛ｑ１，ｑ２｝である場合に、共にペア形成できる。
【０１０７】
１つまたは複数のＳＭＥ状態が共にペア形成できるかどうかをコンパイラが判断すると、コンパイラは、そのＳＭＥ状態をＧＯＴインスタンスにペア形成する。一例では、コンパイラは、ＳＭＥ状態が、ＧＯＴインスタンスを形成するためにペア形成することができると判断される順に、ＳＭＥ状態をＧＯＴインスタンスにペア形成する。すなわち、２つの特定のＳＭＥ状態が共にペア形成することができると判断されると、これら２つのＳＭＥ状態がＧＯＴインスタンスにペア形成できる。２つのＳＭＥ状態がペア形成されてＧＯＴインスタンスを形成すると、これらペア形成されたＳＭＥ状態は、他のＳＭＥ状態とペア形成するために利用できない。このプロセスは、ペア形成するＳＭＥ状態がもうなくなるまで継続され得る。
【０１０８】
一例では、コンパイラは、どのＳＭＥをＧＯＴインスタンスに共にペア形成できるかを判断するためにグラフ理論を使用する。特定のＳＭＥのみが共にペア形成できるので、あるＳＭＥのペア形成は、結果として、他のＳＭＥがそれら自身のＧＯＴインスタンス内で実装される必要があり、ＧＯＴインスタンス内の他のＳＭＥ位置が未使用で、従って無駄になり得る。グラフ理論は、ネットリストのＧＯＴインスタンス内の未使用のＳＭＥインスタンスの数を減らすことにより、ＧＯＴ  ２１０内でのＳＭＥ利用（例えば、未使用のＳＭＥの数を減らす）を最適化するために使用できる。グラフ理論を使用するため、コンパイラは、まず、前述したＦＳＭエンジン２００の物理的設計に従って、ＳＭＥ状態間で全ての可能なペア形成を判断する。コンパイラは、次いで、グラフのバーテックス（ｖｅｒｔｅｘ）がＳＭＥ状態に対応し、グラフのエッジがＳＭＥ状態の可能なペア形成に対応するグラフを作成する。すなわち、２つのＳＭＥ状態がＧＯＴインスタンス内で共にペア形成することができると判断されると、その２つの対応するバーテックスがエッジと結合される。従って、グラフは、ＳＭＥ状態の全ての可能なペア形成を含む。
【０１０９】
コンパイラは、次いで、どのＳＭＥ状態をＧＯＴ  ２１０内で共にペア形成するかを識別するため、グラフに対して、一致するバーテックスを見つけることができる。すなわち、グラフの一致するバーテックス間のどの２つのエッジも共通のバーテックスを共有しないように、コンパイラがエッジ（および従ってバーテックスのペア）を識別する。一例では、コンパイラは、グラフに対して最大限のマッチング（ｍａｘｉｍａｌ  ｍａｔｃｈｉｎｇ）を見つけることができる。別の例では、コンパイラは、グラフに対して最大マッチング（ｍａｘｉｍｕｍ  ｍａｔｃｈｉｎｇ）を見つけることができる。最大マッチングは、できる限り多くのエッジを含むマッチングである。多数の最大マッチングがあり得る。一般グラフの最大マッチングを見つける問題は、多項式時間で解決できる。
【０１１０】
全ての一致するバーテックスが（例えば、最大マッチングとして）識別されると、一致するバーテックスに対応するＳＭＥ状態の各ペアが、ＧＯＴインスタンスにマッピングされる。一致しないバーテックスに対応するＳＭＥ状態は、それら自身のＧＯＴインスタンスにマッピングされる。すなわち、一致しないバーテックスに対応するＳＭＥ状態は、ＧＯＴインスタンス内のＳＭＥ位置の１つにマッピングされ、ＧＯＴインスタンス内の他方のＳＭＥ位置は未使用となる。その結果、ネットリストＮおよびその一致するバーテックスの対応する集合Ｍを前提として、使用されたＮのＧＯＴインスタンスの数が｜Ｑ｜−１−｜Ｍ｜に等しく、式中Ｑはオートマトンの状態の集合であり、「−１」は、この例では、オートマトンの開始状態がＳＭＥ状態に対応しないからである。
【０１１１】
一例では、Ｇの最大マッチングＭから構築されているネットリストＮは、最小数のＧＯＴインスタンスを使用する。これは、以下によって示され得る：さらに少ない数のＧＯＴインスタンスを使用する別のネットリストＮ´が存在する場合、対応する一致はＭ´として示される。Ｎ´のＧＯＴインスタンスの数が｜Ｑ｜−１−｜Ｍ´｜に等しいので、｜Ｍ｜<｜Ｍ´｜となる。これは、Ｍが最大マッチングであるという事実と矛盾する。従って、ネットリストＮは、ＧＯＴインスタンスの最小数を使用する。
【０１１２】
ＳＭＥ状態がＧＯＴインスタンスにペア形成されると、ＧＯＴインスタンス、カウンタインスタンス、および論理インスタンスが、オートマトン内の状態間の遷移に従って、結合される。各ＧＯＴ  ２１０は、単一の出力を有するので、ネットリスト内の各ＧＯＴインスタンスは、他のインスタンスに結合するための単一の出力ポートを有する。その結果、第１のＧＯＴインスタンス内のどちらか一方のＳＭＥ状態が第２のＧＯＴインスタンス内のＳＭＥ状態を駆動する場合、第１のＧＯＴインスタンスの出力ポートが第２のＧＯＴインスタンスの入力に結合される。
【０１１３】
図１５Ａおよび図１５Ｂは、均質なオートマトンから作成されたネットリスト例１５００、１５０２を示す。ネットリスト１５００、１５０２は、ＳＭＥインスタンス１５０６、１５０８、１５１０、１５１２、および１５１４を含む。ネットリスト１５００は、非最適のネットリストの例である。ネットリスト１５００は、４つのＧＯＴインスタンス１５１６を使用するが、３つのＳＭＥインスタンス１５１８を未使用のまま残している。しかし、ネットリスト１５０２は、最大マッチングを識別するために、グラフ理論を使用して作成された最適なネットリストの例である。ネットリスト１５０２は、３つのＧＯＴインスタンス１５１６を使用し、未使用のＳＭＥインスタンス１５１８が１つある。ネットリスト１５０２では、インスタンス１５１０は、ＧＯＴインスタンス内部の接続（例えば、スイッチ２４０を介して）で、インスタンス１５１２に接続できる。
【０１１４】
本明細書で説明する方法例は、少なくとも一部は、機械またはコンピュータ実装できる。いくつかの例は、上の例で説明した方法を実行する電子装置を構成するように動作可能な命令でコード化されたコンピュータ可読媒体または機械可読媒体を含み得る。かかる方法の実装は、マイクロコード、アセンブリ言語コード、高水準言語コード、または同様のものなどの、コードを含み得る。かかるコードは、様々な方法を実行するためのコンピュータ可読命令を含み得る。コードは、コンピュータプログラム製品の一部を形成し得る。さらに、コードは、実行中または他の時に、１つもしくは複数の揮発性または不揮発性のコンピュータ可読媒体上に有形的に格納され得る。これらのコンピュータ可読媒体は、ハードディスク、取り外し可能磁気ディスク、取り外し可能光ディスク（例えば、コンパクトディスクおよびデジタルビデオディスク）、磁気カセット、メモリカードまたはメモリスティック、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、および同様のものを含み得るが、これらに限定されない。
【０１１５】
図１６は、フォンノイマン型アーキテクチャを有するコンピュータ１６００の例をおおまかに示す。本開示の内容を読んで理解すると、当業者であれば、ソフトウェアプログラム内に定義された機能を実行するために、ソフトウェアプログラムが、コンピュータベースシステム内のコンピュータ可読媒体から起動できる方法を理解するであろう。当業者は、さらに、本明細書で開示する方法を実装および実行するように設計された１つまたは複数のソフトウェアプログラムを作成するために採用できる様々なプログラム言語を理解するであろう。プログラムは、Ｊａｖａ、Ｃ＋＋、または１つもしくは複数の他の言語などのオブジェクト指向言語を使用して、オブジェクト指向フォーマットで構造化できる。代替として、プログラムは、アセンブリ、Ｃ、などの手続き型言語を使用して、手続き指向フォーマットで構造化できる。ソフトウェアコンポーネントは、リモートプロシージャコールまたはその他を含む、アプリケーションプログラムインタフェースまたはプロセス間通信技術など、当業者に周知の任意の数の機構を使用して、通信できる。様々な実施形態の技術は、任意の特定のプログラム言語または環境に制限されない。
【０１１６】
このようにして、他の実施形態が実現できる。例えば、コンピュータ、メモリシステム、磁気ディスクもしくは光ディスク、何らかの他の記憶装置、または任意のタイプの電子装置もしくはシステムなどの、製品は、その上に格納された命令１６２４（例えば、コンピュータプログラム命令）を有するメモリ（例えば、取り外し可能記憶媒体、ならびに電気導体、光導体、または電磁導体を含む任意のメモリ）などの、コンピュータ可読媒体１６２２に結合された１つまたは複数のプロセッサ１６０２を含み得、それは、１つまたは複数のプロセッサ１６０２で実行される場合に、上の方法に関して説明した動作のいずれかを実行する結果となる。
【０１１７】
コンピュータ１６００は、いくつかのコンポーネントに直接、および／またはバス１６０８を使用して、結合されたプロセッサ１６０２を有するコンピュータシステムの形をとることができる。かかるコンポーネントには、メインメモリ１６０４、スタティックまたは不揮発性メモリ１６０６、および大容量記憶１６１６を含み得る。プロセッサ１６０２に結合された他のコンポーネントには、ビデオディスプレイなどの出力装置１６１０、キーボードなどの入力装置１６１２、およびマウスなどのカーソル制御装置１６１４を含み得る。プロセッサ１６０２および他のコンポーネントをネットワーク１６２６に結合するためのネットワークインタフェース装置１６２０は、バス１６０８にも結合できる。命令１６２４は、いくつかの周知の転送プロトコル（例えば、ＨＴＴＰ）のうちの任意の１つを利用するネットワークインタフェース装置１６２０を経由し、ネットワーク１６２６を通して、さらに転送または受信され得る。バス１６０８に結合されたこれら要素のいずれかは、実現される特定の実施形態に応じて、存在しないか、単独で存在し得るか、または複数で存在し得る。
【０１１８】
一例では、１つまたは複数のプロセッサ１６０２、メモリ１６０４、１６０６、または記憶装置１６１６は各々、コンピュータ１６００に、実行時に、本明細書に記載する方法のいずれか１つまたは複数を実行させ得る、命令１６２４を含むことができる。代替実施形態では、コンピュータ１６００は、スタンドアロン装置として動作するか、または他の装置に接続（例えば、ネットワーク接続）できる。ネットワーク化された環境では、コンピュータ１６００は、サーバークライアントネットワーク環境内のサーバーもしくはクライアント装置の資格で、または、ピアツーピア（もしくは分散）ネットワーク環境内のピア装置として、動作できる。コンピュータ１６００には、パーソナルコンピュータ（ＰＣ）、タブレットＰＣ、セットトップボックス（ＳＴＢ）、携帯情報端末（ＰＤＡ）、携帯電話、ウェブアプライアンス、ネットワークルーター、スイッチもしくはブリッジ、またはその装置によってとられる動作を指定する命令のセットを（連続して、もしくは他の方法で）実行可能な任意の装置を含み得る。さらに、単一のコンピュータ１６００のみが示されているが、「コンピュータ」という用語は、本明細書で説明する方法のいずれか１つまたは複数を実行するための命令のセット（または複数のセット）を単独に、または一緒に実行する装置の任意の集合を含むようにも解釈されるものとする。
【０１１９】
コンピュータ１６００は、１つまたは複数の通信プロトコル（例えば、ユニバーサルシリアルバス（ＵＳＢ）、ＩＥＥＥ  １３９４など）を使用して周辺機器と通信するための出力コントローラ１６２８も含むことができる。出力コントローラ１６２８は、例えば、コンピュータ１６００に通信的に結合されているプログラミング装置１６３０にイメージを提供できる。プログラミング装置１６３０は、並列マシン（例えば、並列マシン１００、ＦＳＭエンジン２００）をプログラムするように構成できる。他の例では、プログラミング装置１６３０は、コンピュータ１６００と統合されて、バス１６０８に結合できるか、またはネットワークインタフェース装置１６２０または別の装置を経由してコンピュータ１６００と通信できる。
【０１２０】
コンピュータ可読媒体１６２４は単一の媒体として示されているが、「コンピュータ可読媒体」という用語は、命令１６２４の１つまたは複数のセットを格納する単一の媒体または複数の媒体（例えば、集中型もしくは分散型データベース、または関連するキャッシュおよびサーバー、ならびに／またはプロセッサ１６０２レジスタ、メモリ１６０４、１６０６、および記憶装置１６１６などの様々な記憶媒体）を含むように解釈されるべきである。「コンピュータ可読媒体」という用語は、コンピュータによって実行するための命令のセットを格納、コード化、または運搬可能であり、かつ、コンピュータに本発明の方法のいずれか１つまたは複数を実行させるか、または命令のかかるセットによって利用されるか、またはそれに関連したデータ構造を格納、コード化、または運搬可能である、任意の媒体を含むように解釈されるものとする。「コンピュータ可読媒体」という用語は、その結果、ソリッドステートメモリ、光媒体、および磁気媒体などの、有形的媒体を含むように解釈されるものとするが、それらに限定されない。
【０１２１】
要約は、読者が技術的開示の本質および要点を確認できるようにする要約を要求する米国特許規則（３７  Ｃ．Ｆ．Ｒ）１．７２（ｂ）項に準拠するために提供されている。それは、請求項の範囲または意味を制限または解釈するために使用されないという理解で提示されている。以下の請求項は、これによって詳細な説明に組み込まれ、各請求項が別個の実施形態として権利を主張する。
【０１２２】
〔実施形態例〕
例１は、命令がその上に格納されたメモリを含むコンピュータを含む。コンピュータは、そのメモリに通信的に結合されたプロセッサも含み、命令は、プロセッサによって実行される際に、そのプロセッサに、ソースコードを、状態および状態間の遷移を含むオートマトンに変換させ、オートマトン内の状態は、専用ハードウェア要素に対応する専用状態を含む。命令は、また、プロセッサに、オートマトンをネットリストに変換させ、対象装置を構成するための機械コードを提供するために、そのネットリストを位置付けさせ、ルーティングさせる。
【０１２３】
例２は、１つまたは複数のプロセッサを使用して、ソースコードを構文木に解析することを含む、コンピュータ実装方法を含む。本方法は、１つまたは複数のプロセッサを使用して、構文木をオートマトンに変換することも含み、オートマトンは、複数の状態および複数の状態間の遷移を有する動作のモデルを定義し、また、オートマトンの構造は、対象ハードウェア装置によって決定される。本方法は、１つまたは複数のプロセッサを使用して、オートマトンをネットリストに変換することも含み、ネットリストは複数のインスタンスを含み、各インスタンスは対象装置のハードウェア要素に対応する。本方法は、１つまたは複数のプロセッサを使用して、インスタンスの各々を位置付けることも含み、位置づけは、ネットリスト内の各インスタンスを対象装置のハードウェア要素に割り当てることを含む。本方法は、１つまたは複数のプロセッサを使用し、ネットリストに応じてハードウェア要素間の接続をルーティングすること、ならびに位置付けおよびルーティングに基づいて対象装置をプログラムするために使用されるプログラミングデータを作成することも含む。
【０１２４】
例３は、１つまたは複数の入力および１つまたは複数の出力を含む、複数のプログラム可能要素を含む、プログラム可能装置を含む。プログラム可能装置は、複数のプログラム可能要素の部分の外部回路に対するインタフェースをとるための入力ブロックおよび出力ブロックも含む。プログラム可能装置は、複数のプログラム可能要素と、入力ブロックおよび出力ブロックを通信的に接続する複数のプログラム可能スイッチも含み、１つまたは複数のプログラム可能スイッチの設定が、複数のプログラム可能要素および複数のプログラム可能スイッチの任意の２つ以上の間をルーティングする信号を選択的に制御する。プログラム可能装置は、複数のプログラム可能要素および複数のプログラム可能スイッチを構成できるプログラミングデータを格納するように構成された複数のレジスタも含み、そのプログラミングデータは、１つまたは複数のプロセッサを使用して、ソースコードを構文木に解析すること；１つまたは複数のプロセッサを使用して、構文木をオートマトンに変換することであって、オートマトンが、複数の状態および複数の状態間の遷移を有する動作のモデルを定義し、また、オートマトンの構造が、対象ハードウェア装置によって決定される、構文木をオートマトンに変換すること；１つまたは複数のプロセッサを使用して、オートマトンをネットリストに変換することであって、ネットリストが複数のインスタンスを含み、各インスタンスが対象装置のハードウェア要素に対応する、オートマトンをネットリストに変換すること；１つまたは複数のプロセッサを使用して、インスタンスの各々を位置付けることであって、位置付けることが、ネットリスト内の各インスタンスを対象装置のハードウェア要素に割り当てることを含む、インスタンスの各々を位置付けること；１つまたは複数のプロセッサを使用し、ネットリストに応じてハードウェア要素間の接続をルーティングすること；ならびに、位置付けおよびルーティングに基づいて対象装置をプログラムするために使用されるプログラミングデータを作成すること；によって作成される。
【０１２５】
例４は、命令を含むコンピュータ可読媒体を含み、それは、１つまたは複数のプロセッサによって実装されるときに、以下の動作：ソースコードを構文木に解析すること；構文木をオートマトンに変換することであって、オートマトンが、複数の状態および複数の状態間の遷移を有する動作のモデルを定義し、また、オートマトンの構造が、対象ハードウェア装置によって決定される、構文木をオートマトンに変換すること；オートマトンをネットリストに変換することであって、ネットリストが、対象装置に関連した、複数のハードウェア要素を含み、かつ、ネットリストがハードウェア要素間の接続を定義する、オートマトンをネットリストに変換すること；ハードウェア要素の各々を位置付けることであって、位置づけが、ネットリスト内の各ハードウェア要素を対象装置内の位置に割り当てることを含む、ハードウェア要素の各々を位置付けること；ネットリストに応じてハードウェア要素間の接続をルーティングすること；ならびに、位置付けおよびルーティングを反映するように対象装置をプログラムするために使用されるプログラミングデータを作成すること、を実行する。
【０１２６】
例５は、コンピュータ実装方法を含み、その方法は、１つまたは複数のプロセッサを使用して、ソースコードを構文木に解析すること；その変換を使用し、１つまたは複数のプロセッサを使用して、構文木をオートマトンに変換することであって、変換することが、対象装置に基づいてオートマトンの構造を制限することを含み、その対象ハードウェア装置が、２つのグループ（ｇｒｏｕｐ  ｏｆ  ｔｗｏ）にペア形成された状態機械要素を含む、構文木をオートマトンに変換することを含む。本方法は、１つまたは複数のプロセッサを使用して、オートマトンをネットリストに変換することであって、ネットリストが、対象装置に関連付けられた複数のハードウェア要素を含み、ネットリストがハードウェア要素間の接続を定義する、オートマトンをネットリストに変換すること；１つまたは複数のプロセッサを使用して、ハードウェア要素の各々を位置付けることであって、位置付けることが、ネットリスト内の各ハードウェア要素を対象装置内の位置に割り当てることを含む、ハードウェア要素の各々を位置付けること；１つまたは複数のプロセッサを使用し、ネットリストに応じてハードウェア要素間の接続をルーティングすること；ならびに位置付けおよびルーティングを反映するように対象装置をプログラムするために使用される、複数のビットを作成することも含む。
【０１２７】
例６では、例１〜５のいずれかの主題が、数量化が専用ハードウェア要素にマッピングされるための条件を満足する場合、ソースコードを変換することが、数量化を、専用ハードウェア状態を含む、複数の状態に変換することを含むこと、を随意に含み得る。
【０１２８】
例７では、例１〜６のいずれかの主題が、数量化が専用ハードウェア要素にマッピングされるための条件を満足しない場合、ソースコードを変換することが、数量化を、複数の汎用状態に展開することを含むこと、を随意に含み得る。
【０１２９】
例８では、例１〜７のいずれかの主題が、展開することが、オートマトンの入次数を制御するように数量化を展開することを含むこと、を随意に含み得る。
【０１３０】
例９では、例１〜８のいずれかの主題が、オートマトンを最適化することであって、最適化することが、特定の状態の推定された入次数が対象装置の制約よりも多い場合に、オートマトンの特定の状態を複数の状態に分割することを含むこと、を随意に含み得る。
【０１３１】
例１０では、例１〜９のいずれかの主題が、特定の状態を分割することが、複数の状態の各々の入次数が制約を満足するように、特定の状態の駆動状態を複数の状態に分散することを含むこと、を随意に含み得る。
【０１３２】
例１１では、例１〜１０のいずれかの主題が、オートマトンをネットリストに変換することが、状態をネットリストのインスタンスにマッピングすることを含み、マッピングすることが、専用状態を、専用要素に対応する専用インスタンスにマッピングすることを含むこと、を随意に含み得る。
【０１３３】
例１２では、例１〜１１のいずれかの主題が、オートマトンをネットリストに変換することが、対象装置の物理的設計に基づいて状態をともにグループ化することを含むこと、を随意に含み得る。
【０１３４】
例１３では、例１〜１２のいずれかの主題が、インスタンスが、状態機械要素（ＳＭＥ）ハードウェア要素に対応するＳＭＥインスタンスおよびＳＭＥのグループを含むハードウェア要素に対応するＳＭＥグループインスタンスを含み、かつ、グループ化することが、状態をＳＭＥグループインスタンスにグループ化することを含むこと、を随意に含み得る。
【０１３５】
例１４では、例１〜１３のいずれかの主題が、構文木をオートマトンに変換することが、ソースコード内の数量化を、対象装置のカウンタ要素に対応する専用状態を含む、複数の状態に変換することを含むこと、を随意に含み得る。
【０１３６】
例１５では、例１〜１４のいずれかの主題が、ＳＭＥに対応する複数の汎用状態が、ＧＯＴハードウェア要素の出力制約に基づいてＧＯＴインスタンスを形成するために、ともにグループ化されること、を随意に含み得る。
【０１３７】
例１６では、例１〜１５のいずれかの主題が、オートマトンの入次数を制限することであって、入次数を制限することが、オートマトンの状態への遷移数を制限することを含むこと、を随意に含み得る。
【０１３８】
例１７では、例１〜１６のいずれかの主題が、入次数を制限することが、特定の状態を複数の状態に分割すること、および複数の状態の各々の入次数が制約を満足するように、特定の状態の駆動状態を複数の状態に分散することを含むこと、を随意に含み得る。
【０１３９】
例１８では、例１〜１７のいずれかの主題が、入次数を制限することが、数量化を複数の展開された状態に展開すること、および任意の展開された状態に対する入遷移数を制限することを含むこと、を随意に含み得る。
【０１４０】
例１９では、例１〜１８のいずれかの主題が、変換することが、ソースコード内の数量化が、対象装置のカウンタにマッピングされるための条件を満足するかどうかを判断することを含み；数量化が条件を満足する場合に、数量化を、カウンタ状態を含む複数の状態に変換し；また、数量化が条件を満足しない場合に、数量化を展開することにより、数量化を、複数のＳＭＥ状態に変換すること、を随意に含み得る。
【０１４１】
例２０では、例１〜１９のいずれかの主題が、数量化が条件を満足するかどうかを判断することが、その数量化に対する駆動式が、数量化が処理されている間に一致できるかどうかを判断することを含むこと、を随意に含み得る。
【０１４２】
例２１では、例１〜２０のいずれかの主題が、数量化が条件を満足するかどうかを判断することが、数量化の繰返し式が数量化の別の繰返し式のプレフィックスであるかどうかを判断することを含むこと、を随意に含み得る。
【０１４３】
例２２では、例１〜２１のいずれかの主題が、数量化を、カウンタ状態を含む複数の状態に変換することが、複数の状態を、数量化の繰返し式およびカウンタ状態を含むループとして実装することを含み、カウンタ状態が、その繰返し式が一致する回数をカウントするように構成されていて、かつ、繰返し式が、数量化によって指定された回数一致する場合に、カウンタ状態が、下流の状態をアクティブにすること、を随意に含み得る。
【０１４４】
例２３では、例１〜２２のいずれかの主題が、展開することが、対象装置の入次数制約に基づいて、オートマトンの入次数を制御するように数量化を展開することを含むこと、を随意に含み得る。
【０１４５】
例２４では、例１〜２３のいずれかの主題が、変換することが、共通の出力を共有する２つのグループに基づいて、オートマトンの構造を制限することを含むこと、を随意に含み得る。
【０１４６】
例２５では、例１〜２４のいずれかの主題が、制限することが、対象装置のカウンタ要素に基づいて、オートマトンの構造を制限することを含むこと、を随意に含み得る。
【０１４７】
例２６では、例１〜２５のいずれかの主題が、複数のビットを公開すること、を随意に含み得る。
【０１４８】
例２７では、例１〜２６のいずれかの主題が、複数の状態を削減するためにオートマトンを最適化すること、を随意に含み得る。
【０１４９】
例２８は、請求項１〜請求項２７のいずれかの主題を使用して生成されたイメージによってプログラム化された並列マシンを含む。
【図１】
0005763783.tif 000002
【図２】
0005763783.tif 000003
【図３】
0005763783.tif 000004
【図４】
0005763783.tif 000005
【図５】
0005763783.tif 000006
【図６】
0005763783.tif 000007
【図７】
0005763783.tif 000008
【図８】
0005763783.tif 000009
【図９】
0005763783.tif 000010
【図１０】
0005763783.tif 000011
【図１１Ａ】
0005763783.tif 000012
【図１１Ｂ】
0005763783.tif 000013
【図１２】
0005763783.tif 000014
【図１３Ａ】
0005763783.tif 000015
【図１３Ｂ】
0005763783.tif 000016
【図１３Ｃ】
0005763783.tif 000017
【図１４Ａ】
0005763783.tif 000018
【図１４Ｂ】
0005763783.tif 000019
【図１５Ａ】
0005763783.tif 000020
【図１５Ｂ】
0005763783.tif 000021
【図１６】
0005763783.tif 000022