#はじめに
やりたかったこと。
HSPICEの中から必要なデータを読み取って機械学習などに利用するため行列演算すること。
#DeCiDaライブラリ
DeCiDaというPython3上で動く回路シミュレータライブラリを発見しました。
これを利用するとHSPICEの出力結果ファイルをPython上で読み込むことが可能です。
また、このライブラリを利用すると、DeCiDaから直接回路シミュレータの操作が可能であるっぽいですが、今回はデータ変換のみに利用しました。
#Code
import numpy as np
from scipy import interpolate
from decida.Data import Data
#変数の用意
d_sampling = 0.005
s_sampling = 0
e_sampling = 70
n_sampling = int((e_sampling - s_sampling)/d_sampling + 1)
time_r = np.linspace(s_sampling,e_sampling,n_sampling)
#.tr0ファイルの読み出し
d = Data()
d.read_hspice('xxx.tr0')
rows = d.nrows()
cols = d.ncols()
#必要のない列の消去
leave_cols = [0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,42]
n_leave_cols = len(leave_cols)
for i in range( cols ):
j = cols - i
if not (j in leave_cols) :
d.delete(j)
#d.delete( tuple of col_name )
#Numpy array に変換
original_data = np.empty((n_leave_cols,rows))
for i in range(n_leave_cols):
original_data[i] = d.get(i)
#delete rows which is not change TIME
k = np.zeros(rows-1)
for i in range(rows-1):
j = rows-i-1
if (original_data[0,j] <= original_data[0,j-1] ):
original_data = np.delete(original_data,j,1)
# resamp
def resamp(y):
f = interpolate.interp1d(original_data[0], y, kind='linear')
return f(time_r)
r_data = np.empty((n_leave_cols,n_sampling))
r_data[0] = time_r
r_data[1:] = resamp(original_data[1:])
np.save('rData.npy',r_data)
#コードの説明
DeCiDaのDataクラスを利用することで、HSPICEシミュレート結果をPython上で読み出し、同時に時間軸を等間隔にリサンプリングしています。
###変数の説明
・s_sampling, e_sampling
Spice内のシミュレートの開始時間、終了時間。
・d_sampling
読み出し時のサンプリング間隔。
###データ読み出し
d = Data()
d.read_hspice('xxx.xxx')でデータをdに保管できます。(CSVやNGSpiceに対応したメソッドもあるようです)
###必要のないデータの消去
計算上必要のないデータ配列がありますが(テスト用配線や子モジュールの端子など)、
d.delete(col)
で列を消す操作が可能です。
colは整数値orカラム名で指定可能です。列名タプルを渡すと複数消去することができるようです。(今回はひとつずつ消しています)
また、カラム名と列番号の対応は、d.index("zzz")で取得することができます。
###Numpy array に変換
d.get(col) で入手できます。
DeCiDa自体がNumpy使っているので、for文を回さなくてもできそうなのですが……。マニュアルをそこまで読み込めていないので暫定放置です。
###リサンプリング
HSPICEデータの時間軸が非等間隔(動きの大きなところで細かい)なので、SciPyのinterpolateを利用してリサンプリングを行います。
しかし、同じ時間のデータが複数ある場合があり、そうするとリサンプリングができないため、消去を行います。
そして、補完したデータをNumpyデータとして保存しています。
#まとめ
アナログ回路シミュレータとPythonデータの変換を行うコードを作りました。
現在、Spiceは別で回してその結果からデータを読んでいますが、マニュアルを読む限りDeCiDa自体にSpiceを操作するメソッドもあるので、そちらの利用による効率化を検討したいと思います。