リダクション
Modelifyが初めて実行する変換は非常に冗長な変換です。SimulinkのブロックはC言語のコード内の各演算に対して生成されます。その結果、比較的少量のコードにも関わらず大規模なモデルが生成される可能性があります。この冗長な変換を改善するため、C言語のコードでロジックを表す上で、もしくは、モデルを変更して可読性を向上させる上で必要な数のブロックを減らすリダクションを適用することができます。
リダクションは複数の方法でモデルを簡素化、または、改善します。リダクションは以下の目標の少なくとも1つを達成します:
- 同じ成果を挙げるよりシンプルなブロック、または、より高いレベルのSimulinkのブロックと置き換えることで、ブロックの数を減らします。
- 一連のブロックを置き換え、特定のモデルリングガイドラインに準拠させます。
- シミュレーションの結果に影響を与えないモデルの一部を削除します。オリジナルのC言語のコードにデッドコードが存在するケースが該当します。
個別に各リダクションを有効、または、無効にすることができます。そのため、会社で利用するモデリングガイドラインに一致させる上で必要なリダクションのみ有効にすることが可能です。
各リダクションの説明を以下に掲載します。各リダクションの説明にはリダクションの前と後のモデルのスクリーンショットが含まれています。画像は横並び、または、上下に表示されます。1点目の画像はリダクション前のモデルを表します。
Absolute Value
このリダクションはロジックが絶対値を示すブロックのセットを絶対値のブロックに置き換えることでモデルを簡素化します。
2点のケースが考えられます。絶対値を返すケース(ケース 1)と負の絶対値を返すケース(ケース 2)です。
ケース 1:
 |
Before Reduction |
 |
After Reduction |
ケース 2:
 |
Before Reduction |
 |
After Reduction |
Advanced Arithmetic
このリダクションは次の方法でモデルの簡素化を行います。
- Sumブロックから値が0の定数を削除します。
- Productブロックから値が1の定数を削除します。
- 同じ入力を算術ブロックに低減します。
Sumブロックから値が0の定数を削除
2つのケースが考えられます: ConstantブロックとSumブロックを単純に削除するケース(ケース1)とUnary Minusブロックを追加する必要があるケース(ケース 2)です。
ケース 1:
 |
リダクション前 |
 |
リダクション後 |
ケース 2:
 |
リダクション前 |
 |
リダクション後 |
Productブロックから値が1の定数を削除
2つのケースが考えられます: ConstantブロックとProductブロックを単純に削除するケース(ケース 1)と逆数のMath Functionブロックを追加する必要があるケース(ケース 2)です。
ケース 1:
 |
リダクション前 |
 |
リダクション後 |
ケース 2:
 |
リダクション前 |
 |
リダクション後 |
同じ入力を算術ブロックに削除
Productブロックと一致する入力を低減し、Math Functionブロックと置き換えます。
Square (u^2)
Productブロックと一致する入力が2つ存在する場合、2乗のMath Functionブロックに低減されます。
 |
リダクション前 |
 |
リダクション後 |
Power (u^v)
Squareリダクションと同様に、Productブロックに同じ値を持つ入力が2つ以上存在する場合、このリダクションは適用されます。
このリダクションはArithmeticリダクションが有効にされている場合のみ適用され、2つの入力を持つ一連のProductブロックを複数の入力を持つ単一のProductブロックに折り畳みます。
 |
 |
リダクション前 |
リダクション後 |
Power of base 10 (10^u)
値10を持つConstantsブロックからProductブロックに2つ以上の入力が存在する場合、Power of base 10 Math Functionブロックに低減されます。
このリダクションはArithmeticリダクションが有効にされている場合のみ適用されます。
 |
 |
リダクション前 |
リダクション後 |
Reciprocal (1/u)
このリダクションは、Productブロックに対する1つめの入力が値1の定数であり、残りの入力はその他のリダクションにより単一のブロックに低減される(例ではSquareリダクション)場合、適用されます。
このリダクションはArithmeticリダクションが有効にされている場合のみ適用されます。
 |
リダクション前 |
 |
リダクション後 |
Arithmetic
このリダクションは複数のSumブロックを複数の入力を持つ単一のSumブロックに低減します。
 |
 |
リダクション前 |
リダクション後 |
同様に複数のProductブロックを複数の入力を持つ単一のProductブロックに低減します。
 |
 |
リダクション前 |
リダクション後 |
Bus Assignment
同じバスの入力が用いられている複数のBus Assignmentブロックを単一のBus Assignmentブロックに低減します。
 |
 |
リダクション前 |
リダクション後 |
バスの全ての要素が複数のBus Assignmentブロックによって割り当てられている場合、全てBus Creatorブロックに置き換えられます。
 |
リダクション前 |
 |
リダクション後 |
Bus Selector
同じバスの入力が用いられている場合、複数のBus Selectorブロックをまとめます。
 |
 |
リダクション前 |
リダクション後 |
Constant Vector
Constantブロックのグループ、および、単一のベクトル出力を作成するMuxブロックをConstant 1-D ベクトルに置き換えます。
 |
 |
リダクション前 |
リダクション後 |
同様に、定数のグループ、Muxブロック、および、2次元の配列を作ることが可能なVector Concatenateブロックが存在する場合、行列信号を作る単一のConstantブロックに全て置き換えられます。
 |
 |
リダクション前 |
リダクション後 |
Data Type Conversions
変換されたモデルに不要なData Type Conversion ブロックが含まれる場合があります。これは通常オリジナルのC言語のコード内の不要なキャスト演算子によって引き起こされます。
 |
リダクション前 |
 |
リダクション後 |
Dead Paths
これはシミュレーションの出力に影響を与えない図の一部を削除します。デッドコード、または、C言語の関数の利用されていないパラメータが該当します。
 |
 |
リダクション前 |
リダクション後 |
Demux
同じベクトル入力が用いられている複数のSelectorブロックを単一のDemuxブロックに低減します。
ベクトルから一部の要素が選択されない場合、Demuxブロックから対応する出力がTerminatorブロックにつなげられます。リダクションは削除予定のSelectorブロックの数が加えられる可能性のあるTerminatorブロックの数よりも多い場合のみ適用されます。
 |
リダクション前 |
 |
リダクション後 |
From and Goto
2つ、または、2つ以上のつながりを持つInportブロックがFromブロックとGotoブロックを使って簡素化されます。大きな図においては、線の分岐が多いと大量の線の交差および混乱を引き起こしかねません。このようなケースでは、GotoブロックとFromブロックの使用により、可読性が改善される可能性があります。
 |
リダクション前 |
 |
リダクション後 |
Gain
図で定数により積を表すブロックを検索し、Gainブロックと置き換えます。このリダクションはGainブロックに対して単式内の定数を検知し、分類します。
 |
リダクション前 |
 |
リダクション後 |
Group Action Transitions
複数の一連のアクションを単一の遷移に移します。
 |
 |
リダクション前 |
リダクション後 |
Increment
1の加算または減算を表すブロックをそれぞれIncrement Stored Integerブロック、Decrement Stored Integerブロックと置き換えます。
 |
リダクション前 |
 |
リダクション後 |
Logical Blocks
同じ演算子を持つ複数のLogical Operatorブロックを単一のブロックに低減します。
また、TRUE/FALSE Constants リダクションが有効にされている場合、最適化も実行します。演算子がANDであり、値の一つがfalseの場合、結果は常にfalseになります。このようなケースでは、Logical Operatorブロックを削除し、状況に応じて信号を別ルートに変更します。また、演算子がORで値の一つがtrueの場合も同様の最適化を実施します。
 |
リダクション前 |
 |
リダクション後 |
Relational Operator
定数の関係演算子をCompare to Constantブロックに低減します。
 |
リダクション前 |
 |
リダクション後 |
Saturation & MinMax
このリダクションは一連のブロックをMinMaxブロック、Saturationブロック、またはSaturation Dynamicブロックに置き換えます。
以下に考えられる全てのケースを挙げていきます。
Min
図内で値の最小数を取得するためのロジックを表すブロックの組み合わせを検知し、min関数を用いて、関係しているブロックをMinMaxブロックと置き換えます。
 |
リダクション前 |
 |
リダクション後 |
Max
同様に同じロジックを適用して、検知を行い、max関数に低減します。この例では2つ以上の値の最大数を取得するケースを考慮しています。
 |
リダクション前 |
 |
リダクション後 |
Saturation
事前に定義された2つの値の間の信号の範囲の境界を示すロジックを検索し、関係するブロックをSaturationブロックと置き換えます。
 |
リダクション前 |
 |
リダクション後 |
Saturation Dynamic
2つの動的に与えられた値の間の信号の範囲の境界を示すロジックを同様に検索し、関係するブロックをSaturation Dynamicブロックと置き換えます。
 |
リダクション前 |
 |
リダクション後 |
Sum/Product of Element
ベクトルの全ての要素のSumやProduct(要素ごとのSelectorブロックが含まれます)を単一のSumブロック、または、Productブロックに低減します。
全てのSelectorブロックが単一のSumブロックやProductブロックにつなげられる必要があるため、Arithmeticリダクションが有効にされている場合のみ、このリダクションは適用されます。
Sum
 |
 |
リダクション前 |
リダクション後 |
Product
 |
 |
リダクション前 |
リダクション後 |
TRUE/FALSE Constants
C言語の定数TRUE/FALSE を持つConstantsを実際のSimulinkのブーリアン型に変更し、一部のその他の最適化を可能にします。以下の例では信号のタイプはint32ではなくブーリアン型であり、NOT Logical Operatorブロックを用いて最適化を適用します。
 |
リダクション前 |
 |
リダクション後 |
以下の画像はモデルのサイズを低減するために最適化が適用される別のケースを表しています。
 |
リダクション前 |
 |
リダクション後 |
Unary Minus
可能な場合Unary Minusブロックを削除することでモデルを低減します。
 |
リダクション前 |
 |
リダクション後 |
Unit Delay Constant
Unit Delayブロックは静的なローカル変数に対して盛り込まれます。このリダクションにより、これらの変数の動き - つまり、変更可能であり、関数に対する継続的な呼び出しにおいて維持することが可能な初期値を持つ動き – のモデル化が可能になります。
Modelifyは静的なローカル変数が関数本体において変更されていないかどうかを特定します。この場合、Unit Delayブロックは、Unit Delayブロックの初期値を用いて、Constantブロックに置き換えられます。
サンプルの変換のソースコード:
以下の画像は2つのケースを表しています - 修正されていない変数(static_unmodified
)と各関数において修正された変数(static_modified
)です。
 |
リダクション前 |
 |
リダクション後 |
Vector Assignments
同じベクトル入力が用いられている複数のAssignmentブロックを単一のMuxブロックに低減します。
 |
リダクション前 |
 |
リダクション後 |
Vector Selector
同じベクトル入力が用いられており、入力ベクトルの同じ要素をインデックス付けする複数のSelectorブロックを単一のSelectorブロックに低減します。
 |
リダクション前 |
 |
リダクション後 |