
Добавил:
deadpigeon
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы 1-2 / main
.pyimport numpy as np
import pandas as pd
import re
import sys
class Gate:
capacitance = 0.0
sit = []
coc = []
df_cell_fall = pd.DataFrame()
df_cell_rise = pd.DataFrame()
df_fall_transition = pd.DataFrame()
df_rise_transition = pd.DataFrame()
def __init__(self,name):
flag_sit = 0;
flag_coc = 0;
flag_inv = 0;
flag_capacitance = 0;
flag_cell_fall = 0;
flag_cell_rise = 0;
flag_fall_transition = 0;
flag_rise_transition = 0;
data_cell_fall = []
data_cell_rise = []
data_fall_transition = []
data_rise_trainsition = []
with open('lab1.lib', 'r', encoding='utf-8') as infile:
for line in infile:
# print(line)
# обработка флагов
if (flag_sit):
# строка обрабатывается
sit = line;
# флаг сбрасывается
flag_sit = 0;
if (flag_coc):
coc = line
flag_coc = 0;
if (flag_inv):
if(flag_capacitance):
self.capacitance = float(line);
flag_capacitance = 0;
if(flag_cell_fall):
if(line.strip()!=""):
data_cell_fall.append(line)
else:
flag_cell_fall = 0
if(flag_cell_rise):
if(line.strip()!=""):
data_cell_rise.append(line)
else:
flag_cell_rise = 0
if(flag_fall_transition):
if(line.strip()!=""):
data_fall_transition.append(line)
else:
flag_fall_transition = 0
if(flag_rise_transition):
if(line.strip()!=""):
data_rise_trainsition.append(line)
else:
flag_rise_transition = 0
flag_inv = 0
# выставление флагов
if (re.match('string_input_transtion', line)):
# if (line == 'string_input_transtion \n'):
flag_sit = 1;
if (re.match('column_output_capacitance', line)):
flag_coc = 1;
if (re.match(name, line)):
flag_inv = 1;
if(flag_inv):
if (re.match('capacitance', line)):
flag_capacitance = 1;
if (re.match('cell_fall', line)):
flag_cell_fall = 1;
if (re.match('cell_rise', line)):
flag_cell_rise = 1;
if (re.match('fall_transition', line)):
flag_fall_transition = 1;
if (re.match('rise_transition', line)):
flag_rise_transition = 1;
self.sit = sit.replace("\n", "").split(",")
self.coc = coc.replace("\n", "").split(",")
sit = sit.replace("\n", "").split(",")
coc = coc.replace("\n", "").split(",")
self.df_cell_fall = pd.DataFrame(columns = coc)
self.df_cell_rise = pd.DataFrame(columns = coc)
self.df_fall_transition = pd.DataFrame(columns = coc)
self.df_rise_transition = pd.DataFrame(columns = coc)
for i in data_cell_fall:
self.df_cell_fall.loc[len(self.df_cell_fall.index)] = i.replace("\n", "").split(",")
for i in data_cell_rise:
self.df_cell_rise.loc[len(self.df_cell_rise.index)] = i.replace("\n", "").split(",")
for i in data_fall_transition:
self.df_fall_transition.loc[len(self.df_fall_transition.index)] = i.replace("\n", "").split(",")
for i in data_rise_trainsition:
self.df_rise_transition.loc[len(self.df_rise_transition.index)] = i.replace("\n", "").split(",")
self.df_cell_fall.index = sit[0:len(self.df_cell_fall.index)]
self.df_cell_rise.index = sit[0:len(self.df_cell_rise.index)]
self.df_fall_transition.index = sit[0:len(self.df_fall_transition.index)]
self.df_rise_transition.index = sit[0:len(self.df_rise_transition.index)]
def get_delay(self,edge, tr_in, c_out):
y1 = 0.0
y2 = 0.0
x1 = 0.0
x2 = 0.0
it_index1 = 0
it_index2 = 0
oc_index1 = 0
oc_index2 = 0
if(float(self.sit[0]) > tr_in):
print("Ошибка: введенное значение входной задержки слишком мало")
return -1;
if(float(self.coc[0]) > c_out):
print("Ошибка: введенное значение выходной нагрузки слишком мало")
return -1;
it_diff = abs(float(self.sit[0]) - tr_in)
oc_diff = abs(float(self.coc[0]) - c_out)
for i in self.coc[1:]:
if( abs(float(i) - c_out) < oc_diff):
oc_diff = abs(float(i) - c_out)
oc_index1 = oc_index1 + 1
else:
x1 = float(self.coc[oc_index1])
x2 = float(i)
oc_index2 = oc_index1 + 1
break
if(oc_index1+1 == len(self.coc)):
print("Ошибка: введенное значение выходной нагрузки слишком велико")
return -1;
for i in self.sit[1:]:
if( abs(float(i) - tr_in) < it_diff):
it_diff = abs(float(i) - tr_in)
it_index1 = it_index1 + 1
else:
y1 = float(self.sit[it_index1])
y2 = float(i)
it_index2 = it_index1 + 1
break
if(it_index1+1 == len(self.sit)):
print("Ошибка: введенное значение входной задержки слишком велико")
return -1;
if(edge=='p'):
Q11_delay = self.df_cell_rise.iat[it_index1,oc_index1]
Q12_delay = self.df_cell_rise.iat[it_index2,oc_index1]
Q21_delay = self.df_cell_rise.iat[it_index1,oc_index2]
Q22_delay = self.df_cell_rise.iat[it_index2,oc_index2]
if(edge=='n'):
Q11_delay = self.df_cell_fall.iat[it_index1,oc_index1]
Q12_delay = self.df_cell_fall.iat[it_index2,oc_index1]
Q21_delay = self.df_cell_fall.iat[it_index1,oc_index2]
Q22_delay = self.df_cell_fall.iat[it_index2,oc_index2]
f_R1_delay = (x2 - c_out)/(x2 - x1)*float(Q11_delay) + (c_out - x1)/(x2 - x1)*float(Q21_delay)
f_R2_delay = (x2 - c_out)/(x2 - x1)*float(Q12_delay) + (c_out - x1)/(x2 - x1)*float(Q22_delay)
f_P_delay = (y2 - tr_in)/(y2 - y1)*f_R1_delay + (tr_in - y1)/(y2 - y1)*f_R2_delay
return f_P_delay
def get_transition(self,edge, tr_in, c_out):
y1 = 0.0
y2 = 0.0
x1 = 0.0
x2 = 0.0
it_index1 = 0
it_index2 = 0
oc_index1 = 0
oc_index2 = 0
if(float(self.sit[0]) > tr_in):
print("Ошибка: введенное значение входной задержки слишком мало")
return -1;
if(float(self.coc[0]) > c_out):
print("Ошибка: введенное значение выходной нагрузки слишком мало")
return -1;
it_diff = abs(float(self.sit[0]) - tr_in)
oc_diff = abs(float(self.coc[0]) - c_out)
for i in self.coc[1:]:
if( abs(float(i) - c_out) < oc_diff):
oc_diff = abs(float(i) - c_out)
oc_index1 = oc_index1 + 1
else:
x1 = float(self.coc[oc_index1])
x2 = float(i)
oc_index2 = oc_index1 + 1
break
if(oc_index1+1 == len(self.coc)):
print("Ошибка: введенное значение выходной нагрузки слишком велико")
return -1;
for i in self.sit[1:]:
if( abs(float(i) - tr_in) < it_diff):
it_diff = abs(float(i) - tr_in)
it_index1 = it_index1 + 1
else:
y1 = float(self.sit[it_index1])
y2 = float(i)
it_index2 = it_index1 + 1
break
if(it_index1+1 == len(self.sit)):
print("Ошибка: введенное значение входной задержки слишком велико")
return -1;
if(edge=='p'):
Q11_transition = self.df_rise_transition.iat[it_index1,oc_index1]
Q12_transition = self.df_rise_transition.iat[it_index2,oc_index1]
Q21_transition = self.df_rise_transition.iat[it_index1,oc_index2]
Q22_transition = self.df_rise_transition.iat[it_index2,oc_index2]
if(edge=='n'):
Q11_transition = self.df_fall_transition.iat[it_index1,oc_index1]
Q12_transition = self.df_fall_transition.iat[it_index2,oc_index1]
Q21_transition = self.df_fall_transition.iat[it_index1,oc_index2]
Q22_transition = self.df_fall_transition.iat[it_index2,oc_index2]
f_R1_transition = (x2 - c_out)/(x2 - x1)*float(Q11_transition) + (c_out - x1)/(x2 - x1)*float(Q21_transition)
f_R2_transition = (x2 - c_out)/(x2 - x1)*float(Q12_transition) + (c_out - x1)/(x2 - x1)*float(Q22_transition)
f_P_transition = (y2 - tr_in)/(y2 - y1)*f_R1_transition + (tr_in - y1)/(y2 - y1)*f_R2_transition
return f_P_transition
def propagate(self,edge, tr_in, c_out):
y1 = 0.0
y2 = 0.0
x1 = 0.0
x2 = 0.0
it_index1 = 0
it_index2 = 0
oc_index1 = 0
oc_index2 = 0
if(float(self.sit[0]) > tr_in):
print("Ошибка: введенное значение входной задержки слишком мало")
return -1;
if(float(self.coc[0]) > c_out):
print("Ошибка: введенное значение выходной нагрузки слишком мало")
return -1;
it_diff = abs(float(self.sit[0]) - tr_in)
oc_diff = abs(float(self.coc[0]) - c_out)
for i in self.coc[1:]:
if( abs(float(i) - c_out) < oc_diff):
oc_diff = abs(float(i) - c_out)
oc_index1 = oc_index1 + 1
else:
x1 = float(self.coc[oc_index1])
x2 = float(i)
oc_index2 = oc_index1 + 1
break
if(oc_index1+1 == len(self.coc)):
print("Ошибка: введенное значение выходной нагрузки слишком велико")
return -1;
for i in self.sit[1:]:
if( abs(float(i) - tr_in) < it_diff):
it_diff = abs(float(i) - tr_in)
it_index1 = it_index1 + 1
else:
y1 = float(self.sit[it_index1])
y2 = float(i)
it_index2 = it_index1 + 1
break
if(it_index1+1 == len(self.sit)):
print("Ошибка: введенное значение входной задержки слишком велико")
return -1;
if(edge=='p'):
Q11_delay = self.df_cell_rise.iat[it_index1,oc_index1]
Q12_delay = self.df_cell_rise.iat[it_index2,oc_index1]
Q21_delay = self.df_cell_rise.iat[it_index1,oc_index2]
Q22_delay = self.df_cell_rise.iat[it_index2,oc_index2]
if(edge=='n'):
Q11_delay = self.df_cell_fall.iat[it_index1,oc_index1]
Q12_delay = self.df_cell_fall.iat[it_index2,oc_index1]
Q21_delay = self.df_cell_fall.iat[it_index1,oc_index2]
Q22_delay = self.df_cell_fall.iat[it_index2,oc_index2]
f_R1_delay = (x2 - c_out)/(x2 - x1)*float(Q11_delay) + (c_out - x1)/(x2 - x1)*float(Q21_delay)
f_R2_delay = (x2 - c_out)/(x2 - x1)*float(Q12_delay) + (c_out - x1)/(x2 - x1)*float(Q22_delay)
f_P_delay = (y2 - tr_in)/(y2 - y1)*f_R1_delay + (tr_in - y1)/(y2 - y1)*f_R2_delay
if(edge=='p'):
Q11_transition = self.df_rise_transition.iat[it_index1,oc_index1]
Q12_transition = self.df_rise_transition.iat[it_index2,oc_index1]
Q21_transition = self.df_rise_transition.iat[it_index1,oc_index2]
Q22_transition = self.df_rise_transition.iat[it_index2,oc_index2]
if(edge=='n'):
Q11_transition = self.df_fall_transition.iat[it_index1,oc_index1]
Q12_transition = self.df_fall_transition.iat[it_index2,oc_index1]
Q21_transition = self.df_fall_transition.iat[it_index1,oc_index2]
Q22_transition = self.df_fall_transition.iat[it_index2,oc_index2]
f_R1_transition = (x2 - c_out)/(x2 - x1)*float(Q11_transition) + (c_out - x1)/(x2 - x1)*float(Q21_transition)
f_R2_transition = (x2 - c_out)/(x2 - x1)*float(Q12_transition) + (c_out - x1)/(x2 - x1)*float(Q22_transition)
f_P_transition = (y2 - tr_in)/(y2 - y1)*f_R1_transition + (tr_in - y1)/(y2 - y1)*f_R2_transition
return f_P_delay, f_P_transition
input_transition = 16
output_capacitance = 43
delay = 0.0
transition = 0.0
full_delay = 0.0
gate_NOR = Gate('NOR')
gate_AND = Gate('AND')
gate_INV = Gate('INV')
delay,transition = gate_NOR.propagate('n',input_transition,gate_AND.capacitance)
print("Задержка NOR: "+str(delay)+" Время выходного фронта NOR: "+str(transition))
full_delay+=delay
delay,transition = gate_NOR.propagate('n',transition,gate_INV.capacitance)
print("Задержка AND: "+str(delay)+" Время выходного фронта AND: "+str(transition))
full_delay+=delay
delay,transition = gate_INV.propagate('n',transition,output_capacitance)
print("Задержка INV: "+str(delay)+" Время выходного фронта INV: "+str(transition))
full_delay+=delay
print("Полная задержка: "+str(full_delay))
# test = Gate('INV')
# print(test.get_delay('p',15.1,12.7))
# print(test.get_transition('p',15.1,12.7))
# delay,transition = test.propagate('p',15.1,12.7)
# print(delay)
# print(transition)
# print(test.capacitance)