図1は、従来技術で周知のデータ処理システム100のブロック図である。データ処理システム100は、システム100の中央処理装置(CPU)を形成する、縮小命令セットコンピュータ(RISC)マイクロプロセッサ102を含む。RISCマイクロプロセッサ102は、ランダムアクセスメモリ(RAM)104の形式で高速の揮発性メモリに結合され、また、マスク読み出し専用メモリ(ROM)形式、フラッシュ電気的消去可能プログラムROM(“フラッシュ”)形式などの低速の不揮発性メモリ(NVM)106に接続される。さらに、システム100は、RISCマイクロプロセッサ102に直接的に、あるいは、入力/出力アダプタを介して接続された入力/出力装置を含む。(図1に図示せず)
システム100は、PDA、携帯電話、携帯用ビデオゲームシステムおよびこれらに類するものなどの携帯端末に求められる特殊な処理を実行するために、汎用デジタルシグナルプロセッサ(DSP)110を含む。このDSPは、固有のRAM112とNVM114とをデータとを有し、それぞれデータとプログラムとを格納する。RISCマイクロプロセッサ102とDSP110との間でタスクと結果とを送るために、システム100は共有メモリ108を備えている。
コンピュータシステム100を低価格の携帯装置に用いる場合にはいくつかの欠陥がある。まず、RISCマイクロプロセッサ102とDSP110とは別々のチップであり、これによりシステム費用が増大する。次に、各プロセッサにはそれぞれ別のメモリが必要であり、これにより、チップ数が増え、この結果、システム費用が増大する。第3に、各プロセッサはそれぞれの命令セットを有しているので、各プロセッサにはそれぞれ別々のアセンブラ、コンパイラ、および開発ツールが必要であり、この結果、複雑さが増し、市場に出すまでに残された時間が短くなる。
図2は、本発明によるデータ処理システム200のブロック図を示す。
データ処理システム200は、RISCプロセッサコア300、RAM205とNVM206を含むメモリ204、インターフェース210、および特殊なDSPリストコプロセッサ500を含む。これまでのように、NMV206はマスクROM、フラッシュEEPROMの形式をとることができる。例示の実施形態では、RISCプロセッサコア300、インターフェース210、およびDSPリストコプロセッサ500は、単一の集積回路に組み込まれている。図1のRISCプロセッサコア102とは違って、RISCプロセッサコア300はコプロセッサを含む他のシステム構成要素と一体化するように構成されている。従って、RISCプロセッサコア300は、ユーザにより定義されたコプロセッサ命令を認識し、これらの特定の命令をインターフェース210を介してコプロセッサに供給する特殊機能を備えている。例示の実施形態では、RISCプロセッサコア300はカリフォルニア州マウンテンビューのMIPSテクノロジー社より入手可能な4KES(商標)プロセッサコアファミリーと互換性があるが、同様の機能性を有する等価のプロセッサコアと置き換えることもできる。
インターフェース210は、RISCプロセッサコア300とDSPリストコプロセッサ500との間のインタラクションポイントである。これらのプロセッサ間にデータを転送し、インターフェースを制御する信号線を介してインタラクションが実現される。関連のある信号線を以下に記述しているが、これらの信号線は単に例示的なものである点に留意されたい。“INSTRUCTION”とラベル付けされた一連の32の信号線212は、RISCプロセッサコア202の命令セットの1以上の命令に対応する。4KES(商標)コアの場合、予約されたいくつかの命令については、コプロセッサとの間の処理専用にされている。このような命令は、ユーザ定義インターフェース(UDI)命令と呼ばれ、命令をUDI命令と認識する命令フィールド部分、および、これとは別の、実行されるオペレーション形式を特定する命令フィールド部分とを有する。RISCプロセッサコア300は、このINSTRUCTIONフィールドを使用し、最小限で、DSPリストコプロセッサ500に運ばれるUDI命令の形式を示す。よって、このINSTRUCTIONフィールドはRISCコプロセッサコア命令と同一であってもよいが、命令を特定するだけの十分な数があれば、含まれるビット数はより少なくてもよい。さらに、このINSTRUCTIONフィールドは、RISCプロセッサコア300によって認識される命令とは違ったやりかたで命令をエンコードしてもよい。
インターフェース210は、“rs”とラベル付けされた第1オペランドを実行するために、32本の信号線の第1セットを使用し、“rt”とラベル付けされた第2オペランドを実行するために32本の信号線の第2セットを使用して、オペランドを2つまでDSPリストコプロセッサ500に転送する。あるUDI命令には、これら信号線のセットの一方あるいは両方とも必要とされない。
インターフェース210は、“rd”とラベル付けされた32ビットの結果オペランドを転送する一連の信号線218を含み、これにより、DSPリストコプロセッサ500はINSTRUCTIONの結果をRISCプロセッサコア300に返す。
さらに、インターフェース210は、インターフェース210のオペレーションを制御するいくつかの制御信号を実行する“コントロール”220とラベル付けされた制御バスを含む。
RISCプロセッサコア300とDSPリストコプロセッサ500とは、SOCにおいて、他の入力/出力装置と一体化される(図2に図示せず)。RISCプロセッサコア300は、UDIのアベイラビリティ(availability)のおかげで、そのパイプラインを変形せずにDSPリストコプロセッサ500とインターフェース接続できる。
システム200は、DSPリストコプロセッサ500専用の付加的メモリや、RISCプロセッサコア300とDSPリストコプロセッサ500との間の通信メモリのいずれも必要とせずに、単一のメモリシステム204だけを含む。オペランドフローは以下のように生じる。まず、RISCプロセッサコア300は、ムーブ命令に応答して、データをその汎用レジスタの1つに移動させる。データはメモリ204に存在しているものか、入力/出力装置(図2に図示せず)から受信済のものであってもよい。次に、RISCプロセッサコア300は、データをDSPリストコプロセッサ500に移動させるUDI命令を実行する。DSPリストコプロセッサ500は、別々のメモリアクセスを必要とせずに様々なタイプのDSPタスクを実行することができるように、それぞれのリストメモリを含む。加えて、多くのDSPルーチンのそのシーケンシャルな性質により、DSPリストコプロセッサ500は、命令を受信すると値の維持とアップデートとを同時に行う。これにより、RISCプロセッサコア300による介入およびオーバーヘッドが最小限に抑えられるとともに、さらなる処理機能がフリーアップ(free up)される。DSPリストコプロセッサ500はこの結果をrd信号線218越しに返し、RISCプロセッサコア300はこの結果をUDI命令により定義されるrdフィールドによって識別されるレジスタ25に記録する。
追加のメモリ構造なしで効率的なDSP処理を実現するために、DSPリストコプロセッサ500は、多くのDSPと関連する命令から要求されたデータ値のリストを記録する内部リストメモリ(internal list memory)を含む。特定のUDI命令に遭遇したときに、DSPリストコプロセッサ500はこのリストメモリに新たなオペランド値を記録し、その値と、リストメモリにすでに存在する他の値を使用してその命令を実行する。しかし、その他の実装形態では、実際に転送された値を現在の演算のために使用せずに、後で使用するために記憶だけが行われてもよい。
実際にはDSPリストコプロセッサ500により実装されないが、この技術をその他の特殊用途の計算に使用することもできる。例えば、あるデータ通信タスクは、巡回冗長検査(CRC)方式で、フレームチェックシーケンスの計算を要求する。CRC多項式にはいくつかの周知なものがあるが、これらはすべて多項式を一連のデータサンプルに適用して数字を得るものである。実行中のCRCが計算されるデータサンプルの履歴を記録するためにこのリストメモリを使用してもよい。加えて、特定のCRC生成多項式は、他の命令を通じて前もってプログラムされるか、予め決められたのもであってもよい。同様に、DSPリストコプロセッサ500は、汎用多項式評価の一環として、リストメモリを効率的に使用するように変更してもよい。
図3に、図2のRISCプロセッサコア300のブロック図を示す。図3は、本発明を理解するうえで重要なRISCプロセッサコア300の詳細を示しており、他の従来の特徴は省略している。RISCプロセッサコア300は汎用レジスタファイル302を含む。汎用レジスタファイル302は、32のレジスタを含み、各々は32ビット長であり、連番で“r0”、“r1”、“r2”などから“r31”までラベル付けされている。加えて、RISCプロセッサコア300は機器構成レジスタ(configuration register)304を含む。この機器構成レジスタは、ユーザ定義のインターフェースオペレーションをイネーブルにする、あるいはディセーブルにするために使用される“UDI”とラベル付けされたビット306を有している。UDIビット306およびレジスタファイル302中のレジスタは、エグゼキューションユニット(execution unit)308にアクセス可能である。このエグゼキューションユニットはソフトウェアプログラムによる命令体系の命令を実行する。
命令の1クラスとして、UDI命令群が挙げられる。UDI命令の受信に応答して、UDI命令がUDIビット306によってイネーブルにされているときは、エグゼキューション(実行)ユニット308は、命令と所要のレジスタ値とをオペランドとして示すフィールドをUDIインターフェースコントローラ310に送信する。次に、UDIインターフェースコントローラ310は、UDIインターフェース210を越えて、RISCプロセッサコア300とDSPリストコプロセッサ500との間の値の交換を制御する。
UDIビット306によりイネーブルにされているときは、エグゼキューションユニット308は、図4に示すようにUDI命令をデコードし実行する。図4に、図3のRISCプロセッサコア300によって使用されるコプロセッサ命令400のフォーマットを示す。命令400は32ビット命令であり、様々なビット長の7つのフィールド402、404、406、308、410、412、および414を備える。ビット3−0は“SET CODE”フィールドとして周知のフィールド402を含む。このSET CODEフィールドは、主要なUDI INSTRUCTIONタイプを特定する。このUDI命令には、ALUオペレーション、MACオペレーション、リストオペレーション(以下に更なる詳細を説明する)、ムーブトゥー(MOVE TO)オペレーションとムーブフロム(MOVE FROM)オペレーション、および、拡張ALUオペレーションを含む。
ビット5および4は“BLOCK”フィールドとして周知のフィールド404を含む。BLOCKフィールド404はDSPリストコプロセッサ500に対して常に01に設定されている。
ビット10−6は“SUBSET CODE”フィールドとして周知のフィールド406を含む。SUBSET CODEフィールド406はDSPリストコプロセッサ500によって認識される特定のオペレーションコード(オペコード)を定義する。また、SET CODEフィールド402の値に基づいて異なる意味を有する。
ほとんどのSET CODE値に対する命令は、DSPリストコプレセッサ500に従来のデータ処理オペレーションを実行させる。しかし、DSPリストコプロセッサ500は、リストオペレーションとして周知の特定の一連のオペレーションを実行することができ、これにより、多くのDSPオペレーションのシーケンス性をうまく利用することができる。したがって、SET CODEフィールド402がリストオペレーションを示すときに、SUBSET CODEフィールド406は表1に示すようなエンコーディングを有する。
表2に、リスト命令中にDSPリストコプロセッサ500とRISCプロセッサコア300との間で転送されるオペランドを示す。
“x”はドントケアを示し、“マルチプル”は、サイクル数がXメモリ524および/あるいはYメモリ522のリスト(つまり、長さ)中の要素の数に応じて決まることを示す。
ビット31−36は命令タイプフィールド414を形成する。このフィールドは、いわゆる“SPECIAL 2”命令フォーマットを示すようにバイナリ値“011100”を有しており、BLOCKフィールドも同様に値01を有する場合に、命令がDSPリストコプロセッサ500に向けられたUDI命令であることを示す。
残りのビットフィールドはオペランドレジスタ指示子を含む。各々は5ビット長であり、32ビットの汎用レジスタの1つを選択する。ビット25−21は、“rs”とラベル付けされた、第1のソースオペランド識別子フィールド412を含む。ビット20−16は、“rt”とラベル付けされた、第2のソースオペランド識別子フィールド410を含む。ビット15−11は、“rd”とラベル付けされた、指示オペランド識別子フィールド408を含む。これらのフィールドの使用の有無は命令のタイプに応じて決まる。
図5に、図2のDSPリストコプロセッサ500のブロック図である。DSPリストコプロセッサ500は一般的に、制御および順序付けロジック(control and sequencing logic)510、リストメモリ520、および論理演算ユニット(ALU)530を含む。制御および順序付けロジック510はUDIインターフェース210を管理し、INSTRUCTIONフィールドにより示される命令をデコードする。さらに、このロジックは、リストメモリ520中にポインタを維持する。これらのポインタは、“Y”メモリ522と“X”メモリ524のそれぞれに対して、ヘッドポインタとテールポインタとを含む。よって、制御および順序付けロジック510は“YH”とラベル付けされたYヘッドポインタ、“YT”とラベル付けされたYテールポインタ、“XH”とラベル付けされたXヘッドポインタ、および、“XT”とラベル付けされたXテールポインタを出力する。以下に詳述するように、ヘッドポインタとテールポインタとは値のシーケンシャルリストの開始アドレスと終了アドレスとを定義する。さらに、制御および順序付けロジック510は、“ADDRESSSA”とラベル付けされたYメモリ522のリスト中にインデックスを付けるためのアドレス、“ADDRESSSB”とラベル付けされたXメモリ524のリスト中にインデックスを付けるためのアドレス、“DATAY”とラベル付けされた、Yメモリに記録されるデータ値、および、“DATAX”とラベル付けされた、Xメモリに記録されるデータ値を出力する。
リストメモリ520は、Yメモリ522とXメモリ524の両方を含み、各々は16ビット値を格納する。1つの特定の有益なDSPオペレーション、有限インパルス応答(FIR)フィルタ計算を実行するために、Xメモリ524中の値はフィルタの係数に対応し、Yメモリ522中の値はデータサンプルに対応する。
ALU530は、レジスタ523と534、マルチプレクサ(MUX)540、マルチプライアキュムレート(multiply-and-accumulate)(MAC)ユニット542、544、およびフィックスアップ(FIX−UP)ロジック546を含む。レジスタ532はYメモリ522の出力に接続されていて“A”部および“B”部を有し、Yメモリ522から出力される16ビットワードデータの上位および下位バイトをそれぞれ格納する。同様に、レジスタ534はXメモリ524の出力に接続されており、“C”部および“D”部を有し、Xメモリ524から出力されるデータの16ビットワードの上位および下位バイトをそれぞれ格納する。MUX540はA、B、C、およびDレジスタの出力に接続された入力と、4つの出力とを有する。MUX540は完全4×4MUXであり、パック算術演算を実行する際に有効である。これについては以下に詳述する。MAC542は、MUX540の第1および第2出力端子に接続された第1および第2入力端子と、40ビットの出力端子とを有する。MAC544は、MUX540の第3および第4出力端子に接続された第1および第2入力端子と、40ビットの出力端子とを有する。以下に詳述するように、MAC542と544とはそれぞれ、選択可能な飽和モードを有しており、2つの周知の信号処理に対する異なる飽和条件(different saturation assumption)に対応する。
ALU530は、フィックスアップロジック546回路を含む。この回路は、MAC542の出力端子に接続された第1の入力端子、MAC544の出力端子に接続された第2の入力端子、および、rd値を供給するためにインターフェース210に接続された出力端子を有する。より詳細には、フィックスアップロジック546は、“ACC0”とラベル付けされた下位の16ビット部548と、“ACC1”とラベル付けされた上位の16ビット部550とを有するアキュムレータを含む。アキュムレータ部548および550は、別々の部位として図示されている。その理由は、これらの部位はパックオペレーションを実行したときに別々の結果を格納することになるからである。
しかし、フル32ビット演算を実行したときに、その結果の下位部分はアキュムレータ548に格納され、上位部分はアキュムレータ550に格納されることになる。フィックスアップ回路546は、命令によって定義されるように、規格化、スケーリング、ラウンディング、および飽和を行う。
図4および図5を併せて考察すると、データ処理システム200は、効率的な信号処理ルーチンの一環として使用することができる様々なコプロセッサ命令を実行することが明らかであろう。第1の命令は、いわゆるドット積(dot product)タイプの命令である。ドット積命令は、第1リスト中の値の各々を第2リスト中の対応する値で掛け、その積を合計する。よって、例えば、DSPリストコプロセッサ500は、RISCプロセッサコア300に対する混乱(disruption)を最小限に抑えた状態でFIRフィルタ計算を効率的に実行することができる。RISCプロセッサコア300上で実行中のコードは、MTYH_REAL32命令などの、新たなデータサンプルをYメモリ522中に保持しているリストに送る命令を実行し、ドット積オペレーションを開始する。まず、DSPリストコプロセッサ500は、ヘッドポインタYHをインクリメント(increment)し、そこにデータサンプルを格納するとともに、テールポインタYHをインクリメントし、最も古いデータサンプルを取り除くことによって、リストにデータサンプルを追加する。次に、アドレスポインタADDRESSSBとADDRESSSAとを用いて、Xメモリ524から係数とデータメモリ522から対応するデータサンプルとをそれぞれ読み出し、これらをレジスタ532と534とにそれぞれ格納する。MUX540はオペランドをMACユニット542および544のうちの1つに送る。ここで乗算が行われる。このシーケンスは、残りの係数とリスト中のデータ値を通して、LENGTHに到達するまで継続して行われる。次に、この結果はフィックスアップロジック546に送られ、適切なラウンディングと飽和が行われる。DSPリストコプロセッサ500にリストメモリを保持することで、データプロセッサ200は、外部メモリアクセスをほとんど必要としないやり方で、RISCプロセッサコア300とDSPリストコプロセッサ500とを容易に一体化することができる。さらに、追加される新たなオペランドのリストへの送信と、新たな演算の計算の開始とを同時に始めることができる。
システム200の重要な特徴として、DSPリストコプロセッサ500がドット積演算を開始するために、MTYH_REAL32などの1つのINSTRUCTIONに応答可能な点、および、その結果を引き出し、結果を汎用レジスタに格納するために、MFXH1などの別のINSTRUCTIONに応答可能な点が挙げられる。よって、ソフトウェアコンパイラは、DSPリストコプロセッサ500が長いドット積演算を実行する間に、RISCマイクロプロセッサコア300に有益な作業を継続して行わせることができる。パイプラインをストールさせるためにINSTRUCTION(MTYH_REAL32)の開始は許可されず、一方で、INSTRUCTION(MFXH1)を終了させることはその結果がまだ準備できていなければパイプラインをストールさせてしまう。よって、効率的なコンパイラでは、コプロセッサレイテンシに関連づけられる無駄なサイクルを回避すべく、この両方の命令を使用することができる。
別の重要なフィーチャとして、DSPリストコプロセッサ500は、2つの別々のMACを含むことが挙げられる。各々のMACは、別々のラウンディングと飽和条件に対応するよう選択可能である。そのうちの1つに32ビット飽和モードがあり、これはETSI(欧州電気通信標準化機構)演算として周知である。32ビットの飽和モードでは、DSPリストコプロセッサ500は結果の一部を32ビットに飽和する。別のモードに、40ビット飽和モードがある。40ビットの飽和モードにおいては、DSPリストコプロセッサ500は結果の一部を40ビットのアキュムレータに蓄積し、計算が終わると最終の合計を32ビットに飽和する。これらの2つの技術は時折異なる結果をもたらすことがある。また、DSPリストコプロセッサ500はこれらの2つのアルゴリズムの各々に対するビットの正確性を保持する。さらに、他の実施形態では、DSPリストコプロセッサ500の更なる選択可能ラウンディングモードと飽和モードをサポートすることができる。これらの選択可能モードは、グラフィックス変換、画像処理、および暗号文などのアプリケーションに有用な、必ずしも線形とは限らない、広範な数学的表現をサポートすることができる。
さらに別の重要な特徴として、いわゆる、シリアルMACモードがある。多くのDSPアルゴリズムにおいて、1つのMAC命令の直後に別のMAC命令が行われる。そのような状況では、MACの結果を32ビットに飽和するのは望ましなく、むしろ、第1のMAC30命令の飽和されていない40ビットの結果を、第2のMAC命令の飽和されていない40ビットの結果と組み合わせることが望ましい。DSPリストコプロセッサ500は、デュアルマルチプライアキュムレート(DMAC)命令を用いて、この種類のオペレーションを効率的に供給する。フィックスアップロジック546は、結果を32ビットに飽和する前に、MACユニット542と544からの2つの40ビットの結果を組み合わせる。
2つのMACを備えることで、DSPリストコプロセッサ500は効率的にパック演算を実行することができる。例えば、オペランドを、2つの16ビットのオペランドか4つの8ビットのオペランドのどちらか一方として処理することができる。この2つのMACにより、2つの独立した乗算を同時に進行することができる。
さらに、DSPリストコプロセッサ500は、命令のフルコンポーネントを含む。これには、特定のリストおよびパック演算オペレーションにも有益な、標準のALUおよびオペランド移動命令を含む。リストの長さを設定するために、ムーブトゥーレングスレジスタ(MTL)命令を使用して、rd信号線上の値をインターナルLENTGHレジスタに移動させることができる。
よって、本文に説明するデータプロセッサは、効率的な信号処理を実行する。データプロセッサは周知のデータプロセッサを越える多くの利点を供給する。第1に、本文のデータプロセッサは、単一の大きなメモリプールのメモリ管理、大きな一連の汎用レジスタ、汎用命令、RISCのハーバードアーキテクチャ、および、制御フローを含む、汎用RISCプロセッサの機能を利用する。
第2に、DSPオペレーション用の専用回路を有した特殊用途のコプロセッサを含むことで、データプロセッサは、より効率的にDSP機能を実行しつつ、一方では消費電力を低くする。
第3に、特定のエンジンのフェッチ、ストア、コンフリクト、例外などを必要としないことで、DSPリストコプロセッサはRISCパイプラインを混乱させない。
第4に、サイズの違う2つの異なるMACユニットを提供することで、データプロセッサは、ETSI標準演算あるいはAMDスタイルの演算の使用有無に関わらず、DSPアルゴリズムのビットの正確性(bit accuracy)をプログラマーに維持させることができる。
第5に、データプロセッサは、RISCプロセッサコアのために存在する、非常に進んだコンパイラ技術を利用し、アセンブリやC言語コードとしてラインに含まれ得る低レベルおよび高レベルのマクロを供給する。
第6に、DSPリストコプロセッサは、DSPオペレーションで頻繁に使用されるオペランドを格納するための相対的に小さなローカルリストメモリを含む。データプロセッサは、相対的に高い電力費でメインメモリから一旦これらのオペランドをフェッチし、その後、これらのオペランドを相対的に低電力費でDSPリストコプロセッサ内において繰り返し使うことができる。
第7に、レングシーDSPオペレーションに開始命令と終了命令の双方を利用できるようにすることで、データプロセッサは、CPUのパイプラインに、DSPリストコプロセッサのパイプラインと並行して動作を継続させることができ、結果がまだ利用できなければ、CPUのパイプラインだけを後でストールさせる。
第8に、DSPリストコプロセッサはスケーラブルなALUを有する。例示の実施形態では、DSPリストコプロセッサは2つのMAC装置を含むが、MAC装置数は1つだけに減らしてもよいし、異なる設計上のトレードオフを満たすような数、例えば4つ、まで増やしてもよい。
第9に、データプロセッサは、FIRフィルタおよび畳み込みなどのDSPオペレーションに特に効率的な、リストベースのメモリアーキテクチャを使用する。このアーキテクチャにより、インターナル(内部)リストメモリが実質的に再利用され、メインメモリから新たなデータをロードする必要性を減らされ、これが電力の節約と処理の効率性につながる。
第10に、DSPリストコプロセッサは、異なるオペランド長とフォーマットとをサポートし、これにより効率的にDSP計算を行うことができる。したがって、例えば、DSPリストコプロセッサは、単一ドット積、2つの並行なドット積あるいは単一の複雑なドット積を計算することができる。
第11に、データプロセッサは都合よくパック演算をサポートする。したがって、データプロセッサは既存の32ビットのレジスタインターフェースをうまく利用し、DSPリストコプロセッサが2つの16ビットサイズのDSP変数(2つの実数か1つの複素数のいずれか)をDSPリストコプロセッサのリストメモリに同時にロードできるようにする。
第12に、データプロセッサのアーキテクチャは、リストメモリの構成を通じてコンテキストスイッチング(context switching)を簡単にサポートする。したがって、このアーキテクチャは、コンテキストスイッチングに関連付けられた通常のオーバーヘッドを回避すべく、ハードウェアにおいてマルチプルコンテキストをサポートするよう拡張可能である。
第13に、データプロセッサはさらに、DSPリストコプロセッサによって実行可能な、リッチ(rich)な一連の命令を提供することで、処理時間と電力消費の点から、RISCプロセッサコアの全体のパフォーマンスを最適化し、有益な機能を実行する。このような機能の例において、特定の範囲内にアドレスをラッピングし、DSPリストコプロセッサ内のリストにロードされた入力アレイから自己相関アレイを求める。当業者にとっては、多くのその他の有益な機能が、上述の命令セットから明らかであろう。
これまでの詳細な記述では、少なくとも1つの実施形態が示されているが、当然、膨大な数の変形が存在する。さらに、当然、例示の実施形態は単なる例にすぎず、本発明の範囲、適用性、あるいは構成を何ら限定するものではない。むしろ、これまでの詳細な記述は例示的実施形態を実装するために好都合なロードマップを当業者たちに与えることになるであろう。添付の特許請求の範囲に記載した本発明の範囲およびその法律上の均等物から逸脱することなく、構成要素の機能および配置を様々に変更することが出来る点に留意されたい。