1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

HSPICEのデータをPythonで読み込んだ話

Last updated at Posted at 2020-06-26

#はじめに
やりたかったこと。
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を操作するメソッドもあるので、そちらの利用による効率化を検討したいと思います。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?