public ArtResult fanout(BrdAbitPin p_pin,interactive.IteraSettings p_settings,int p_ripup_costs,ThreadStoppable p_stoppable){
  if (p_pin.first_layer() != p_pin.last_layer() || p_pin.net_count() != 1) {
    return ArtResult.ALREADY_CONNECTED;
  }
  int pin_net_no=p_pin.get_net_no(0);
  int pin_layer=p_pin.first_layer();
  Set<BrdItem> pin_connected_set=p_pin.get_connected_set(pin_net_no);
  for (  BrdItem curr_item : pin_connected_set) {
    if (curr_item.first_layer() != pin_layer || curr_item.last_layer() != pin_layer) {
      return ArtResult.ALREADY_CONNECTED;
    }
  }
  Set<BrdItem> unconnected_set=p_pin.get_unconnected_set(pin_net_no);
  if (unconnected_set.isEmpty()) {
    return ArtResult.ALREADY_CONNECTED;
  }
  ArtControl ctrl_settings=new ArtControl(this,pin_net_no,p_settings);
  ctrl_settings.is_fanout=true;
  ctrl_settings.stop_remove_fanout_vias=false;
  if (p_ripup_costs >= 0) {
    ctrl_settings.ripup_allowed=true;
    ctrl_settings.ripup_costs=p_ripup_costs;
  }
  SortedSet<BrdItem> ripped_item_list=new TreeSet<BrdItem>();
  ArtEngine a_engine=new ArtEngine(this,pin_net_no,ctrl_settings.trace_clearance_idx,p_stoppable);
  ArtResult result=a_engine.autoroute_connection(pin_connected_set,unconnected_set,ctrl_settings,ripped_item_list);
  if (result == ArtResult.ROUTED) {
    TimeLimitStoppable t_limit=new TimeLimitStoppable(s_PREVENT_ENDLESS_LOOP,p_stoppable);
    changed_area_optimize(NetNosList.EMPTY,p_settings.trace_pullt_min_move,ctrl_settings.trace_costs,t_limit);
  }
  return result;
}

public ArtResult fanout ( BrdAbitPin p_pin , interactive . IteraSettings p_settings , int p_ripup_costs , ThreadStoppable p_stoppable ) { if ( p_pin . first_layer ( ) != p_pin . last_layer ( ) || p_pin . net_count ( ) != 1 ) { return ArtResult . ALREADY_CONNECTED ; } int pin_net_no = p_pin . get_net_no ( 0 ) ; int pin_layer = p_pin . first_layer ( ) ; Set < BrdItem > pin_connected_set = p_pin . get_connected_set ( pin_net_no ) ; for ( BrdItem curr_item : pin_connected_set ) { if ( curr_item . first_layer ( ) != pin_layer || curr_item . last_layer ( ) != pin_layer ) { return ArtResult . ALREADY_CONNECTED ; } } Set < BrdItem > unconnected_set = p_pin . get_unconnected_set ( pin_net_no ) ; if ( unconnected_set . isEmpty ( ) ) { return ArtResult . ALREADY_CONNECTED ; } ArtControl ctrl_settings = new ArtControl ( this , pin_net_no , p_settings ) ; ctrl_settings . is_fanout = true ; ctrl_settings . stop_remove_fanout_vias = false ; if ( p_ripup_costs >= 0 ) { ctrl_settings . ripup_allowed = true ; ctrl_settings . ripup_costs = p_ripup_costs ; } SortedSet < BrdItem > ripped_item_list = new TreeSet < BrdItem > ( ) ; ArtEngine a_engine = new ArtEngine ( this , pin_net_no , ctrl_settings . trace_clearance_idx , p_stoppable ) ; ArtResult result = a_engine . autoroute_connection ( pin_connected_set , unconnected_set , ctrl_settings , ripped_item_list ) ; if ( result == ArtResult . ROUTED ) { TimeLimitStoppable t_limit = new TimeLimitStoppable ( s_PREVENT_ENDLESS_LOOP , p_stoppable ) ; changed_area_optimize ( NetNosList . EMPTY , p_settings . trace_pullt_min_move , ctrl_settings . trace_costs , t_limit ) ; } return result ; }
autoroute from the input pin until the first via , in case the pin and its connected set has only 1 layer . ripup is allowed if p_ripup_costs is > = 0 . returns an enum of type autorouteresult
