(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-03-03
(45)【発行日】2023-03-13
(54)【発明の名称】コンピューティング装置
(51)【国際特許分類】
H04L 69/06 20220101AFI20230306BHJP
G01R 13/20 20060101ALI20230306BHJP
G01R 13/28 20060101ALI20230306BHJP
【FI】
H04L69/06
G01R13/20 M
G01R13/28 J
G01R13/28 Z
【外国語出願】
(21)【出願番号】P 2018082523
(22)【出願日】2018-04-23
【審査請求日】2021-04-07
(32)【優先日】2017-04-24
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2017-04-24
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2018-04-09
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】391002340
【氏名又は名称】テクトロニクス・インコーポレイテッド
【氏名又は名称原語表記】TEKTRONIX,INC.
(74)【代理人】
【識別番号】100090033
【氏名又は名称】荒船 博司
(74)【代理人】
【識別番号】100093045
【氏名又は名称】荒船 良男
(74)【代理人】
【識別番号】110001209
【氏名又は名称】特許業務法人山口国際特許事務所
(72)【発明者】
【氏名】マーク・アンダーソン・スミス
(72)【発明者】
【氏名】マイケル・スコット・シリマン
(72)【発明者】
【氏名】アンドリュー・ルーフバロウ
(72)【発明者】
【氏名】エリック・ティ・アンダーソン
【審査官】佐々木 洋
(56)【参考文献】
【文献】特開2003-216668(JP,A)
【文献】国際公開第2013/141290(WO,A1)
【文献】特開2010-198363(JP,A)
【文献】特開2002-366596(JP,A)
【文献】特開2016-081397(JP,A)
【文献】Manchester Encoder-Decoder for Xilinx CPLDs,2002年10月01日,pp. 1-6,https://www.xilinx.com/support/documentation/application_notes/xapp339.pdf
(58)【調査した分野】(Int.Cl.,DB名)
H04L 69/06
G01R 13/20
G01R 13/28
(57)【特許請求の範囲】
【請求項1】
ライン・コード化物理的信号を受ける物理的チャンネル入力部と、
宣言型言語定義から生成された構文木(syntax tree)を記憶するメモリと、
該メモリと動作可能に結合され、上記構文木にアクセスし、上記ライン・コード化物理的信号から時間及びエッジ・データを抽出し、上記構文木の状態に基づいて抽出された上記時間及びエッジ・データを用いてビットストリームに関するビット値を生成するよう構成されるプロセッサと
を具える試験及び測定に適したコンピューティング装置。
【請求項2】
上記プロセッサが、更に、
上記宣言型言語定義内の
開始及び終了イベント定義に基づいて上記ビットストリームから
開始及び終了イベントを抽出し、
抽出された上記
開始及び終了イベントに基づいて上記構文木を用いて上記ビットストリームについてのパケット・フレームを生成するように構成される請求項1のコンピューティング装置。
【請求項3】
上記プロセッサが、更に、
上記宣言型言語定義内のフィールド定義に基づいて、生成された上記パケット・フレーム内にフィールドをマッピングし、
マッピングされた上記フィールドに基づいて、上記構文木を用いて上記ビットストリームについてのパケットを生成するよう構成される請求項2のコンピューティング装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、物理的な入力信号のプロトコルに関係なく、構文木を用いて、物理的な入力信号をビットストリームへ変換するコンピューティング装置に関する。
【背景技術】
【0002】
ネットワーク通信では、物理媒体を介して受信された全てのデータは、最初に、その物理的レイヤ上のライン・コーディングからデコードされ、次いで、トランスポート、セッション又はアプリケーション・レイヤのような、より高いレベルのレイヤでの使用のために適切に変換されたビットストリームを出力するのに、そのデータ・リンク及びネットワーク・レイヤにおける特定のネットワーク・プロトコルに基づいて、更にデコードされなければならない。このデコード処理は、試験測定装置において、装置によって出会った各プロトコル形式に関して特別に記述されたプロトコル・デコーダとして、これまで実装されてきた。
【先行技術文献】
【特許文献】
【0003】
【文献】特開2011-117967号公報
【文献】特開2016-035460号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかし、C又はPythonのような従来のチューリング完全言語を、プロトコル・デコーダに書いて用いるのは、時間がかかり、エラーが発生しがちである。プロトコル記述言語において正規表現を用いる問題を解決しようとする従来の試みは、多数の困難に遭遇してきた。例えば、いくつかのプロトコルの仕様は、従来の宣言型言語で表現するには、あまりに複雑過ぎる。加えて、従来の宣言型言語の文法は、最初のパケット・フレーム化(フレーミング)ステップのような、必要なプロトコルの仕様の全てを記述するには不十分なことがある。こうした理由のために、物理的な信号及びビットストリームのデコード処理は、典型的には、イーサネット・トラフィックのような、同様なプロトコル・スイートのファミリーに限定されている。同様に、プロトコル・アナライザは、特定のプロトコル用に設計及びコード化されており、これによって、その能力が、入力される多様な信号に渡って動作する柔軟性に関して制限されている。
【課題を解決するための手段】
【0005】
以下では、本願で開示される技術の説明に有益な実施例が提示される。この技術の実施形態は、以下で記述する実施例の1つ以上及び任意の組み合わせを含んでいても良い。
【0006】
実施例1としては、試験及び測定に適したコンピューティング装置があり、ライン・コード化物理的信号を受ける物理的チャンネル入力部と、宣言型言語定義から生成された構文木(syntax tree)を記憶するメモリと、該メモリと動作可能に結合され、上記構文木にアクセスし、上記ライン・コード化物理的信号から時間及びエッジ・データを抽出し、上記構文木の状態に基づいて抽出された上記時間及びエッジ・データを用いてビットストリームに関するビット値を生成するよう構成されるプロセッサとを具えている。
【0007】
実施例2としては、実施例1の態様があり、このとき、上記プロセッサが、更に、上記宣言型言語定義内のイベント開始及び終了定義に基づいて上記ビットストリームから時間マーカを抽出し、抽出された上記時間マーカに基づいて上記構文木を用いて上記ビットストリームについてのパケット・フレームを生成するように構成される。
【0008】
実施例3としては、実施例1及び2の態様があり、このとき、上記プロセッサが、更に、上記宣言型言語定義内のフィールド定義に基づいて、生成された上記パケット・フレーム内にフィールドをマッピングし、マッピングされた上記フィールドに基づいて、上記構文木を用いて上記ビットストリームについてのパケットを生成するよう構成される。
【0009】
実施例4としては、実施例1、及び3の態様があり、このとき、上記プロセッサが、更に、エラー対処定義に基づいて上記構文木を用いてパケットを検証するよう構成される。
【0010】
実施例5としては、実施例1及び2の態様があり、このとき、上記イベント開始及び終了定義は、フィールド・デバイス・アクセス及びデバイス記述言語ライブラリから得られる。
【0011】
実施例6としては、実施例1の態様があり、このとき、上記宣言型言語定義は、ライン・コード・エンコーディング・ライブラリから得られる。
【0012】
実施例7としては、実施例1の態様があり、このとき、上記プロセッサが、更に、上記宣言型言語定義からの上記構文木をコンパイルするよう構成される。
【0013】
実施例8としては、実施例1の態様があり、このとき、上記構文木が第1メモリに記憶され、上記宣言型言語定義が第2メモリに記憶される。
【0014】
実施例9としては、構文木を用いて物理的な入力信号を解釈する方法があり、宣言型言語定義を読み出す処理と、上記宣言型言語定義に基づいて上記構文木をコンパイルする処理と、上記構文木のノードを用いて上記物理的な入力信号のライン・コード・エンコーディングをデコードすることによって、上記物理的な入力信号をビットストリームへ変換する処理とを具えている。
【0015】
実施例10としては、実施例9の態様があり、イベント開始及び終了定義に基づいて、上記構文木を用いて上記ビットストリームについてのパケット・フレームを生成する処理を更に具えている。
【0016】
実施例11としては、実施例9及び10の態様があり、このとき、フィールド定義に基づいて、上記構文木を用いて上記ビットストリームについてのパケットを生成する処理を更に具えている。
【0017】
実施例12としては、実施例9、10及び11の態様があり、このとき、エラー対処定義に基づいて上記構文木を用いてパケットを検証する処理を更に具えている。
【0018】
実施例13としては、実施例9、10及び11の態様があり、このとき、メディア・ファイルを出力するため、トークン交換を用いて上記ビットストリームのパケットからペイロードを抽出する処理を更に具えている。
【0019】
実施例14としては、実施例9及び10の態様があり、このとき、上記イベント開始及び終了定義は、フィールド・デバイス・アクセス及びデバイス記述言語ライブラリから得られる。
【0020】
実施例15としては、実施例9の態様があり、このとき、上記宣言型言語定義は、ライン・コード・エンコーディング・ライブラリから得られる。
【0021】
実施例16としては、コンピュータ・プログラムがあり、これは、試験及び測定に適したコンピューティング装置中のプロセッサで実行されたときに、上記コンピューティング装置に、ビットストリーム定義、イベント定義及びフィールド定義の中の1つ以上を含むプロトコル宣言に基づいて構文木をコンパイルさせ、物理的な信号を受けるようにさせ、上記構文木を用いて上記物理的な信号をビットストリームにデコードさせる。
【0022】
実施例17としては、実施例16の態様があり、このとき、更に、上記ビットストリーム定義を供給するために、上記コンピューティング装置に、ライン・コード・エンコーディング・ライブラリを利用させる。
【0023】
実施例18としては、実施例16の態様があり、このとき、更に、上記イベント定義を供給するために、上記コンピューティング装置に、フィールド・デバイス・アクセス及びデバイス記述言語ライブラリを利用させる。
【0024】
実施例19としては、実施例16の態様があり、このとき、更に、上記フィールド定義を供給するために、上記コンピューティング装置に、フィールド・デバイス・アクセス及びデバイス記述言語ライブラリを利用させる。
【0025】
実施例20としては、実施例16の態様があり、このとき、上記プロトコル宣言は、標準的なネットワーク・プロトコルに基づいている。
【0026】
実施例21としては、実施例16の態様があり、このとき、上記プロトコル宣言は、カスタム・ネットワーク・プロトコルに基づいている。
【0027】
実施例22としては、実施例16の態様があり、このとき、更に、メディア・ファイルを出力するために、上記コンピューティング装置に、トークン交換を用いて上記ビットストリームのパケットからペイロードを抽出させる。
【図面の簡単な説明】
【0028】
【
図1】
図1は、本発明の実施形態による例示的な試験測定システムのブロック図である。
【
図2】
図2は、プロトコル宣言に基づいてコンパイルされた構文木を用いて、物理的な入力信号をパケット化ビットストリームに変換する本発明の実施形態による方法のブロック図である。
【
図3】
図3は、本発明の実施形態による、3つのステージを有する例示的な構文木のデコード処理のブロック図である。
【
図4】
図4は、プロトコル宣言からの異なるビットストリーム定義を用いて、例示的な構文木デコード処理の第1ステージにおいて、物理的な入力信号の未加工のビットストリームへの変換を示す、本発明の実施形態による時間プロットである。
【
図5】
図5は、イベント検索及びフィールド・マッピング・ステージ中に、パケット・フレーミング及びフィールド・データを抽出するのに、LINプロトコルに基づくプロトコル宣言を利用する、本発明の実施形態による例示的な構文木デコード処理のブロック図である。
【
図6】
図6は、複数の物理的な入力信号をフレーム化パケット・ビットストリーム・データに変換するのに、I2Cプロトコルに基づくプロトコル宣言を利用する、本発明の実施形態による例示的な構文木デコード処理のブロック図である。
【
図7】
図7は、本発明の実施形態による例示的な処理及びデータ・フローのブロック図である。
【発明を実施するための形態】
【0029】
本説明は、例えば、抽象構文木(abstract syntax tree)のようなコンパイラで生成された構文木(syntax tree)用いて、任意の通信又はネットワーク・プロトコルによる物理的な信号をデコードするシステム及び方法を開示する。試験測定システム内において、ドメイン固有宣言型言語(domainspecific declarative language)は、宣言型言語の定義を用いて、シリアル、ネットワーク、又は通信プロトコルの特性をテキストで特定できる。宣言型言語で書かれたプロトコル宣言(protocol declaration)を実行する場合、プロセッサは、テキストで規定されたビットストリーム、イベント及びフィールドの定義に基づいて、プロトコル宣言を構文木に分解(parse)する。構文木自身は、サンプルされたデータの物理的な入力信号を、トランスポート、セッション又はアプリケーション・レイヤのような、より高いレベルのレイヤで使用するプロトコル固有の出力ビットストリームに変換するステート・マシーンとして機能できる。構文木におけるノードは、構文木を複数回繰り返すことができるように、再利用可能なステート・マシーン・コンポーネントとするか、再利用可能なステート・マシーン・コンポーネントとして機能しても良い。
【0030】
エラーが生じがちで多くのデバッグを必要とするハイレベルの命令型(imperative)プログラミング言語で記述される完全なプロトコル・デコーダ・プログラムを必要とする従来のシステムと異なり、本開示の宣言型言語は、多数の異なるプロトコル間の基本的な構造的共通性を用いた単純化された要素を使用して、プロトコル宣言の定義及び評価を可能にする。このとき、従来のシステムがコード・クラッシュ及びメモリの問題を抱えていたとしても、本願で開示される最小宣言型言語セットによれば、プロトコル宣言の著者がメモリ又はメモリ・アロケーション・コールへ直接アクセスできないので、安全性と効率性の両方を備えた任意の物理レイヤのビットストリーム評価が可能である。このように、宣言型言語上のこれら制約のために、プロトコル宣言の著者が非安全なカスタム・ビットストリームを書いてしまうのを防止できる。
【0031】
文字で指定されたプロトコル宣言(これは、ビットストリーム、イベント及びフィールド定義を含んでも良い)に基づいて、パーサが、デコーダ又はプロトコル固有のデコード・マシーン中に、構文木のステート・マシーン・コンポーネントをアセンブルする。言語インタープリタ(interpreter)と同様に、デコーダは、以下で詳細に説明するように、物理的な信号中に認識されたエッジをエッジ・データ・セットに集めて、未加工のビットストリームに変換することも含めて、構文木の各ノードで入力データの値を求めることによって実行する。構文木の実行は、適切な入力プロトコル伝送を記述するフィールドを有するフレーム化パケットのコレクションも出力できる。よって、シンプルな定義のセットを用いて、宣言型言語は、非常に柔軟で、多種多様なシリアル・プロトコルをデコードするのに利用できる。
【0032】
宣言型言語は、プロトコル宣言を文字で指定するのに、例えば、以下の要素のいずれか又は全てを利用しても良く、これらは、以下で更に詳細に説明される:
(1)ビットストリーム定義
(2)イベント定義
(3)複雑なイベント定義
(4)イベント時間組み入れ/除外トークン
(5)条件に応じて調査の節(scoped if clauses)
(6)任意ビット・スタッフィング・ルール定義
(7)パケット定義の任意セクション内の調査領域
(8)フィールド・マッチング・ルール
(9)フィールド量化ルール
(10)フィールド入れ子処理及びグルーピング処理
(11)フィールド・プロパティ
(12)フィールド・アクション定義
(13)任意CRC多項式定義
(14)エラー及びCRCフィールド・シーケンス定義
【0033】
例示的な実施形態は、上記の例示的な要素、他の潜在的な要素及び結果として生じる構文木を用いて、宣言型言語のいくつかのユニークなプロパティを組み合わせ、任意のシリアル、ネットワーク又は通信プロトコルをデコードするのに利用可能な、ある程度の一般化を提供する。宣言型言語でコード化された定義は、通信ハードウェアが、組み込まれた特定のプロトコルに関係なく、物理的な信号及びそのエンコードされたデータを変換又はデコードするのを可能とし、このプロトコルとしては、データ・リンク・プロトコル(例えば、イーサネット、ポイント・トゥ・・ポイント(PPP)、ハイレベル・データ・リンク・コントロール(HDLC)、アドバンスト・データ・コミュニケーション・コントロール・プロシージャ(ADCCP))はもちろん、標準の又はカスタマイズされたライン・コード(伝送路符号)エンコーディング(例えば、NRZ、マンチェスタ)を含めることができる。
【0034】
上述のように、プロトコル宣言は、ビットストリーム定義、イベント定義及びフィールド定義を含んでいても良い。ビットストリーム定義は、アナログ又は物理的な入力信号を、1及び0からなるバイナリ・ビットストリームにどのようにして変換するかを定義する。 イベント定義は、パケット・フレームの範囲をどのようにして検出又は生成するかを定義する。最後に、フィールド定義は、例えば、ヘッダ、フッタ、プロパティ、特性(characteristics)、アクション、フラグ付加処理、エラー対処処理などを含めて、ビットストリームの値を、どのようにしてパケットにマッピング又はマッチングさせるかを定義する。
【0035】
具体的には、本開示の宣言型言語は、限定的な調査、ドメイン固有の文法を利用して、アナログの物理的な信号のビットストリーム・シーケンスへの変換を定義できる。アナログ信号は、例えば、試験プローブによって取り込んでも良い。この変換されたビットストリーム・シーケンスは、次いで、追加的なプロトコルの構文解析(parsing)に利用されても良い。このように、プロトコル宣言の著者は、プログラマである必要はなく、代わりに、比較的少ない言語要素のセットを学ぶだけで良い。物理的な入力信号を変換するための新しいビットストリーム定義を、その基礎となるランタイム・エンジンを変更することなく生成でき、これは、従来のシステムでは必要となるデバイス又は装置のファームウェアの変更を必要とせずに、これらのビットストリーム定義及び機能の展開を可能にする。
【0036】
宣言型言語は、一般的な式の値を求める処理、変数宣言及び代入をサポートし、よって、入力についての任意の数学的及びブール演算が可能となる。更に、式の値を求める処理では、例えば、ブール、整数、浮動小数点及び現在エッジ値のようなデータ形式を許容する。
【0037】
図1は、プロセッサ14と、宣言型言語定義を格納するメモリ16を含む例示的な試験測定システム10を示す。試験測定システム10には、物理的な媒体入力ライン20を通して物理的な信号を受ける入力端子18がある。この物理的な信号は、例えば、電圧、無線周波数又は赤外線光のような任意の既知の物理媒体を用いて伝送されても良い。試験測定システム10には、システム10と一体(図示のように)でも良いし、又はシステム10の外部でも良いユーザ・インタフェース22があっても良い。プロセッサ14内か又はプロセッサ14に結合されたパーサ(parser:構文解析器)40は、プロトコル宣言の著者によってコード化され、メモリ16に記憶された宣言型言語定義を使用して、構文木をコンパイルする。当業者には理解されるように、パーサ40は、コンパイラやレクサ(Lexer:字句解析器)を含んでも良いし、これに代えて、パーサの代わりにコンパイラやレクサであっても良い。更に、プロセッサ14は、入力端子18においてシステム10に入力された物理的な入力信号に対して構文木を実行する。構文木の実行は、プロトコル宣言の定義を利用して、入力端子18におけるデータをビットストリームに変換し、これは、試験測定システム10において更に処理されても良いし、出力ライン24を通して出力されても良い。
【0038】
図2は、宣言型言語で書かれた任意のビットストリーム定義102、イベント定義202及びフィールド定義302に基づいて、プロセッサ14がパーサ40を使ってどのようにメモリ16に格納されたプロトコル宣言30を実行して、構文木60をコンパイル又は構築するかを示す。プロセッサ14(
図1)は、構文木60を利用して、物理的な入力信号50の値を求めて、ビットストリーム70を出力する。
【0039】
図3は、プロセッサ14が宣言型言語で書かれたプロトコル宣言をどのように利用して、物理的な入力信号50をデコードできるかを示す。この処理には、3つの主要な要素があり、これらは、構文木60による次のデコード処理のステージに対応している:(1)プリアンブル・ステージ100、ここでは、プリアンブルが物理的な入力信号50の個数を定義し、これらをプロトコル宣言30(
図2)中のビットストリーム定義102を用いて、どのように未加工(raw:ロー、生)のビットストリーム70へ変換するかを定義する;(2)イベント探索ステージ200、ここでは、プロトコル宣言30中のイベント定義202を用いて、フレーム化ビットストリーム・データ80を出力するために、どのようにしてパケット・フレームの最初と最後を見つけるかを複数のルールで定義する;(3)フィールド・マッピング・ステージ300、ここでは、プロトコル宣言30中のフィールド定義302を用いて、パケット90を生成するためのフィールド構造が特定のパケット形式内で定義される。
【0040】
図2~3を参照すると、プリアンブル・ステージ100では、プロセッサ14やパーサ40は、構文木60をコンパイルし、プロトコル宣言30内のビットストリーム定義102を用いて、物理的な入力信号50を未加工(生)のビットストリーム70へ変換する。ビットストリーム定義102は、アナログ信号を、0と1からなるバイナリ・ビット・シーケンスに変換する標準的な物理レイヤの手法を特定しても良い。実施形態によっては、ビットストリーム定義102が、カスタム又はドメイン固有宣言型言語を用いて書かれていても良く、これは、転送されるデータにセキュリティを付加できる。しかし、別の実施形態では、ビットストリーム定義102が、標準的なライン・コード・エンコーディング・プロトコルを用いて書かれても良く、これらは、ライン・コード・エンコーディング・ライブラリに格納されていても良い。標準的なライン・コード・エンコーディング・プロトコルは、例えば、C言語のような標準的なチューリング完全プログラミング言語で書かれていても良い。
【0041】
プロセッサ14がプリアンブル・ステージ100中に構文木60を実行するときに、物理的な入力信号50を未加工のビットストリーム70へ変換することによって、物理的な入力信号50をパケットのデコード処理に使えるようにする。プロセッサ14は、プロトコル宣言30のビットストリーム定義102に基づいて、構文木60のノードを用いて、物理的な入力信号50を、未加工のビットストリームを表すもの又は値に変換する。プロセッサ14は、このビットストリーム変換を、プロトコル宣言30内の予め定義したビットストリーム定義102を直接コールすることによって実行できる。
【0042】
プリアンブル・ステージ100の間、プロセッサ14は、また、実施形態によっては、物理的な入力データについて付加的な計算を実行し、その後の論理ベースの判断に関する任意の設定の状態をチェックしても良い。プリアンブル・ステージ100では、その後のステージのイベント検出及びフィールド・マッピング工程において使用される中間的な計算として、標準的な表現の評価及び変数割り当てがサポートされる。
【0043】
イベント探索ステージ200では、構文木60がプロトコル宣言30中のイベント定義202を利用して、ビットストリーム70内のパケット・フレームの最初と最後のビットを見つけ、フレーム化ビットストリーム・データ80を出力する。
【0044】
フィールド・マッピング・ステージ300では、構文木60がプロトコル宣言30中のフィールド定義302を利用して、フレーム化ビットストリーム・データ80の各フレーム内の種々のフィールドの夫々を定め、パケット・ビットストリーム・データ90を出力する。
【0045】
図4は、更に、
図3のプリアンブル・ステージの間に、物理的な入力信号450を異なるビットストリーム470a~cへ変換するのに、プロトコル宣言30内の種々のビットストリーム定義102をどのように利用できるかを時間プロット上で示す。
図4の時間プロットの領域1000中の特定の単一の物理的な入力信号450を用いて、プロセッサ14は、領域1100のビットストリーム定義を利用して、ノン・リターン・トゥ・ゼロ(NRZ)のライン・コード・エンコーディングに基づいて、物理的な入力信号450をビットストリーム470aへ変換する。プロトコル宣言30内において、領域1100のビットストリーム定義は、次のように書くことができる:
bitstream A = nrz(data);
ここで「A」は、ビットストリーム変換関数の結果を含む変数を表し、「nrz()」は、メモリに格納された所定の関数であり、「data」は、物理的な入力信号450のサンプルされたデータを表す変数である。
図4に示すように、領域1000の物理的な入力信号450は、領域1100のビットストリーム470aに重ねられ、その複数のエッジは、規則的な時間インターバルと合致していることが示され、時間インターバルにおいて、物理的な入力信号450は、領域1100のビットストリーム定義の下で、その値に基づいて判断される。
【0046】
同様に、領域1200において、プロセッサ14は、領域1000の同じ物理的な入力信号450から、異なるビットストリーム470bを出力するのに、領域1200のビットストリーム定義に基づくが、これは、次のように書くことができる:
bitstream A = NRZM(data);
ここで「A」は、再度、ノン・リターン・トゥ・ゼロ・マーク・エンコーディングをデコードするための所定の関数に基づいて算出されたビット値のシーケンスを表し、NRZM()は、上述のように、ライン・コード・エンコーディング・ライブラリの予め定義され、格納された部分であっても良く、また、どのようにこの関数が所与の「data」、つまり、物理的な入力信号450について解くかであっても良い。
図4に示すように、領域1000の物理的な入力信号450が領域1200のビットストリーム470bに重ねられ、その複数のエッジは、規則的な時間インターバルの中央にあることが示され、時間インターバルの間に、領域1200のビットストリーム定義の下、物理的な入力信号450が、ロー(Low:低)からハイ(High:高)又はハイ(High:高)からロー(Low:低)へと遷移したかに基づいて評価される。
【0047】
領域1100と1200のビットストリーム定義は、ビットストーム定義102が、標準的なライン・コード・エンコーディング・プロトコルに基づくものであり、これは、ライン・コード・エンコーディング・ライブラリで参照できると共に、格納できるものであり、また、異なるビットストリーム定義102は、異なるビットストリーム470a~cを生じることを示す。これに代えて、ビットストリーム定義102が、特定のドメイン用にカスタマイズされても良く、これは、転送されたデータのセキュリティに追加することもできる。
【0048】
カスタム・ビットストリーム定義102は、宣言型言語構文のサブセットを用いて定義できる。このサブセットだけを用いて、物理的な入力信号50のビットストリーム70への(即ち、物理レイヤのデータ・リンク・レイヤへの)解釈に関するルールを定義できる。カスタム・ビットストリーム定義102は、構文木60にコンパイルしても良い。次いで、プロセッサ14は、物理的な入力信号50の構文木60を実行して、ビットストリーム出力70を生成する。カスタム・ビットストリーム関数について使用された文法のサブセットは、変数宣言、変数インクリメント/ディクリメント演算子、代入ステートメント(assignment statement)、静的マップ定義、条件に応じて調べる節(scoped if clause)及びイールド・ステートメント(yield statement)を含んでいても良い。
【0049】
領域1300のビットストリーム定義は、プロセッサ14に物理的な入力信号450をビットストリーム470cとして評価させるもので、宣言型言語を用いて書かれた、こうしたカスタマイズしたビットストリーム定義の例である。領域1300のカスタム・ビットストリーム定義は、プロトコル宣言30自身内で定義しても良いし、又は、単純に、プロトコル宣言30内で参照されて、どこか別の場所に格納されても良い。例えば、もしプロトコル宣言30内で参照されるなら、領域1300のビットストリーム定義は、領域1100及び1200のビットストリーム定義と同様に、所定関数を参照する次の式として書くこともできる:
ビットストリームA=getbits(data)
ここで「A」は、変換されたビットストリーム・データを表す変数であり、「getbits()」は、任意のユーザ定義関数であり、「data」は、領域1000の物理的な入力信号450である。別の例として、領域1300のユーザ定義カスタム・ビットストリーム定義は、プロトコル宣言30内に直接定義することもでき、次のようにSENTバス・プロトコルに基づいても良い:
bitstream getbits(pin data) {
bool isFall = false;
double pw = 0.0; double start = 0.0; double end = 0.0; double zeroWidth = 0.0;
double t1 = 0.0; double t2 = 0.0; double t3 = 0.0; double dataWidth = 0.0;
double lowerWidthBound = 0.0; double upperWidthBound = 0.0;
double UT = env.getvalue(“ut”, 0.000003);
if(UT<0.000003) { UT = 0.000003; }
if(UT>0.000010) { UT = 0.000010; }
int bit0 = 0; int bit1 = 0; int bit2 = 0; int bit3 = 0; int nibble = 0;
isFall = data == 0;
start = pintime(data);
end = pintime(data[2]);
pw = end ? start;
zeroWidth = 12.0 * UT;
lowerWidthBound = 11.0 * UT;
upperWidthBound = 28.0 * UT;
dataWidth = pw ? zeroWidth;
nibble = (int) ((dataWidth / UT) + 0.5);
t1 = start + UT;
t2 = t1 + UT;
t3 = t2 + UT;
bit0 = (nibble >> 3) & 0x1;
bit1 = (nibble >> 2) & 0x1;
bit2 = (nibble >> 1) & 0x1;
bit3 = nibble & 0x1;
if (isFall && pw > lowerWidthBound && pw < upperWidthBound) {
yield([start, bit0], [t1, bit1], [t2, bit2], [t3,bit3]);
}
yield();
}
ここで、物理的な入力信号450のエッジのクロック時間は、複数の時点(即ち、「pw」、「dataWidth」)間の差分の可変幅に基づいてわかると共に、値が求められる。
図4に示すように、エッジ・データのセットには、物理的な入力信号450の0値を囲むエッジを含み(「isFall = data == 0」を用いて見つかる)、これは、SENTプロトコルに従って標準的な幅で離れている(即ち、「6UT」)。標準的な「ゼロの幅(zeroWidth)」(即ち、
図4では0.04ms)が、下向きの立ち下がりエッジ間の時間差(即ち、「pw」、これの最初のものは、
図4では0.08msとして示される)から引き算されて、「データ幅(dataWidth)」値を生じる。この「データ幅(dataWidth)」値(例えば、0.08ms-0.04ms=0.04ms)は、次いで、「UT」の観点からUTを除数として数値が求められて(例えば、0.04ms/0.00333…ms=12)、整数の「ニブル」値(例えば、12のバイナリ形式は、1100)がもたらされる。よって、
図4に示すように、ビットストリーム470cの最初の4ビット値(つまり、「ニブル」)は、領域1000の物理的な入力信号450の最初の2つの下向きの立ち下がりエッジ間の時間の長さに基づいて、「1100」である。
【0050】
言い換えると、ランタイム・エンジンは、領域1300のカスタム・ビットストリーム定義を、データ・フロー・シーケンス中のある状態を有するイテレータ(iterator:反復子)として扱う。最初に、
図4に示すように、しきい値/ヒステレシスを、領域1000の物理的な入力信号450に対して適用して、エッジのセットを抽出して生成する。このエッジ・データ・セット中のエッジ定義には、立ち上がり/立ち下がりの指示(例えば、「isFall=data==0」)及びタイムスタンプが含まれても良い。エッジ・データ・セットは、次いで、領域1300のカスタム・ビットストリーム定義に基づく抽象構文木60のノードを通して、一度に1エッジで、繰り返し適用されても良い。領域1300のこのカスタム・ビットストリーム定義は、静的な(static)変数宣言(例えば、「double start = 0.0」、「start = pintime(data)」)を利用して状態を維持し、また、物理的な入力信号450を通して、認識されたエッジの値を求めることによって、繰り返し適用されながら、初期宣言値にリセットするのではなく、各繰り返しで値を更新する。変数宣言は、Cプログラミング言語における静的(static)キーワードと同様のやり方で、自動的に静的(static)と定義されても良く、このとき、変数宣言は、最初のコールで設定された値のみを持つことになる。領域1300のカスタム・ビットストリーム定義に対するプロセッサ14による後続の繰り返しコールの夫々は、変数宣言値にリセットするのではなく、変数を以前の値に維持するという結果を生じる。プロセッサ14は、ビットストリーム定義102を用いて、代入(assignments)、変数(variables)及び式(expressions)の値を求め、続いて、エッジ・データ・セット中の所与のイテレータの位置に関するゼロ以上のビットを返答する。具体的には、イールド・ステートメント(即ち、「yield()」)は、プロトコル宣言の著者が、あるエッジ繰り返しに関するゼロ以上のビットを返答するのを可能にできる。タイムスタンプと論理ビット値(例えば、「start, bit0」、「t1, bit1」)を有するペアを含むタプル(tuple)を用いて、1以上のビットが返答されることもある。ランタイムの実行中、構文木60のイールド・ノード(yield node)は、イールド・ステートメントに基づいて、論理ビット値をパース・コンテキスト・オブジェクト(parse context object)へと押し出す。次いで、関数ノードは、各入力エッジについて、領域1300のカスタム・ビットストリーム定義のステートメントを通して繰り返し適用され、イールド・ノードが返答すると、パース・コンテキスト・オブジェクトからビット値を取り出す。
【0051】
ビットストリームの値を求める処理は、領域1000の物理的な入力信号450内における現在の状態の条件に基づいて、分岐しても良い。プロトコル宣言30内で使用される宣言型言語は、この分岐処理をサポートするために、scoped if-else 節を含んでいても良い。例えば、領域1300のカスタム・ビットストリーム定義は、次の例示的なif節(条件節)を含んでいても良い:
if (isFall && pw > lowerWidthBound && pw < upperWidthBound) {
yield([start, bit0], [t1, bit1], [t2, bit2], [t3,bit3]);
}
ここで、ブール型の「isFall」と、「pw」の比較は、条件分岐を表し、これは、もし満たせば、内部コードのイールド・ステートメントへのアクセスが許される。
【0052】
加えて、宣言型言語は、領域1300のカスタム・ビットストリーム定義から生成された構文木60のノードを通した各繰り返しに関して、現在の位置におけるタイムスタンプ及びエッジ値を抽出する構文を提供する。この情報は、所与のエッジ入力に関するビット値を計算するのに利用できる。例えば、領域1300のカスタム・ビットストリーム定義は、次の代入(assignments)があっても良い:
double UT = env.getvalue(“ut”, 0.000003);
isFall = data == 0;
start = pintime(data);
end = pintime(data[2]);
pw = end ? start;
dataWidth = pw ? zeroWidth;
nibble = (int) ((dataWidth / UT) + 0.5);
bit0 = (nibble >> 3) & 0x1;
bit1 = (nibble >> 2) & 0x1;
bit2 = (nibble >> 1) & 0x1;
bit3 = nibble & 0x1;
ここで、タイムスタンプ及びエッジ値は、「ut」の環境変数及び「データ(data)」信号の値に基づいて抽出される。
図4に示すように、各立ち下がりエッジ間(即ち、エッジ・データ・セット中に見られる第1及び第3エッジ間)の距離は、次いで、整数の変数「ニブル」を計算するのに利用でき、これのバイナリ形式は、4ビット値を生じるのに利用される。このように、エッジ値及びタイムスタンプ・データ(例えば、「start」、「t1」、「bit0」)が抽出されて、データ・ストリーム中の現在の繰り返し位置と関係づけられる。
【0053】
更に、宣言型言語は、現在の繰り返し位置からの任意のオフセット位置におけるタイムスタンプ及びエッジ値を抽出する付加的な構文も提供できる。これは、領域1000の物理的な入力信号450内のエッジ位置間のタイミング差の値を求めるのを可能にする。ランタイム環境は、任意のオフセットのあるアクセスが、入力エッジ・セットの実際の範囲に確実に限定されるように制約を強いる。領域1300のカスタム・ビットストリーム定義は、後述のように、上限及び下限内に制限され、この定義は、この定義に該当しない物理的な信号のデータ・ストリームの領域に関して、コード中にエラーを生じることなく、ゼロ・ビット値を返答する又は生じることになる。よって、エッジ・イテレータが設定範囲外のデータ値を参照することは許されないので、プロトコル宣言の著者には、範囲の無事(safety)が約束されるという利点がある。例えば、領域1300のカスタム・ビットストリーム定義が、次の代入とif節の条件を含んでも良い。
lowerWidthBound = 11.0 * UT;
upperWidthBound = 28.0 * UT;
if (isFall && pw > lowerWidthBound && pw < upperWidthBound) {
ここで、「lowerWidthBound」より小さいか、又は、「upperWidthBound」より大きいエッジ間の任意のタイミング差(即ち、「pw」)は、そのオフセットがエッジ・データ・セットの範囲を越えるであろうことから、無視される。
【0054】
このように、
図4は、領域1000の同じ物理的な入力信号450を、結果として得られる異なるビットストリーム470a~cへデコードするための、領域1100~1300の変化するビットストリーム定義を書くのに、宣言型言語がどのように利用できるかを示している。このように、ライブラリに格納されたプロトコル宣言の明確な定義や予め定めた関数のコールに基づいて、物理的な入力信号をデコードするように、試験測定システムを容易にプログラムすることもできる。こうして、物理的な入力信号50は、その個別のネットワーク・プロトコルに関係なく、同じ構文木60を用いて、ビットストリーム70に適切に変換でき、構文木60は、その後のイベント探索及びフィールド・マッピング・ステージ200及び300において使用されるか、又は、データ・リンク・レイヤ、ネットワーク・レイヤ又はトランスポート・レイヤのようなレイヤにおいて使用されることになる。
【0055】
次に、イベント探索ステージ200のデコード処理の間、プロセッサ14は、構文木60のノードを用いて、入力データ(プリアンブル・ステージ100のビットストリーム出力70又はロー(未加工)の物理的な入力信号50のいずれかとしても良い)をスキャンし、プロトコル宣言30内のイベント定義に基づいて、所与のパケット形式又はプロトコルについて開始及び終了イベントを見つける。具体的には、プロトコル定義30のイベント定義202は、値、パターン、限定子(qualifiers)及び持続時間の仕様を利用して、アナログ、エッジ又はビット状態の値を求めることによって、パケットのフレーミング範囲の検出を特定しても良い。これらの開始及び終了イベントは、物理的な入力信号50やビットストリーム70内のパケット・フレームをゲートするか又は示す時間マーカである。見つかったフレーミング時間マーカは、フィールド・マッピング・ステージ300に渡される。
【0056】
図5は、LINプロトコルに基づいて書かれたプロトコル宣言30に従った構文木60の実行のデコード・ステージを示す。プリアンブル・ステージ100の間、プロセッサ14は、部分的には、以下のように書かれたプロトコル宣言30に従って、物理的な入力信号50に対して構文木60を実行しても良い:
{Settings: polarity<“normal”>(“normal”, “invert”) }
decoder LIN(pin data) {
int dominant = 0; int recessive = 1;
bool invert = env.checkValue(“polarity”, “invert”);
bitstream A = invert ? ~nrz(data) : nrz(data);
ここで「Settings」は、ユーザ・インタフェース上で可能な設定を示し、これは、プロトコルがユーザの選択をランタイム・エンジンに返すのに必要とされると共に、「nrz()」関数を利用し、ビートストリーム570が結果として生じる「A」のビットストリーム定義に必要とされることがある。「polarity(極性)」の設定では、「normal(正常)」が選択され、「invert(反転)」が選択されなかったので、作成された「invert」と呼ばれるブール変数は、偽となり、「~」のビット単位補数演算子(bitwise complement operator)を用いてビットストリーム「A」は反転されない。
【0057】
プリアンブル・ステージ100の後、ビットストリーム570は、次のステージ200のイベント探索処理に渡され、このとき、プロトコル宣言30内のイベント定義202に基づいて、プロセッサ14によって、開始及び終了フレーミング時間マーカの値が求められる。イベント582に関するイベント定義は、プロトコル宣言30内に次のように定義することもできる:
event SynchBreak = (A:10 == 0000000001b);
ここで、プロセッサ14は、9個の0と、これに1が続くシーケンスを形成する、ビットストリーム「A」570内の10個のビットを探す。イベント582に関するイベント定義には、マッチング・ルール(「A:10==0000000001b」)の例を含み、これは、値、パターン、マスク・マッチング及び正規表現の定義を有する、プロトコル宣言30の宣言型言語の一部として利用できる。加えて、宣言型言語で書かれた、プロトコル宣言30内のイベント時間組み入れ/除外トークン(token)は、パケット・フィールドの値を求める間に、例えば、次のように、プロセッサ14がパケット・イベントの開始の終了時間マーカと一緒にデータ・ビットを含めるべきかどうかを指定する柔軟性をユーザに与える:
packet DataPacket = Start
packet DataPacket = ( Start ]
ここで「= Start」の形式は、終了時間を含むことを意味し、「= ( Start ]」の形式は、終了時間を除外することを意味する。
図5を参照すると、イベント582は、ビットストリーム「A」570内のパケット・フレーム580の開始を合図している。イベント582を表すこれら10個のビットに続いて、プロセッサ14は、構
文木60に従ってフィールド・マッピング・ステージ300に進み、プロトコル宣言30内に定義されたフィールド定義302と一致するバイナリ・シーケンスを求めて、パケット・フレーム・データ580を調べる。
【0058】
具体的には、フィールド・マッピング・ステージ300において、プロセッサ14は、パケット探索ステージ200で求められたフレーム位置又はパケット・フレームにおいて、ビットストリームの値を、可能性のあるパケットにマッピングする。加えて、プロセッサ14は、そのフレーム内の関連するフィールドを、特定のプロトコルに関してプロトコル宣言30のフィールド定義302で定義されているようにマッピングする。プロセッサ14は、ビットマップ・メモリ580の変換された入力データ・ビットに対して、的確に限定した対応するパターンのセットを比較することによって、このフィールド・マッピングを達成する。これらパターン・マッチングは、シンプルなビット・フィールドの比較や、正規表現を用いた複雑な比較でも良い。プロセッサ14は、次いで、これら的確に限定した対応するフィールドを用いて、ビットストリーム590のゲートされた又はフレーム化した区間の値を求め、宣言されたパケット形式のどれが入力データの構造とマッチングするかを決定する。
【0059】
フィールド定義302は、上述のイベント定義202と同じルール・マッチングの特性を含んでも良い。パケット構成及び表現の柔軟性を高めるために、フィールド定義302は、更にいくつかのパターン及び特性を用いて定義しても良い。
図5のフィールド591及び592のフィールド定義は、次のようにプロトコル宣言30内に定義することもできる。
field StartBit = { (A:1) == dominant };
field StopBit = { (A:1) == recessive };
ここで、8ビットのバイトの開始は、0のビット値を有する先行するビットにフラグが付き、このバイトの終了は、1のビット値を有する後続のビットにフラグが付けられる。
【0060】
より良い論理的な表現のために、複数のフィールドを、新しい「仮想(バーチャル)」フィードへと任意に再合成しても良い。
図5のフィールド593に関するフィールド定義は、次のようにプロトコル宣言30内に定義することもできる:
field SynchFields = { StartBit, A.Synch:8.verify(__value, “Invalid synch field”, 0x55), StopBit };
ここで、フィールド593は、10個のビットから構成され、1ビット・フィールド591で始まり、これにビット・シーケンス01010101を有する8ビットの「synch(同期)」フィールドが続き、そして、1ビット・フィールド592で終わる。フィールド593に関するフィールド定義は、フィールド定義302が、既定のフィールド内に他のフィールをどのように入れ子にする(nest)かを示している。
【0061】
図5のフィールド594に関するフィールド定義は、次のようにプロトコル宣言30内に定義することもできる:
field InterFrameSpace = { { (A:1) == recessive } {0, 15} };
ここで、フィールド594は、関係演算子「==」の真の結果の繰り返しに基づいて、ゼロから5ビットの長さを持ち得る。フィールド・マッチング・ルールに加えて、そして、フィールド・マッチング・ルールに比べて、フィールド定義302は、固定又は任意長のフィールドの繰り返しを可能にするフィールド量化(quantifier)ルールを含んでも良い。フィールド594に関するフィールド定義には、フィールド量化子「{0, 15}」の例があり、ここで、「0」は、最小フィールド長、「15」は、固定フィールド594についての最大フィールド長である。固定フィールド量化子(quantifier)は、(1)「{n}」、ここで、先行する要素は、正確にn回マッチングしなければならない。(2)「{n, m}」、ここで、先行する要素は、少なくともn回マッチングしなければならないが、m回より多くてはいけない。(3)「?」、ここで、先行する要素は、1回マッチングするか、又はマッチングしない必要がある、という形式である。フィールドは、任意のビット幅や長さで定義されても良く、これは、(1)「*」、ここで先行する要素は、ゼロ回以上マッチングしなければならない。(2)「+」、ここで先行する要素は、1回以上マッチングしなければならない。(3){n, }、ここで先行する要素は、少なくともn回マッチングしなければならない、という形式を利用しても良い。
【0062】
図5のフィールド595に関するフィールド定義は、次のようにプロトコル宣言30内に定義することもできる:
field IdFields = { InterFrameSpace, StartBit, A.ID0#EXCLUDE:1, A.ID1#EXCLUDE:1, A.ID2#EXCLUDE:1, A.ID3#EXCLUDE:1, A.ID4#EXCLUDE:1, A.ID5#EXCLUDE:1, A.P0#EXCLUDE:1.verify(__parity, even, ID0, ID1, ID2, ID4), A.P1#EXCLUDE:1.verify(__parity, odd, ID1, ID3, ID4, ID5), StopBit, Identifier {ID0, ID1, ID2, ID3, ID4, ID5, P0, P1} };
ここで、フィールド595は、0から15ビットのフィールド594で始まり、これに1ビットのフィールド591、次いで、8ビットの「識別子(Identifier)」フィールドが続き、そして、1ビットのフィールド592で終わる。フィールド595についてのフィールド定義には、「識別子」フィールドの1ビット・フィールドの夫々に使用されるフィールド・プロパティ(特性、属性)の例を含み、ここで、「#EXCLUDE」トークンは、ランタイムの値を求める処理中において、結果の後処理を可能にする。更に、付加的な後処理工程のために、フィールド・マッピング中に、フィールドにタグ付けしたいか又は結びつけたい任意のプロパティに関して、「#」トークンの変形が可能である。加えて、フィールド595についてのフィールド定義内の「識別子」フィールドに関するフィールド定義は、フィールドの入れ子処理(nesting)の例である。フィールドの入れ子処理及びグルーピングによって、各レベルにおいて別々の量化ルールを有する入れ子構造が可能になる。最後に、上記フィールド定義中のフィールド「P0」及び「P1」は、データ検証を含み、ここで、「識別子」フィールド内の4つのフィールドは、「P0」及び「P1」フィールドの夫々に対し、偶数又は奇数パリティに関して比較及びチェックされる。
【0063】
ドメイン固有宣言型言語によれば、プロトコル宣言30が、上述の「#EXCLUDE」トークンのようなアクション及びプロパティ・パラメータを有するフィールド定義302を含むことが可能になる。プロセッサ14は、構文木60の実行中に、これらアクション及びプロパティ・パラメータの値を求める。アクション・パラメータは、パーサ40が認識できる予め定めたトークンでも良い。アクション・パラメータは、プロセッサ14が、ビットストリームの値を求める処理の特性を変更したり、成功したフィールド・マッチングに対して他の演算を実行するのに利用できる。フィールド定義302内のフィールド・アクション・パラメータは、任意のランタイム・ステート・マシーンが、例えば、次のように、フィールド・マッチング条件に基づいて、変化することを可能にする:
(A.DTS2:1) == HIGH <ENABLE_STROBE_SYNC>,
ここで「<ENABLE_STROBE_SYNC>」は、例示的なアクション・パラメータである。フィールド・アクション・パラメータに比較して、プロパティ・パラメータは、フィールドに対して任意のプロパティを設定するトークンであっても良い。プロパティ・パラメータ・トークンは、プロセッサ14が、フィールドの結果の前処理及び後処理のために利用しても良い。フィールド・プロパティ・パラメータは、上述した「#EXCLUDE」トークンのような所与のフィールド定義に関する任意のランタイムの値を求める処理のルールを確立する。
【0064】
図5のフィールド596に関するフィールド定義は、次のようにプロトコル宣言30内に定義することもできる:
field DataFields = { InterFrameSpace, StartBit, A.Data:8, StopBit };
ここで、フィールド596は、ゼロから15ビットのフィールド594で始まり、これに1ビットのフィールド591、次いで、8ビットの「データ(data)」フィールドが続き、そして、1ビットのフィールド592で終わる。
【0065】
図5のフィールド597に関するフィールド定義は、次のようにプロトコル宣言30内に定義することもできる:
field ClassicCheckSumFields = { InterFrameSpace, StartBit, A.Checksum:8.verify(__checksum, CARRYON, Data), StopBit };
ここで、フィールド597は、ゼロから15ビットのフィールド594で始まり、これに1ビットのフィールド591、次いで、8ビットの「チェックサム(Checksum)」フィールドが続き、そして、1ビットのフィールド592で終わる。フィールド597に関するフィールド定義には、「__checksum」を用いて、フィールドが「データ」フィールドであるか否か、つまり、先の8ビットの「データ」フィールドの適切なチェックサムの総計であるか否かを評価する、データ検証の別の例を含む。
【0066】
プロトコル宣言30中のフィールド定義302は、ユーザ定義のエラー対処処理(error handling)やフラグ付加処理(flagging)を含んでも良い。このエラー対処処理によれば、プロトコル宣言の著者が、巡回冗長検査(cyclic redundancy check: CRC)の結果、チェックサム、パリティや値を検証することが可能になる。この検証工程は、プロトコルを捕捉して調査及びデバッグするのに、エンド・ユーザにエラー状態を示すことが可能になる。フィールド定義302内の任意のCRC多項式定義は、例えば、次のように、CRCエラー・チェックを可能にする:
__crc HeaderPoly = x^11 + x^9 + x^8 + x^7 + x^2 + 1, 0x01A, 0;
エラー及びCRCフィールド・シーケンス定義は、ばらばらのパケット区間に対して、パリティ、チェックサム、CRCその他のデータ検証計算を可能する(例えば、「verify(__parity, even, ID0, ID1, ID2, ID4)」)。更に、デコードされたフィールドの結果に連結する、プロトコル宣言の著者によって書かれたエラー・メッセージを可能にする変数置換(variable substitution)を有するユーザ定義の文字列のような検証フィールド定義が可能である。ユーザ・インタフェースは、ランタイム・エンジンによって検出されたランタイム/デコード処理エラー・メッセージを表示しても良い。
【0067】
図5のフィールド598に関するフィールド定義は、次のようにプロトコル宣言30内に定義することもできる:
packet MASTER_REQUEST_FRAME = SynchBreak { LSB { SynchFields, IdFields, {ID0, ID1, ID2, ID3, ID4, ID5} == 0X3C, {DataFields} {8}, ClassicCheckSumFields } };
【0068】
ここで、可変長パケット・フィールド598は、パケット開始イベント582(同時のデータを含む)で始まり、これにフィールド593、次いで、フィールド595が続き、これにフィールド596(ここで、フィールド・パターン596は、フィールド量化子「{8}」に従って8回生じる必要がある)が続き、そして、フィールド597で終わる。フィールド598に関するパケット・フィールド定義は、フィールド・パターンを繰り返すために、正規表現形式のリピート・フラグと共に、どのように複数のフィールドをグルーピングするかを示している。具体的には、フィールド598についてのパケット・フィールド定義に関して、フィールド595内の「識別子(Identifier)」フィールドは、ビット・シーケンス111100で始まらなければならない。この要件は、フィールド・マッチング・ルール「{ID0, ID1, ID2, ID3, ID4, ID5} == 0X3C」で示されている。また、フィールド598に関するパケット・フィールド定義内には、パケット・フィールド598のある区画についての特定の値を求める処理(ここでは、「LSB」)の例がある。パケット形式についてのフィールド定義302内の区画又は調べた区画によって、プロセッサ14に対して、例えば、ビット・スタッフィングのルール、最下位ビット(LSB)、最上位ビット(MSB)、ビッグ・エディアン、リトル・エディアンのような値を求める処理で使用する形式を特定しても良い。
【0069】
任意のビット・スタッフィング・ルールが、例えば、次のように、フィールド定義302内に含んでいても良い:
bitstuff stuffComplement = (0b, 5) | (1b, 5);
field RemoteFrameFields = {
stuffComplement {
{ RTR } == recessive,
A.CRC:15.verify(__crc, CAN_P, Identifier-DataLengthCode, SOF<-0) } };
ここで、ビット・スタッフィング定義「stuffComplement」は、周知のように、特定のフラグ、マーカその他のフィールドが、ビットストリーム中のデータやその他のフィールドに、誤って読み込まれるのを防止する。本開示の宣言型言語を用いると、プロトコル宣言の著者は、特定のアプリケーションに適した、カスタマイズされたドメイン固有のビット・スタッフィング・ルールを書くことができる。プロトコル宣言30が、メモリ16又は他の記憶媒体中のライブラリに格納された共通のビット・スタッフィング・ルールへのコールを含むようにしても良い。
【0070】
加えて、ビットストリーム定義102について上述のように、フィールド定義302及びイベント定義202は、ブール式の値を求める処理に基づいて、フィールド定義に関する分岐ロジックを可能にする、条件に応じて調べる節(scoped if clauses)を含んでいても良い。
【0071】
実施形態によっては、2つ以上の物理的な入力信号50を受けるようにしても良い。例えば、データ信号と共に、クロック信号を受けるようにしても良い。
図6は、I2Cプロトコルに基づくプロトコル宣言30を有する2つの異なる物理的な入力信号650用いる、構文木60の3つのデコード処理ステージを示す。プリアンブル・ステージ100の間に、プロセッサ14は、プロトコル宣言30に従って2つの物理的な入力信号650に対して構文木60を実行でき、これは、部分的には、次のように書いても良い:
decoder I2C(PIN clk, PIN data) {
bitstream A = clock(data) @ rise(clk);
ここで、「PIN clk」及び「PIN data」は、2つの異なる物理的な入力信号650を表し、ビットストリーム670は、クロック(「clk」)信号がロー(Low:低)からハイ(High:高)に行く毎のデータ(「data」)信号に基づいて、ビット値を求めることによって生成される。
【0072】
イベント探索ステージ200の間に、パケット・フレームの開始及び終了の時点又は位置が、プロトコル宣言30中のイベント定義202 に基づいて見つけられる。
図6のイベント682及び684に関するイベント定義202は、次のようにプロトコル宣言30中に書くこともできる。
event S = fall(data) when clk == 1;
event P = rise(data) when clk == 1;
ここで、イベント682は、クロック信号がハイ(high)の間に、データ信号がハイ(high)からロー(Low)へ行く度に生じ、イベント684は、クロック信号がハイ(high)の間に、データ信号がローからハイへ行く度に生じる。イベント682及び684に関するイベント定義は、ビットストリーム670内でパケット・フレーム化の範囲を見つけるために、プリアンブル・ステージ100から出力されたバイナリのビットストリームではなくて、未加工(raw)のアナログの物理的な入力信号を用いるイベント探索ステージ200の例を示す。
【0073】
イベント探索ステージ200の間に、プロセッサ14によって複雑なイベントの値も求めることができる。複雑なイベント定義は、任意の個数のもっと単純なイベントの値を求める処理を組み合わせることを可能にし、これは、オプションで持続時間の仕様を有し、論理的な「OR」の組み合わせや複数のイベントのシーケンスを用いて、値を求めることができる。例えば、複雑なイベントに関する複雑なイベント定義は、プロトコル宣言30内に宣言型言語で次のように書いても良い:
cevent SR = peek S;
cevent SRP = (P | SR);
ここで、複雑なイベント「SR」は、「peek(データを覗く)」動作に従って、イベント「S」が見つけられてスタックに加えられるといつでも生じ、複雑なイベント「SRP」は、構文木60が、(1)上記のイベント684に関するイベント定義に従って定義されるイベント「P」、又は(2)複雑なイベント「SR」のいずれかに出会ったときにはいつでも生じる。
【0074】
図6のフィールド692、694、696及び697は、全て、次のように、プロトコル宣言30で書かれるフィールド698に関するパケット・フィールド定義中に定義されても良い。
int WRITE = 0; int READ = 1;
packet Read7 = S {
A.Address:7, (A.RW:1)==READ, A.Ack:1, (A.Data:8, A.Ack:1)+ } SRP;
ここで、パケット・フィールド698は、ゼロ・ビットのイベント682で始まり、これに7ビットの「アドレス(Address)」フィールド692及び1ビットの「RW」フィールド694(ここで、ビット値は1)、次いで、8ビットの「Data(データ)」フィールド697の少なくとも1つのグループ化したものに先行して、1ビットの「Ack」フィールド696、そして、複雑なイベント「SRP」で終わる。
【0075】
図7は、本開示のいくつかの実施形態による、一般化した構文木(構文木)の実行の例示的な処理及びデータ・フローのブロック図を示す。構文木は、プロトコル固有のステート・マシーンを自動生成するのに利用できる。このプロトコル固有のステート・マシーンは、プロセッサが、ランタイムで入力データの値を求める処理を実行するのに利用できる。パーサ40は、メモリ16からプロトコル宣言730を読み出し、パーサ40又はプロセッサ14内のコンパイラ706は、構文木60をコンパイルする。
【0076】
物理的な入力信号750は、一般に周知の物理的なライン・コード(伝送路符号)のエンコーディング又はプロトコル宣言30に基づくカスタム・ビットストリーム定義を用いてデコードされる。
図7に示すように、上述のようなカスタム・ビットストリーム定義を書くことではなくて、又は、これに加えて、標準的なデコーダ702が、一般に周知の物理ライン・コードのコーディング又はエンコーディング・スキームを利用して、物理的な入力信号750を未加工(raw:ロー)のビットストリーム770へと変換しても良い。一般に周知の物理ライン・コードのコーディング又はエンコーディング・スキームとしては、例えば、マンチェスタ(Manchester)、リターン・トゥ・ゼロ、ノン・リターン・トゥ・ゼロ(NRZ)、ノン・リターン・トゥ・ゼロ・マーク(NRZ-M)、データ・ストローブ(D/S)、2b/10b、8b/10b、8b/9b、64b/66b、64b/67b、128b/130b及びデスクランブル(descramble:スクランブルを解く)がある。これら一般に周知の物理ライン・コードのコーディング又はエンコーディング・スキームは、ライン・コード・エンコーディング・ライブラリ772に含まれて、デコーダのサポートに利用されても良い。ビットストリーム定義は、静的なC++のコルーチン(co-routine)として書かれても良く、これは、構文木を実行するデコーダのランタイム・エンジンによって直接読み出される。この手法の下、ランタイム、文法(grammar)及びlexトークンが、新しい物理的レイヤ・ビットストリーム定義と出会う度に更新される。この更新処理は、プロトコル固有の情報フローへのビットストリーム・シーケンスの分析及びマッピングに重点を置く、言語ベースのプロトコル手法のどれにでも利用できる。
【0077】
プロセッサ14は、続いて、構文木760を実行し、フレーム又はイベント定義202を用いて、標準的なデコーダ702からの未加工のビットストリーム770をビットストリーム・フレーミング(フレーム化)データ780へと変換する。構文木760は、次いで、フィールド定義302を出力されたパケット化ビットストリーム・データ790に対してマッチングさせる。また、先に詳細を説明したCRCチェック712を実行しても良い。
【0078】
フィールド・デバイス・アクセス(FDA)及びデバイス記述言語(device description language:DDL)ライブラリ782を用いて、ビットストリーム770の値を求めて(evaluate:評価して)、プロトコル宣言30によるトークン交換を用いて、元々の入力データを出力メディア・ファイルへと変換しても良い。デコードされたビットストリームのフレーム及びパケットが収集され(714)、パケットからペイロードが抽出されて(716)、メディア・ファイル718が求められる。パケット・コレクション(collection)714は、データ・ストア720にも保存されても良い。
【0079】
説明のために、種々の例示的な定義を先に提示したが、本開示の実施形態は、こうした定義に限定されず、宣言型言語を用いて、定義の多様な配列がプロトコル宣言の著者によって書かれても良い。
【0080】
本願発明の態様は、様々な変更及び代替形態が可能である。特定の態様は、図面に例として示されており、本願で以下に詳細に説明する。しかしながら、本願に開示された実施例は、説明を明確にする目的で提示されており、明示的に限定されない限り、開示される一般的概念の範囲を本願に記載の具体例に限定することを意図していない。このように、本開示は、添付の図面及び特許請求の範囲に照らして、記載された態様のすべての変更、均等物及び代替物をカバーすることを意図している。
【0081】
物理的レイヤのアナログのシグナリングは、カスタム・ハードウェア・チップセット、フィールド・プログラマブル・ゲート・アレイ(FPGA)その他の汎用言語アルゴリズムによって、ビットストリームに変換できる。
【0082】
明細書における実施形態、態様、実施例などへの言及は、記載された項目が特定の特徴、構造又は特性を含み得ることを示す。しかしながら、開示される各態様は、そうした特定の特徴、構造又は特性を含んでいても良いし、必ずしも含んでいなくても良い。更に、このような言い回しは、特に明記しない限り、必ずしも同じ態様を指しているとは限らない。更に、特定の態様に関連して特定の特徴、構造又は特性が記載されている場合、そのような特徴、構造又は特性は、そのような特徴が他の開示された態様と明示的に関連して記載されているか否かに関わらず、そうした他の開示された態様と関連して使用しても良い。
【0083】
本開示の態様は、特別に作成されたハードウェア、ファームウェア、デジタル・シグナル・プロセッサ又は試験測定に適合化されたコンピューティング装置のような、プログラムされた命令に従って動作するプロセッサを含む特別にプログラムされたコンピュータ上で動作できる。試験測定に適合化されたコンピューティング装置は、試験測定システムを網羅しても良い。入力データは、物理チャンネル入力部から直接供給されても良い。これに加えて又はこれに代えて、入力データは、以前にサンプリングされた又は合成されたライン・コード化された物理的な入力信号のファイル又はメモリに基づく入力から供給されても良い。開示されたシステムのいくつかは、クラウド対応サーバ技術を利用して動作しても良い。本願におけるコントローラ又はプロセッサという用語は、マイクロプロセッサ、マイクロコンピュータ、ASIC及び専用ハードウェア・コントローラを含むことを意図する。本開示の1つ以上の態様は、1つ以上のコンピュータ(モニタリング・モジュールを含む)その他のデバイスによって実行される、1つ以上のプログラム・モジュールのような、コンピュータ利用可能なデータ及びコンピュータ実行可能な命令で実現できる。一般に、プログラム・モジュールとしては、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含み、これらは、コンピュータその他のデバイス内のプロセッサによって実行されると、特定のタスクを実行するか、又は、特定の抽象データ形式を実現する。コンピュータ実行可能命令は、ハードディスク、光ディスク、リムーバブル記憶媒体、ソリッド・ステート・メモリ、RAMなどのコンピュータ可読記憶媒体に記憶しても良い。当業者には理解されるように、プログラム・モジュールの機能は、様々な態様において必要に応じて組み合わせられるか又は分散されても良い。更に、こうした機能は、集積回路、フィールド・プログラマブル・ゲート・アレイ(FPGA)などのようなファームウェア又はハードウェア同等物において、全体又は一部を具体化できる。特定のデータ構造を使用して、本発明の1つ以上の態様をより効果的に実施することができ、そのようなデータ構造は、本願に記載されたコンピュータ実行可能命令及びコンピュータ使用可能データの範囲内と考えられ、コンピュータ使用可能データは、コンピュータ・プログラム・プロダクトと呼んでも良い。コンピュータ可読媒体は、上述のように本願で説明された。
【0084】
開示された態様は、場合によっては、ハードウェア、ファームウェア、ソフトウェア又はそれらの任意の組み合わせで実現されても良い。開示された態様は、1つ以上のプロセッサによって読み取られ、実行され得る1つ又は複数のコンピュータ可読媒体によって運搬されるか又は記憶される命令として実現されても良い。そのような命令は、本願では、コンピューティング装置によってアクセス可能な任意の媒体を意味する。限定するものではないが、一例としては、コンピュータ可読媒体は、コンピュータ記憶媒体及び通信媒体を含むことができる。
【0085】
コンピュータ記憶媒体は、コンピュータ読み取り可能な情報を記憶するために使用することができる任意の媒体を意味する。限定するものではないが、例としては、コンピュータ記憶媒体としては、ランダム・アクセス・メモリ(RAM)、読み出し専用メモリ(ROM)、電気消去可能プログラマブル読み出し専用メモリ(EEPROM)、フラッシュメモリやその他のメモリ技術、コンパクト・ディスク読み出し専用メモリ(CD-ROM)、DVD(Digital Video Disc)やその他の光ディスク記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置やその他の磁気記憶装置、及び任意の技術で実装された任意の他の揮発性又は不揮発性の取り外し可能又は取り外し不能の媒体を含んでいても良い。コンピュータ記憶媒体としては、信号そのもの及び信号伝送の一時的な形態は排除される。
【0086】
通信媒体は、コンピュータ可読情報の通信に利用できる任意の媒体を意味する。限定するものではないが、例としては、通信媒体には、電気、光、無線周波数(RF)、赤外線、音又はその他の形式の信号の通信に適した同軸ケーブル、光ファイバ・ケーブル、空気又は任意の他の媒体を含むことができる。
【0087】
開示された主題の上述のバージョンは、記述したか又は当業者には明らかであろう多くの効果を有する。それでも、開示された装置、システム又は方法のすべてのバージョンにおいて、これらの効果又は特徴のすべてが要求されるわけではない。
【0088】
加えて、本願の記述は、特定の特徴に言及している。本明細書における開示には、これらの特定の特徴の全ての可能な組み合わせが含まれると理解すべきである。ある特定の特徴が特定の態様又は実施例の状況において開示される場合、その特徴は、可能である限り、他の態様及び実施例の状況においても利用できる。
【0089】
また、本願において、2つ以上の定義されたステップ又は工程を有する方法に言及する場合、これら定義されたステップ又は工程は、状況的にそれらの可能性を排除しない限り、任意の順序で又は同時に実行しても良い。
【0090】
説明の都合上、本発明の具体的な実施例を図示し、説明してきたが、本発明の要旨と範囲から離れることなく、種々の変更が可能なことが理解できよう。従って、本発明は、添付の特許請求の範囲を除いて限定されるべきではない。
【符号の説明】
【0091】
10 試験測定システム
14 プロセッサ
16 メモリ
18 入力端子
20 物理媒体入力ライン
22 ユーザ・インタフェース
24 出力ライン
30 プロトコル宣言
40 パーサ
50 物理的入力信号
60 構文木
70 ビットストリーム
90 パケット・ビットストリーム・データ
100 プリアンブル・ステージ
102 ビットストリーム定義
200 イベント探索ステージ
202 イベント定義
300 フィールド・マッピング・ステージ
302 フィールド定義
702 標準デコーダ
750 物理的な入力信号s
770 未加工ビットストリーム
772 ライン・コード・エンコーディング・ライブラリ
782 フィールド・デバイス・アクセス(FDA)及びデバイス記述言語(DDL)ライブラリ
730 プロトコル宣言
706 コンパイラ
760 構文木
780 ビットストリーム・フレーミング・データ
790 パケット化ビットストリーム・データ
714 パケット・コレクション
716 ペイロード抽出
712 CRCチェック
718 メディア・ファイル
720 データ・ストア