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