mirror of https://github.com/VLSIDA/OpenRAM.git
59 lines
2.6 KiB
Python
59 lines
2.6 KiB
Python
import debug
|
|
from tech import drc, parameter, spice
|
|
|
|
class logical_effort():
|
|
"""
|
|
Class to support the values behind logical effort. Useful for storing the different components
|
|
such as logical effort, electrical effort, and parasitic delay.
|
|
"""
|
|
beta = parameter["beta"]
|
|
min_inv_cin = 1+beta
|
|
pinv=parameter["min_inv_para_delay"]
|
|
|
|
def __init__(self, name, size, cin, cout, parasitic, out_is_rise=True):
|
|
self.name = name
|
|
self.cin = cin
|
|
self.cout = cout
|
|
self.logical_effort = (self.cin/size)/logical_effort.min_inv_cin
|
|
self.eletrical_effort = self.cout/self.cin
|
|
self.parasitic_scale = parasitic
|
|
self.is_rise = out_is_rise
|
|
|
|
def __str__(self):
|
|
return "Name={}, g={}, h={}, p={}*pinv, rise_delay={}".format(self.name,
|
|
self.logical_effort,
|
|
self.eletrical_effort,
|
|
self.parasitic_scale,
|
|
self.is_rise
|
|
)
|
|
|
|
def get_stage_effort(self):
|
|
return self.logical_effort*self.eletrical_effort
|
|
|
|
def get_parasitic_delay(self, pinv):
|
|
return pinv * self.parasitic_scale
|
|
|
|
def get_stage_delay(self, pinv):
|
|
return self.get_stage_effort()+self.get_parasitic_delay(pinv)
|
|
|
|
def calculate_delays(stage_effort_list, pinv):
|
|
"""Convert stage effort objects to list of delay values"""
|
|
return [stage.get_stage_delay(pinv) for stage in stage_effort_list]
|
|
|
|
def calculate_relative_delay(stage_effort_list, pinv=parameter["min_inv_para_delay"]):
|
|
"""Calculates the total delay of a given delay path made of a list of logical effort objects."""
|
|
total_rise_delay, total_fall_delay = calculate_relative_rise_fall_delays(stage_effort_list, pinv)
|
|
return total_rise_delay + total_fall_delay
|
|
|
|
def calculate_relative_rise_fall_delays(stage_effort_list, pinv=parameter["min_inv_para_delay"]):
|
|
"""Calculates the rise/fall delays of a given delay path made of a list of logical effort objects."""
|
|
debug.info(2, "Calculating rise/fall relative delays")
|
|
total_rise_delay, total_fall_delay = 0,0
|
|
for stage in stage_effort_list:
|
|
debug.info(2, stage)
|
|
if stage.is_rise:
|
|
total_rise_delay += stage.get_stage_delay(pinv)
|
|
else:
|
|
total_fall_delay += stage.get_stage_delay(pinv)
|
|
return total_rise_delay, total_fall_delay
|
|
|