code: def max_freq(self, tech_in_nm=130, ffoverhead=None):
          
          cp_length = self.max_length()
          scale_factor = 130.0 / tech_in_nm
          if ffoverhead is None:
              clock_period_in_ps = scale_factor * (cp_length + 189 + 194)
          else:
              clock_period_in_ps = (scale_factor * cp_length) + ffoverhead
          return 1e6 * 1.0/clock_period_in_ps
docs: Estimates the max frequency of a block in MHz.
  
          :param tech_in_nm: the size of the circuit technology to be estimated
              (for example, 65 is 65nm and 250 is 0.25um)
          :param ffoverhead: setup and ff propagation delay in picoseconds
          :return: a number representing an estimate of the max frequency in Mhz
  
          If a timing_map has already been generated by timing_analysis, it will be used
          to generate the estimate (and `gate_delay_funcs` will be ignored).  Regardless,
          all params are optional and have reasonable default values.  Estimation is based
          on Dennard Scaling assumption and does not include wiring effect -- as a result
          the estimates may be optimistic (especially below 65nm).