Ce que je voulais faire. Calcul matriciel pour lire les données nécessaires à partir de HSPICE et les utiliser pour l'apprentissage automatique.
J'ai trouvé une bibliothèque de simulateurs de circuits appelée DeCiDa qui fonctionne sur Python3. En utilisant cette bibliothèque, il est possible de faire fonctionner le simulateur de circuit directement à partir de DeCiDa, mais cette fois, il n'a été utilisé que pour la conversion de données.
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)
#read .tr0
d = Data()
d.read_hspice('xxx.tr0')
rows = d.nrows()
cols = d.ncols()
#delete unnecessary cols
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 )
#trans to 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)
Il est possible de lire le résultat de la simulation HSPICE sur Python avec la classe Data de DeCiDa.
・ S_sampling, e_sampling Heure de début et heure de fin de la simulation dans Spice. ・ Échantillonnage D Intervalle d'échantillonnage au moment de la lecture.
d = Data() Les données peuvent être stockées dans d avec d.read_hspice ('xxx.xxx'). Il existe également des méthodes prenant en charge CSV et NGSpice.
Je pense qu'il existe un tableau de données qui n'est pas nécessaire pour le calcul, d.delete(col) Peut être effacé avec. col peut être spécifié sous forme de valeur entière ou de nom de colonne. Vous pouvez effacer plusieurs en passant un taple. (J'avais les noms de colonnes à conserver cette fois, donc je les ai supprimés un par un)
Vous pouvez obtenir le numéro de colonne à partir du nom de la colonne avec d.index ("zzz").
Il est disponible sur d.get (col). Il semble que vous pouvez le faire sans utiliser la phrase for ……. Il semble qu'il puisse être intégré avec la gomme de données inutile dans le chapitre ci-dessus ...
Étant donné que l'axe des temps des données Spice n'est pas uniformément espacé, le rééchantillonnage est effectué avec l'interpolation de SciPy. Cependant, si les données de temps sont embuées, le rééchantillonnage ne peut pas être effectué, donc l'effacement est effectué.
Ensuite, il a été complété et enregistré de manière linéaire en tant que données Numpy.
J'ai expliqué le code pour convertir le simulateur de circuit analogique et les données Python. Actuellement, Spice est tourné séparément et les données sont lues à partir du résultat, mais comme DeCiDa lui-même a une méthode pour faire fonctionner Spice, j'aimerais envisager d'améliorer l'efficacité en l'utilisant.
Recommended Posts