original_docstring: 
          Takes a list of tuples (name, side) and routes them. After routing,
          it removes the old pin and places a new one on the perimeter.
          
docstring: Takes a list of tuples (name, side) and routes them. After routing,
  it removes the old pin and places a new one on the perimeter.
docstring_tokens: Takes a list of tuples ( name side ) and routes them . After routing it removes the old pin and places a new one on the perimeter .
code: def escape_route(self, pin_names):
          """
          Takes a list of tuples (name, side) and routes them. After routing,
          it removes the old pin and places a new one on the perimeter.
          """
          self.create_routing_grid(signal_grid)
  
          start_time = datetime.now()
          self.find_pins_and_blockages(pin_names)
          print_time("Finding pins and blockages",datetime.now(), start_time, 3)
  
          # Order the routes by closest to the perimeter first
          # This prevents some pins near the perimeter from being blocked by other pins
          ordered_pin_names = sorted(pin_names, key=lambda x: self.perimeter_dist(x))
          
          # Route the supply pins to the supply rails
          # Route vdd first since we want it to be shorter
          start_time = datetime.now()
          for pin_name in ordered_pin_names:
              self.route_signal(pin_name)
              # if pin_name == "dout0[1]":
              #     self.write_debug_gds("postroute.gds", True)
              
          print_time("Maze routing pins",datetime.now(), start_time, 3)
  
          # self.write_debug_gds("final_escape_router.gds",False)
          
          return True
code_tokens: def escape_route ( self , pin_names ) : self . create_routing_grid ( signal_grid ) start_time = datetime . now ( ) self . find_pins_and_blockages ( pin_names ) print_time ( "Finding pins and blockages" , datetime . now ( ) , start_time , 3 ) ordered_pin_names = sorted ( pin_names , key = lambda x : self . perimeter_dist ( x ) ) start_time = datetime . now ( ) for pin_name in ordered_pin_names : self . route_signal ( pin_name ) print_time ( "Maze routing pins" , datetime . now ( ) , start_time , 3 ) return True
short_docstring: Takes a list of tuples (name, side) and routes them.
short_docstring_tokens: Takes a list of tuples ( name side ) and routes them .
comment: """
          Takes a list of tuples (name, side) and routes them. After routing,
          it removes the old pin and places a new one on the perimeter.
          """$SEP$# Order the routes by closest to the perimeter first$SEP$# This prevents some pins near the perimeter from being blocked by other pins$SEP$# Route the supply pins to the supply rails$SEP$# Route vdd first since we want it to be shorter$SEP$# if pin_name == "dout0[1]":$SEP$#     self.write_debug_gds("postroute.gds", True)$SEP$# self.write_debug_gds("final_escape_router.gds",False)