プログラマブル素子言語文法

予約語

プログラマブル素子言語には以下の予約語があります。

予約語

if、else、while、for、switch、case、default、break、init、define、return、quit、function


予約定数

定数名 意味
PI π
PI2
true ブール値の真
false ブール値の偽
ON スイッチング素子のオン状態
OFF スイッチング素子のオフ状態

数学関数

関数名 意味
sin(x) 正弦
cos(x) 余弦
tan(x) 正接
asin(x) 逆正弦
acos(x) 逆余弦
atan(x) 逆正接
atan2(y,x) y/xの逆正接
sqrt(x) 平方根(ルート)
log(x) 自然対数
log10(x) 常用対数
exp(x) 指数関数
pow(x,y) xのy乗を計算する冪関数
abs(x) 絶対値
min(x,y) 最小値
max(x,y) 最大値
mod(x,y) xをyで割った余りを出す剰余関数
int(x) 64bit整数化

固有のシミュレーションパラメータ

シミュレーションに設定されているパラメータをプログラム上で使用する際に使用します。

パラメータ 名称 param setparam
Fs メイン周波数
Ts メイン周期
t シミュレーション時間 - -
tt 総シミュレーション時間 - -

Note

メイン周波数とメイン周期はシンボル名をFsまたはTsとして持ち、固有パラメータはValueとなります。
例えばparam関数の場合次のように表記します。

MainFreq = param("Fs","Value");
またシミュレーション時間tについてはスクリプト上でそのまま使用することができるパラメータです。

変数tとttの違いについて

時間変数tは,Parameter:Updateすると0クリアされますが、ttは0クリアされず連続的な解析時間を取得することができます。 ttを使用する場合、Parameter:Clearを実行するまで0クリアされない点にご注意ください。


機能関数

関数名 意味
output("sym","type","mode") シンボルsym、タイプtype、モードmodeで指定された出力変数の現在値を返す関数。
PRCとDSPでは、この関数で指定される出力変数が存在しないときは自動的に出力変数が設定され、この関数を削除するとその出力変数も削除される。
自動コード生成時には大域入力変数に置き換えられる。
output("sym", "type", "mode", time) シンボルsym、タイプType、モードmodeで指定された出力変数の時間timeにおける値を返す関数。
param("sym", "par") シンボルsymを持つ素子のparで指定されたパラメーター値を返す関数。
parには、各素子のパラメーターダイアログボックスに表示されているパラメーターシンボルを指定する。
自動コード生成時には大域入力変数に置き替えられる。
setoutvar(var) PRCとDSPにおいて、変数varを出力変数に設定する。
出力変数シンボルは、PRC/DSPのシンボル名にvarのシンボルをピリオド.で連結したシンボルとなり、出力タイプはなく、出力モードはFINとなる。
この関数を削除すると、出力変数も削除される。
setparam("sym", "par", value) シンボルsymを持つ素子のparで指定されたパラメーター値をvalueに設定する関数。
parには、各素子のパラメーターダイアログボックスに表示されているパラメーターシンボルを指定する。
自動コード生成時には大域出力変数に置き替えられる。
setvar("sym", "var", value) シンボルsymを持つPRCまたはDSPの変数名varの値をvalueに設定する関数。
自動コード生成時には大域引数変数に置き替えられるsymが空の場合、自分自身が指定される。
symにVIOを指定すると自動コード生成時には大域引数変数が生成される。
table("sym", xvalue) シンボルsymを持つテーブル素子のx値xvalueに対するy値を返す関数。
詳しくはテーブル素子/TBLを参照してください。
var("sym", "var") シンボルsymを持つPRCまたはDSPの変数名varの値を返す関数。
自動コード生成時には大域引数変数に置き替えられる。
symが空の場合、自分自身が指定される。symにVIOを指定すると自動コード生成時には大域引数変数が生成される。

var関数、setvar関数について

var関数、setvar関数は対象素子がPRCまたはDSPの時のみ使える関数です。
param関数、setparam関数の代わりに使用します。
var関数、setvar関数は以下の機能を持ちます。

  1. 通常書式:x = var("sym","a");
    symの変数aを取得します。
  2. 自身の変数を取得:x = var("","b");
    自身の変数bを取得します。
  3. Cコード用に回路上に存在しない変数を定義:x = ("VIO","a");
    この場合、PRC、またはDSPの実行時には無視されます。
    Cコードにおいては大域変数g_in_VIO_aとして定義されます。
    "VIO"は仮想的なIOデバイスにつけられたシンボルです。変更はできません。

SCALE_CONNECT用関数

関数名 意味
SLexport(n, value) SCALE_CONNECTのn番目の出力ポートに対し、valueを設定する関数。
nは1から始まる整数、valueは任意の変数。
SLsync() SCALE_CONNECTとの同期をとる関数。
SLimport(n) SCALE_CONNECTのn番目の入力ポート値を返す関数。
nは1から始まる整数。

演算子

演算子名 意味
四則演算子 +、-、*、/
余り演算子 %
インクリメント、デクリメント演算子 ++、--
シフト演算子 <<、>>
不等号 <、>、<=、>=
比較演算子 ==、!=
論理演算子 !(NOT)、&&(AND)、||(OR)
ビット論理演算子 ~(NOT)、&(AND)、|(OR)、^(XOR)

変数

全ての変数は、宣言なしで使用でき、型はない。必ずで初期化される。

文末には終端記号の';'をつける。

if文

if (condition) {
  文1
  文2
}
else {
  文3
  文4
}
conditionが真のとき文1、文2を、偽のとき文3、文4を実行する。
else文は省略可能。また、単文のときは{ }は省略可能。

while文

while (condition) {
  文1
  文2
}
conditionが真のときループする。
また、単文のときは{ }は省略可能。

for文

for (init; condition; update) {
  文1
  文2
}
init:初期化文
condition:条件文、真のときループ
update:更新文
単文のときは{ }は省略可能。

switch文

switch (index) {
case const1 : 文1; break;
case const2 : 文2; break;
default : 文3; break;
}
indexが一致するcase文にジャンプする。
default文は必ずcase文の後に記述する。

init文

init {
  文1
  文2
}
プログラムの最初に一回だけ実行される。
{}は省略不可。 init文が実行されるまでの変数の初期値は0となります。

Update後のinit文の実行有無について

プログラムに記載されたinit文は、継続解析Updateのあとのシミュレーション開始時にも、実行されます
初回のシミュレーション時のみ実行したい処理がある場合には、init文ではなく、 if文による実行フラグ管理のようなプログラムを作成してください。

define文

define 定数名 (数または式)
定数を定義する。
定数を変更しようとするとエラーになる。
定数部分の括弧は必ず付ける。
文末の終端記号は不要である。

return文

return;
プログラム実行を終了し解析に戻る。

quit文

quit;
プログラム実行を終了し解析も終了する。

function文

定義

function func() {
  文1
  文2
}
呼び出し
func();
PRCの中で関数を定義することができる。
関数はプログラムの先頭で定義する必要がある。
呼び出しは関数名をFuncとすればFunc();となる。
数内の変数は局所化されており、上記の関数内変数xは、内部ではFunc_xで処理されている。
Cコードでは、Cの関数に置き換えられxは局所変数となる。

以下にfunction文を使用した加算関数の例を記載する。

//function文で加算関数ADDを定義
function ADD(){
  gain = 10;
  OUT  = gain * (IN1 + IN2);
}

setvar("","ADD_IN1",5);   //ADD関数のIN1に5を設定
setvar("","ADD_IN2"10);   //ADD関数のIN2に10を設定
ADD();                    //ADD関数を呼び出し実行;
ans = var("","ADD_OUT");  //結果をADD関数のOUTからansへ取得

コメント

/**/ で文との間にスペースを入れて挟むとコメントとなる。
または、行頭に//を書き、そこから行末までがコメントとなる。

参考

自動コード生成
プログラムエラー